欢迎来真孝善网,为您提供真孝善正能量书籍故事!

Android平台上的图像特效处理技术解析

时间:11-08 神话故事 提交错误

各位老铁们,大家好,今天由我来为大家分享Android平台上的图像特效处理技术解析,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

圆角

灰白处理

public static Bitmap toGrayscale(Bitmap bmpOriginal) { int width, height;高度=bmpOriginal.getHeight();宽度=bmpOriginal.getWidth();位图bmpGrayscale=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);画布c=new Canvas(bmpGrayscale);油漆油漆=new Paint(); ColorMatrix cm=new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter f=new ColorMatrixColorFilter(cm); Paint.setColorFilter(f) ; c.drawBitmap(bmpOriginal, 0, 0, 油漆);返回bmp 灰度; }

它使用ColorMatrix 类附带的setSaturation() 方法来设置饱和度。然而,其方法内部实现的更深层次是通过使用颜色矩阵的乘法来实现的。

输出效果:

gray

黑白处理

public static Bitmap toHeibai(Bitmap mBitmap) { int mBitmapWidth=0; int mBitmapHeight=0; mBitmapWidth=mBitmap.getWidth(); mBitmapHeight=mBitmap.getHeight();位图bmpReturn=Bitmap.createBitmap(mBitmapWidth, mB itmapHeight, Bitmap.Config.ARGB_8888); int iPixel=0; for (int i=0; i mBitmapWidth; i++) { for (int j=0; j mBitmapHeight; j++) { int curr_color=mBitmap.getPixel(i, j); } int avg=(Color.red(curr_color) + Color.green(curr_color) + Color.blue(curr_color))/3; if (avg=100) { iPixel=255; } 否则{ iPixel=0; int modif_color=Color.argb(255, iPixel, iPixel, iPixel); bmpReturn.setPixel(i, j, modif_color);返回bmpReturn; }

阈值变换。其实看图片效果就可以知道。这张图片与经过灰白处理的图片不同。不同的是,灰白色处理中虽然没有颜色,但是黑白层次依然存在,而这张图片连层次都没有,只有两种截然不同的黑白颜色。实现的算法也非常简单。每个像素的RGB 值被平均。如果高于100,则被认为是白色,如果低于100,则被认为是黑色。

输出效果:

黑白

镜像处理

public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) { Final int ReflectionGap=4; int 宽度=bitmap.getWidth(); int height=bitmap.getHeight();矩阵矩阵=new Matrix();矩阵.preScale(1,-1);位图reflectionImage=Bitmap.createBitmap(位图, 0, 高度/2, 宽度, 高度/2, 矩阵, false);位图bitmapWithReflection=Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);画布canvas=new Canvas(bitmapWithReflection); canvas.drawBitmap(位图, 0, 0, null);绘制deafalutPaint=new Paint(); canvas.drawRect(0, 高度, 宽度, 高度+ 反射间隙, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, 高度+reflectionGap, null);油漆油漆=new Paint(); LinearGradient 着色器=new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + ReflectionGap,0x70ffffff,0x00ffffff , TileMode.CLAMP);油漆.setShader(着色器); //在paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN))中将传输模式设置为porter duff和目的地; //使用带有线性渐变的paint绘制一个矩形canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()+ ReflectionGap, Paint);返回带反射的位图; }

只需反转原始图片,调整其颜色以创建反射效果,然后将两张图片添加在一起即可。

输出效果:

镜像

泛黄处理

public static Bitmap testBitmap(Bitmap bitmap) { 位图输出=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.RGB_565);画布画布=新画布(输出);油漆油漆=new Paint(); ColorMatrix cm=new ColorMatrix(); float[] 数组={1,0,0,0,50, 0,1,0,0,50, 0,0,1,0,0, 0,0,0,1,0};厘米.set(数组);油漆.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(位图, 0, 0, 绘画);返回输出; }

其实每张图片的存储就是每个像素点的rgba值,对其进行操作时,它的四个值定位在一个5行1列的矩阵中,最后一行值为1。这样,用矩阵来操作确实方便很多。矩阵乘法可以轻松地按比例或通过加法来增加或减少某些或所有分量。比如有一张现有的图片,每个点的rgba值为{100,100,100,255},就是整张灰度图片。我们希望红色的部分增加一倍,剩下的部分增加十。你可以将它的值虚拟成一个五行一列的矩阵:{100, 100,100,255,1},然后让这个矩阵:{2,0,0,0,0,wrap 0,1,0,0,10,换行0,0,1, 0,10 换行0,0,0,1,10} 相乘。获取{200,110,100,100}。这种泛黄照片处理算法的原理就是将每个像素的rg值增加50,将rg值混合得到黄色。

输出效果:

泛黄

哈哈镜处理

