UI开发过程当中,咱们常常须要对图片进行处理,常见的如贴图,复杂一些的还有位置变换、旋转、滤镜特效等,下面简单介绍一下关于图片处理的一些基本知识和原理。java
1 基本概念
对于图片的处理,最常使用到的数据结构是Bitmap,它包含了一张图片全部的数据,这些数据数据包括那些内容呢?简单说来就是由点阵和颜色值组成的,所谓点阵就是一个在概念上是Width * Height的矩阵,每个元素对应着图片的一个像素,也就是说,点阵保存着图片的空间位置信息;而颜色值即ARGB,分别对应透明度、红、绿、蓝这四个通道份量,每一个通道用8比特定义,因此一个颜色值就是一个int整型,能够表示256*256*256种颜色值。web
Android中咱们经常使用到这么几个常量:ARGB_888八、ARGB_444四、RGB_565。这几个常量其实就是告诉系统如何对图片的颜色值进行处理,例如ARGB_8888是告诉系统透明度、R、G、B在颜色值中分别用8bit表示,这时颜色值为32bit,这样的定义可以表示最多的颜色值,图片质量也是最好的;ARGB_4444则是每一个通道用4bit表示,这样颜色值只用16bit,节省了空间,可是却只能表示16*16*16种颜色,也就是说图片很失去不少彩色信息;RGB_565类型的颜色值一样是16bit,可是它丢弃了透明度信息,能够表示32*64*32种颜色值。canvas
2 颜色矩阵
颜色矩阵是一个5*4的矩阵,用来对图片颜色值进行处理。定义颜色矩阵和颜色值以下以下:数据结构
进行以下矩阵运算:
结果R为4*1的矩阵,这个矩阵就是新的颜色值,R中每一个通道的值分别以下:
R’ = a*R + b*G + c*B + d*A + e;
G’ = f*R + g*G + h*B + i*A + j;
B’ = k*R + l*G + m*B + n*A + o;
A’ = p*R + q*G + r*B + s*A + t;spa
这样看起来或许很抽象,很难理解颜色矩阵和结果R直接的关系,咱们假设颜色矩阵值以下所示:code
那么结果为:
R’ = R;
G’ = G;
B’ = B;
A’ = A;
也就是说,新的颜色值跟原先的同样!再看一个例子,颜色矩阵取值为:
结果为:
R’ = R + 100;
G’ = G + 100;
B’ = B;
A’ = A;
新的颜色值中,红色通道值和绿色通道值分别增长了100,此时图片会泛黄(由于R + G = Yellow)。orm
从上面的几个例子咱们很容易就能明白颜色矩阵中的每一个份量(每一列)的意义:
第一行决定红色,
第二行决定绿色,
第三行决定蓝色,
第四行决定了透明度,
第五列是颜色的偏移量。
至此咱们应该能理解如何经过颜色矩阵来改变颜色值的各个份量了。图片
下面是用于Android的一段代码,用于将图片处理成泛黄的效果:开发
public static Bitmap testBitmap(Bitmap bitmap) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.RGB_565); Canvas canvas = new Canvas(output); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); float[] array = { 1, 0, 0, 0, 100, 0, 1, 0, 0, 100, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }; cm.set(array); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(bitmap, 0, 0, paint); return output; }