2014-11-8Android学习------ColorMatrix使用方法--------动画Animation学习篇


 图像处理

另一种图像编辑或处理的形式是必须处理像素自身颜色值的变化。这将使得我们能够改变对比度、亮度、整体色调等。

3.4.1  ColorMatrix

类似于在Canvas对象上绘制时使用Matrix对象的方法,也可以使用一个ColorMatrix对象来改变用于在Canvas对象上绘制的Paint对象。

同样,ColorMatrix以类似的方式工作。它是一个数字数组,可以对图像的像素进行操作。然而不同于操作x、y和z坐标,它操作颜色值--每个像素的Red(红)、Green(绿)、Blue(蓝)和Alpha值。

通过调用其没有任何参数的构造函数,我们可以构建一个默认的ColorMatrix对象。

  
  
  
  
  1. ColorMatrix cm = new ColorMatrix(); 

使用ColorMatrix对象构建一个ColorMatrixColorFilter对象,并将它应用于Paint对象,从而使得这个ColorMatrix对象可用来改变Canvas对象上的绘制内容。
  
  
  
  
  1. paint.setColorFilter(new ColorMatrixColorFilter(cm)); 

为了能够对ColorMatrix对象进行实验,可以简单地将它插入到"选择图片"示例中的绘图部分。
  
  
  
  
  1. Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().  
  2. openInputStream(imageFileUri), null, bmpFactoryOptions);  
  3. Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(),  
  4. bmp.getHeight(),bmp.getConfig());  
  5. Canvas canvas = new Canvas(alteredBitmap);  
  6. Paint paint = new Paint();  
  7.  
  8.  
  9. ColorMatrix cm = new ColorMatrix();  
  10.  
  11. paint.setColorFilter(new ColorMatrixColorFilter(cm));  
  12.  
  13. Matrix matrix = new Matrix();  
  14. canvas.drawBitmap(bmp, matrix, paint);  
  15. alteredImageView.setImageBitmap(alteredBitmap);  
  16. chosenImageView.setImageBitmap(bmp); 

默认的ColorMatrix对象就是所谓的标识,就像默认的Matrix对象一样,当应用它时不会改变图像。查看以下这个数组所包含的内容将帮助我们理解它如何工作。
  
  
  
  
  1. 1 0 0 0 0  
  2. 0 1 0 0 0  
  3. 0 0 1 0 0  
  4. 0 0 0 1 0 

这是一个包含了20个浮点数的数组。第一行包含了在单个像素的红色部分上发生的操作,第二行影响绿色部分,第三行操作蓝色部分,而最后一行操作像素的Alpha值。

在每一行中,第一个数字是与像素的红色值相关联的乘数,第二个数字是与绿色值相关联的乘数,第三个数字与蓝色相关,第四个数字与Alpha值相关,而最后一个数字不会与任何值相乘。将这些值都加起来以改变它们正在操作的像素。

假设现在有一个中等灰度的像素,其红色值是128,蓝色值是128,绿色值是128,Alpha值为0(它是不透明的)。如果通过上面的颜色矩阵来操作这个像素,那么数学公式将看起来如下所示:

  
  
  
  
  1. 新的红色值= 1 * 128 + 0 * 128 + 0 * 128 + 0 * 0 + 0  
  2. 新的蓝色值= 0 * 128 + 1 * 128 + 0 * 128 + 0 * 0 + 0  
  3. 新的绿色值= 0 * 128 + 0 * 128 + 1 * 128 + 0 * 0 + 0  
  4. 新的Alpha值= 0 * 128 + 0 * 128 + 0 * 128 + 1 * 0 + 0 

所有的值都将保持不变,设置为128。对于用于像素的任何颜色变量,情况都将如此,因为每一行在操作代表它的颜色的位置都有一个1,而在其他位置均为0。