jintArray Java_com_spore_meitu_jni_ImageUtilEngine_toHahajing (JNIEnv* env,jobject thiz, jintArray buf, jint 宽度, jint 高度,jint centerX, jint centerY, jint 半径, jfloat multiple) { jint * cbuf; cbuf=(*env)-GetIntArrayElements(env, buf, 0); int newSize=宽度* 高度; jint rbuf[newSize]; float xishu=多个; int real_radius=(int)(半径/xishu);整数i=0,j=0; for (i=0; i 宽度; i++) { for (j=0; j 高度; j++) { int curr_color=cbuf[j * 宽度+ i]; } int pixR=红色(curr_color); int pixG=绿色(curr_color); int pixB=蓝色(curr_color); int pixA=alpha(curr_color); int newR=pixR; int newG=pixG; int newB=pixB; int newA=pixA; int 距离=(int) ((centerX - i) * (centerX - i) + (centerY - j) * (centerY - j)); if (距离半径* 半径) { int src_x=(int) ((float) (i - centerX)/xishu); int src_y=(int) ((float) (j - centerY)/xishu); src_x=(int)(src_x * (sqrt(距离)/real_radius)); src_y=(int)(src_y * (sqrt(距离)/real_radius)); src_x=src_x + centerX; src_y=src_y + centerY; int src_color=cbuf[src_y * 宽度+ src_x]; newR=红色(src_color); newG=绿色(src_color); newB=蓝色(src_color); newA=alpha(src_color); newR=min(255, max(0, newR)); newG=min(255, max(0, newG)); newB=min(255, max(0 , newB)); newA=min(255, max(0, newA)); int modif_color=ARGB(newA, newR, newG, newB); rbuf[j * 宽度+ i]=modif_color; jintArray 结果=(*env)-NewIntArray(env, newSize); (*env)-SetIntArrayRegion(env, 结果, 0, newSize, rbuf); (*env) -ReleaseIntArrayElements(env, buf, cbuf, 0);返回结果; }

根据魔镜的半径,以中心点为圆心,对各个像素点的坐标进行位移和扩展。越接近中心点,膨胀越大。

输出效果:

哈哈镜像

放大镜处理

jintArray Java_com_spore_meitu_jni_ImageUtilEngine_toFangdajing (JNIEnv* env,jobject thiz, jintArray buf, jint 宽度, jint 高度,jint centerX, jint centerY, jint 半径, jfloat multiple) { jint * cbuf; cbuf=(*env)-GetIntArrayElements(en v , buf, 0); int newSize=宽度* 高度; jint rbuf[newSize]; float xishu=多个; int real_radius=(int)(半径/xishu);整数i=0,j=0; for (i=0 ; i 宽度; i++) { for (j=0; j 高度; j++) { int curr_color=cbuf[j * 宽度+ i]; } int pixR=红色(curr_color); int pixG=绿色(curr_color); int pixB=蓝色(curr_color); int pixA=alpha(curr_color); int newR=pixR; int newG=pixG; int newB=pixB; int newA=pixA; int 距离=(int) ((centerX - i) * (centerX - i ) + (centerY - j) * (centerY - j)); if (距离半径* 半径) { int src_x=(int)((float)(i - centerX)/xishu + centerX); int src_y=(int) ((float)(j - centerY)/xishu + centerY); int src_color=cbuf[src_y * 宽度+ src_x]; newR=红色(src_color); newG=绿色(src_color); newB=蓝色(src_color); newA=alpha(src_color); newR=min(255, max(0, newR)); newG=min(255, max(0, newG)); newB=min(255, max(0, newB)); newA=min(255, max(0, newA)); int modif_color=ARGB(newA, newR, newG, newB); rbuf[j * 宽度+ i]=modif_color; jintArray 结果=(*env)-NewIntArray(env , newSize); (*env)-SetIntArrayRegion(env, 结果, 0, newSize, rbuf); (*env)-ReleaseIntArrayElements(env, buf, cbuf, 0);返回结果; }

浮雕处理

public static Bitmap toFuDiao(Bitmap mBitmap) { int mBitmapWidth=0; int mBitmapHeight=0; mBitmapWidth=mBitmap.getWidth(); mBitmapHeight=mBitmap.getHeight();位图bmpReturn=Bitmap.createBitmap(mBitmapWidth, mBitmap Height, Bitmap .Config.RGB_565); int 预着色=0; int prepreColor=0; preColor=mBitmap.getPixel(0, 0); for (int i=0; i mBitmapWidth; i++) { for (int j=0; j mBitmapHeight; j++) { int curr_color=mBitmap.getPixel(i, j); } int r=Color.red(curr_color) - Color.red(prepreColor) +127; int g=Color.green(curr_color) - Color.red(prepreColor) + 127; int b=Color.green(curr_color) - Color.blue(prepreColor) + 127; int a=Color.alpha(curr_color); int modif_color=Color.argb(a, r, g, b); bmp返回。 setPixel(i, j, modif_color);预预颜色=预颜色; preColor=curr_color; Canvas c=new Canvas(bmpReturn);油漆油漆=new Paint(); ColorMatrix cm=new ColorMatrix(); cm.setSaturation(0) ; ColorMatrixColorFilter f=new ColorMatrixColorFilter(cm);油漆.setColorFilter(f); c.drawBitmap(bmpReturn, 0, 0, 绘画);返回bmp返回; }

其实浮雕的特点就是在颜色有跳跃的地方刻出痕迹。 127、127、127为深灰色,与石材的颜色相似。此颜色用作此处的背景颜色。算法是用前一个点的rgba值减去当前点的rgba值,然后加上127,得到当前点的颜色。

输出效果:

emboss

底片处理

jintArray Java_com_spore_meitu_jni_ImageUtilEngine_toDipian (JNIEnv* env,jobject thiz, jintArray buf, jint 宽度, jint 高度) { jint * cbuf; cbuf=(*env)-GetIntArrayElements(env, buf, 0); int newSize=宽度* 高度for (i=0; i 宽度; i++) { for (j=0; j 高度; j++) { int curr_color=cbuf[j * 宽度+ i]; } int r=255 - 红色(curr_color); int g=255 - 绿色(curr_color); int b=255 - 蓝色(curr_color); int a=alpha(curr_color); int modif_color=ARGB(a, r, g, b); rbuf[j * 宽度+ i]=modif_color; jintArray 结果=(*env)-NewIntArray(env, newSize); (*env)-SetIntArrayRegion(env, 结果, 0, newSize, rbuf); (*env)-ReleaseIntArrayElements(env, buf, cbuf, 0);返回结果; }

输出效果:

油画处理

public static Bitmap toYouHua(Bitmap bmpSource) { Bitmap bmpReturn=Bitmap.createBitmap(bmpSource.getWidth(), bmpSource.getHeight(), Bitmap.Config.RGB_565);整数颜色=0;整数无线电=0; int 宽度=bmpSource.getWidth(); int height=bmpSource.getHeight();随机rnd=new Random(); int iModel=10; int i=宽度- iModel; while (i 1) { int j=高度- iModel; while (j 1) { int iPos=rnd.nextInt(100000) % iModel;颜色=bmpSource.getPixel(i + iPos, j + iPos); bmpReturn.setPixel(i, j, 颜色); j=j - 1; } i=i - 1;返回bmpReturn; }

因为油画是用毛笔画的,用彩笔画的时候,就没有那么精确,应该在这一点的颜色会滑到另一点。算法的实现是取一定范围内的随机数,每个点的颜色就是该点减去随机数坐标得到的坐标的颜色。

输出效果:

如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

▼遗忘那段似水年华

学习一下这篇文章的话,我就能自己给照片加滤镜了!

    有9位网友表示赞同!

予之欢颜

想试试把自己的APP里加入一些酷炫的特效,这篇文章应该可以帮上忙

    有20位网友表示赞同!

有恃无恐

用Android做图像处理真的很牛逼,这个文章能让我了解更多先进的技术。

    有15位网友表示赞同!

酒笙倾凉

现在手机拍照功能越来越强大,这些特效算法也是一大亮点!

    有8位网友表示赞同!

像从了良

感觉图片处理的算法越来越复杂了,这篇文章应该内容很深奥的样子

    有18位网友表示赞同!

■□丶一切都无所谓

之前只是用自带的滤镜,没想到还有这么多高级的处理方法。

    有9位网友表示赞同!

寻鱼水之欢

Android开发一直是我的兴趣,学习一些图像特效相关的知识能提升我的技能水平。

    有15位网友表示赞同!

陌颜

不知道这篇文章里提到的算法能不能应用到游戏画面上?

    有18位网友表示赞同!

煮酒

想了解一下这些特效算法到底是如何实现的,这个文章应该里有解释。

    有14位网友表示赞同!

泪湿青衫

我有一款APP想要添加一些视觉效果,这篇文章应该能给我一些灵感!

    有14位网友表示赞同!

追忆思域。

学习图像处理算法很有挑战性,但我很期待能掌握这些知识!

    有20位网友表示赞同!

强辩

通过文章学习一些新技术,能让我成为一个更全面fledged 的Android开发人员。

    有19位网友表示赞同!

哥帅但不是蟋蟀

我想探索一下Android在图像特效处理方面的可能性,这篇文章是个很好的起点。

    有6位网友表示赞同!

见朕骑妓的时刻

现在手机摄影越来越流行,掌握这些算法可以制作出更令人惊艳的照片!

    有9位网友表示赞同!

無極卍盜

感觉图片特效处理是一门门艺术,学习起来一定会很有意思!

    有11位网友表示赞同!

孤单*无名指

希望这篇文章能给我一些实用的技巧,让我能更好地运用图像特效算法。

    有6位网友表示赞同!

逾期不候

我想了解一下这些常见的图像特效算法有哪些优缺点,以便更好地选择使用。

    有14位网友表示赞同!

鹿叹

用Android来实现图像特效处理,应该比其他平台更加方便!

    有14位网友表示赞同!

【Android平台上的图像特效处理技术解析】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活