Android图像色彩处理

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

图像的色调、饱和度、亮度这三个属性在图像处理中的使用非常多。因此在Android中,系统封装了一个类-ColorMatirx。
ColorMatrix colorMatrix = new ColorMatrix();
  • 色调
系统通过public void setRotate (int axis, float degrees)来设置颜色的色调,第一个参数分别用0,1,2来代表Red、Green、Blue三种颜色的处理;第二个参数是设置的色调值
 ColorMatrix colorMatrix = new ColorMatrix();
 colorMatrix.setRotate(0, degrees);
 colorMatrix.setRotate(1, degrees);
 colorMatrix.setRotate(2, degrees);
  • 饱和度
public void setSaturation (float sat) 通过改变矩阵的值设置图像的饱和度 参数0对应灰色图像,1对应没改变
  • 亮度
public void setScale (float rScale, float gScale, float bScale, float aScale) 设置矩阵的R,G,B,A等变量到对应的倍数。当三原色以相同的比例进行混合的时候,就会显示出白色,当亮度为0时图像就变成黑色

除了单独的使用上面的三种方式来进行颜色效果的处理之外,还有矩阵的乘法运算。系统提供了postConcat()方法来讲矩阵的作用效果混合,从而叠加处理效果:
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对象传递进去,并使用这个画笔来绘制原来的图像,从而将颜色矩阵作用的原图中











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值