这篇博客将会通过对像素的RGB分量做一个处理,然后达到一些特效。并没有很高端大气的代码。也没用使用ImageFilter等一些库。多数参考了别人,大神勿喷。
首先看一下今天的效果图。
由于上传大小限制的关系,只有一小部分。当然,功能中除了光晕,其他都是实现了的。如果可以的话,我回上传到github上gif图。代码请在文末下载。那么接下来,我们就来看下如何实现这些。
再次声明,绝大多数是操作像素实现的。速度上可能会很慢。不过不要紧,要的是思想。
由于代码太多的原因,下面只会给出关键性代码,更多代码请前往github。
- 图片灰度化
灰度化原理:当前像素值=0.3r+0.59g+0.11b
灰度化我在这里用2中方法实现的。一种是操作ColorMatrix,另一种是颜色分量处理。代码如下
public Bitmap doPro(Bitmap src) {
int width,height;
height = src.getHeight();
width = src.getWidth();
Bitmap bitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
paint.setColorFilter(filter);
canvas.drawBitmap(src, 0, 0, paint);
return bitmap;
}
关于ColorMatrix,参考官方文档。
@Override
public Bitmap doProByPix(Bitmap src) {
int width = src.getWidth();
int height = src.getHeight();
//创建像素点数组
int[] pixels = new int[width*height];
int alpha,grey,red,green,blue;
src.getPixels(pixels,0,width,0,0,width,height);
alpha = 0xFF<<24;
for (int i = 0 ; i < height ; i++){
for (int j = 0 ; j < width ; j++){
grey = pixels[width*i+j];
red = ((grey & 0x00FF0000)>>16);
green = ((grey & 0x0000FF00)>>8);
blue = ((grey & 0x000000FF));
grey = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11);
grey = alpha | (grey<<16)|(grey<<8)|grey;
pixels[width*i+j]=grey;
}
}
Bitmap pro = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);
pro.setPixels(pixels,0,width,0,0,width,height);
return pro;
}
上面这个通过对颜色的 与,左移,右移来拿到颜色分量,当然,也有更简单的方法拿到分离,后面会说。
- 对亮度/饱和度/对比度的操作
这里的操作就会用到颜色矩阵,颜色矩阵,我并不会多说。如果感兴趣就取查看官方文档。这并不是重点
public Bitmap doPro(Bitmap src) {
int width = src.getWidth();
int height = src.getHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
ColorMatrix colorMatrix = new ColorMatrix();
//设置饱和度 设置为0.7 范围 0 - 1
//colorMatrix.setSaturation((float) 0.7);
//设置亮度
colorMatrix.set(new float[]{
1,0,0,0,70,
0,1,0,0,70,
0,0,1,0,70,
0,0,0,