如果只想让一幅图像看起来比之前红两倍,那么可以将操作所有像素的红色值的数字增加为2以替换1。这将使矩阵中的红色值翻倍。

  
  
  
  
  1. 2 0 0 0 0  
  2. 0 1 0 0 0  
  3. 0 0 1 0 0  
  4. 0 0 0 1 0 

为了在代码中实现这个功能,可以执行如下操作:
  
  
  
  
  1. ColorMatrix cm = new ColorMatrix();  
  2. cm.set(new float[] {  
  3.      2, 0, 0, 0, 0,  
  4.      0, 1, 0, 0, 0,  
  5.      0, 0, 1, 0, 0,  
  6.      0, 0, 0, 1, 0 });  
  7. paint.setColorFilter(new ColorMatrixColorFilter(cm)); 

相应地,可以通过该矩阵对任何颜色进行类似的处理。

3.4.2  改变对比度和亮度

可以通过增加或减少颜色值来调整图像的亮度和对比度。

以下代码将对每个颜色通道的强度加倍,其将影响到图像的亮度和对比度,如图3-15所示。

  
  
  
  
  1. ColorMatrix cm = new ColorMatrix();  
  2. float contrast = 2;  
  3. cm.set(new float[] {  
  4.      contrast, 0, 0, 0, 0,  
  5.      0, contrast, 0, 0, 0,  
  6.      0, 0, contrast, 0, 0,  
  7.      0, 0, 0, 1, 0 });  
  8. paint.setColorFilter(new ColorMatrixColorFilter(cm)); 
2014-11-8Android学习------ColorMatrix使用方法--------动画Animation学习篇_第1张图片 
图3-15  ColorMatrix对象中每
个颜色的强度都加倍,提高了亮度和对比度

在这个示例中,两个效果是相链接的。如果只想增加对比度而不增加亮度,那么实际上必须降低亮度来补偿在颜色强度方面的增加。

通常,当调整亮度时,对每种颜色只使用矩阵的最后一列会更加简单。这仅仅是添加到颜色值的量,而无须乘以已有的颜色值。

因此,为了降低亮度,可以使用矩阵代码如下。

  
  
  
  
  1. ColorMatrix cm = new ColorMatrix();  
  2. float brightness = -25;  
  3. cm.set(new float[] {  
  4.      1, 0, 0, 0, brightness,  
  5.      0, 1, 0, 0, brightness,  
  6.      0, 0, 1, 0, brightness,  
  7.      0, 0, 0, 1, 0 });  
  8. paint.setColorFilter(new ColorMatrixColorFilter(cm));  

将这两种转换合在一起将产生如下代码。
  
  
  
  
  1. ColorMatrix cm = new ColorMatrix();  
  2.  
  3. float contrast = 2;  
  4. float brightness = -25;  
  5. cm.set(new float[] {  
  6.      contrast, 0, 0, 0, brightness,  
  7.      0, contrast, 0, 0, brightness,  
  8.      0, 0, contrast, 0, brightness,  
  9.      0, 0, 0, contrast, 0 });  
  10. paint.setColorFilter(new ColorMatrixColorFilter(cm)); 

此操作的结果如图3-16所示。
 
图3-16  ColorMatrix对象
中每个颜色的强度都加
倍但亮度减少,以影响对比度而不改变亮度

3.4.3  改变饱和度

幸运的是,无须知道每个想要完成的操作所对应的公式。例如,ColorMatrix类有一个内置的方法可用于改变饱和度。

  
  
  
  
  1. ColorMatrix cm = new ColorMatrix();  
  2. cm.setSaturation(.5f);  
  3. paint.setColorFilter(new ColorMatrixColorFilter(cm)); 

传入一个大于1的数字将增加饱和度,而传入一个0~1之间的数字会减少饱和度。0值将产生一幅灰度图像。

原文地址:http://book.51cto.com/art/201203/325117.htm

感谢那些无私分享的网友

你可能感兴趣的:(android,Matrix)