Android对图像的处理一般都是针对Bitmap来处理的,bitmap中整个图片都是由点阵和颜色组成的,点阵就是像素的矩阵,每一个元素对应着图片的一个像素。而颜色值就是ARGB,我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值
说白了就ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位,
ARGB_8888就是由4个8位组成即32位,
RGB_565就是R为5位,G为6位,B为5位共16位
一、色彩矩阵分析
对图像进行颜色方面的处理,通过使用颜色矩阵(ColorMatrix)来实现。从而可以达到很多特效如黑白老照片、泛黄旧照片等等。
Android中的颜色矩阵是一个5*4的矩阵,它用来对图片的色彩进行处理。如图1所示。在Android中,颜色矩阵M是以一维数组m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]的方式进行存储的。
图1
在一张图片中,图像的RGBA(红色、绿色、蓝色、透明度)值决定了该图片所呈现出来的颜色效果。
而图像的RGBA值则存储在一个5*1的颜色分量矩阵C中,由颜色分量矩阵C可以控制图像的颜色效果。颜色分量矩阵C如图2所示。
图2
要想改变一张图片的颜色效果,只需要改变图像的颜色分量矩阵即可。通过颜色矩阵可以很方便的修改图像的颜色分量矩阵。假设修改后的图像颜色分量矩阵为C1,则有如图3所示的颜色分量矩阵计算公式。
图3
由此可见,通过颜色矩阵修改了原图像的RGBA值,从而达到了改变图片颜色效果的目的。并且,通过如图3所示的运算可知,颜色矩阵M的第一行参数abcde决定了图像的红色成分,第二行参数fghij决定了图像的绿色成分,第三行参数klmno决定了图像的蓝色成分,第四行参数pqrst决定了图像的透明度,第五列参数ejot是颜色的偏移量。
通常,改变颜色分量时可以通过修改第5列的颜色偏移量来实现,如图4所示的颜色矩阵M1,通过计算后可以得知该颜色矩阵的作用是使图像的红色分量和绿色分量均增加100,这样的效果就是图片泛黄(因为红色与绿色混合后得到黄色)。
图4
除此之外,也可以通过直接对颜色值乘以某一系数而达到改变颜色分量的目的。如图5所示的颜色矩阵M2,将绿色分量放大了2倍,这样的效果就是图片泛绿色。
图5
二、ColorMatrix
ColorMatrix colorMatrix = new ColorMatrix();
- 色调
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setRotate(0, degrees);
colorMatrix.setRotate(1, degrees);
colorMatrix.setRotate(2, degrees);
- 饱和度
- 亮度
private static Bitmap handleImageEffect(Bitmap bm, float degrees, float stauration, float scale) {
Bitmap bitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
ColorMatrix degreesMatrix = new ColorMatrix();
degreesMatrix.setRotate(0, degrees);
degreesMatrix.setRotate(1, degrees);
degreesMatrix.setRotate(2, degrees);
ColorMatrix staurationMatrix = new ColorMatrix();
staurationMatrix.setSaturation(stauration);
ColorMatrix sacleMatrix = new ColorMatrix();
sacleMatrix.setScale(scale, scale, scale, 1);
ColorMatrix imageMatrix = new ColorMatrix();
imageMatrix.postConcat(degreesMatrix);
imageMatrix.postConcat(staurationMatrix);
imageMatrix.postConcat(sacleMatrix);
paint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));
canvas.drawBitmap(bm, 0, 0, paint);
return bitmap;
}
Android系统不允许直接修改原图,类似于ps众的锁定,必须通过原图创建一个同样大小的bitmap,并将原图绘制到该bitmap中。在设置好处理的颜色矩阵后,通过Paint类的setColorFilter方法将通过imageMatrix构造的ColorMatrixColorFilter对象传递进去,并使用这个画笔来绘制原来的图像,从而将颜色矩阵作用的原图中