Android图片处理:颜色矩阵和坐标变换矩阵

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;
 }
相关文章
相关标签/搜索