黑白老照片、泛黄旧照片、高对比度等效果

在Android中,对图像进行颜色方面的处理,,如黑白老照片、泛黄旧照片、高对比度、低饱和度等效果,都可以通过使用颜色矩阵(ColorMatrix)来实现。

1.颜色矩阵(ColorMatrix)介绍

  颜色矩阵M是一个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 颜色矩阵M

  在一张图片中,图像的RGBA(红色、绿色、蓝色、透明度)值决定了该图片所呈现出来的颜色效果。而图像的RGBA值则存储在一个5*1的颜色分量矩阵C中,由颜色分量矩阵C可以控制图像的颜色效果。颜色分量矩阵C如图2所示。

图2 颜色分量矩阵C

  要想改变一张图片的颜色效果,只需要改变图像的颜色分量矩阵即可。通过颜色矩阵可以很方便的修改图像的颜色分量矩阵。假设修改后的图像颜色分量矩阵为C1,则有如图3所示的颜色分量矩阵计算公式。

图3 颜色分量矩阵计算公式

  由此可见,通过颜色矩阵修改了原图像的RGBA值,从而达到了改变图片颜色效果的目的。并且,通过如图3所示的运算可知,颜色矩阵M的第一行参数abcde决定了图像的红色成分,第二行参数fghij决定了图像的绿色成分,第三行参数klmno决定了图像的蓝色成分,第四行参数pqrst决定了图像的透明度,第五列参数ejot是颜色的偏移量。

  通常,改变颜色分量时可以通过修改第5列的颜色偏移量来实现,如图4所示的颜色矩阵M1,通过计算后可以得知该颜色矩阵的作用是使图像的红色分量和绿色分量均增加100,这样的效果就是图片泛黄(因为红色与绿色混合后得到黄色)。

图4 颜色矩阵M1

  除此之外,也可以通过直接对颜色值乘以某一系数而达到改变颜色分量的目的。如图5所示的颜色矩阵M2,将绿色分量放大了2倍,这样的效果就是图片泛绿色。

图5 颜色矩阵M2

2.图像颜色处理实例

  了解了颜色矩阵的工作原理之后,我们就可以使用颜色矩阵对图片进行处理了。   布局代码:   

=========”.MainActivity” >11 12<TextView13==”R” />16 17<SeekBar18====”128″ />23 24<TextView25==”G” />28 29<SeekBar30====”128″ />35 36<TextView37==”B” />40 41<SeekBar42====”128″ />47 48<TextView49==”A” />52 53<SeekBar54====”128″ />59 60<ImageView61===”@drawable/painter” />65 66 </LinearLayout>复制代码

实现代码:

1 package cn.bgxt.colormatrixdemo; android.os.Bundle; 4 import android.util.Log; 5 import android.widget.ImageView; 6 import android.widget.SeekBar; 7 import android.widget.SeekBar.OnSeekBarChangeListener; 8 import android.app.Activity; 9 import android.graphics.Bitmap;10 import android.graphics.BitmapFactory;11 import android.graphics.Canvas;12 import android.graphics.ColorMatrix;13 import android.graphics.ColorMatrixColorFilter;14 import android.graphics.Matrix;15 import android.graphics.Paint;{18private SeekBar sb_red, sb_green, sb_blue,sb_alpha;19private ImageView iv_show;20private Bitmap afterBitmap;21private Paint paint;22private Canvas canvas;23private Bitmap baseBitmap;(Bundle savedInstanceState) {27super.onCreate(savedInstanceState);28setContentView(R.layout.activity_main);29 30iv_show = (ImageView) findViewById(R.id.iv_show);31sb_red = (SeekBar) findViewById(R.id.sb_red);32sb_green = (SeekBar) findViewById(R.id.sb_green);33sb_blue = (SeekBar) findViewById(R.id.sb_blue);34sb_alpha = (SeekBar) findViewById(R.id.sb_alpha);3536sb_red.setOnSeekBarChangeListener(seekBarChange);37sb_green.setOnSeekBarChangeListener(seekBarChange);38sb_blue.setOnSeekBarChangeListener(seekBarChange);39sb_alpha.setOnSeekBarChangeListener(seekBarChange);baseBitmap = BitmapFactory.decodeResource(getResources(),43R.drawable.painter);afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth(),46baseBitmap.getHeight(), baseBitmap.getConfig());47canvas = new Canvas(afterBitmap);48paint = new Paint();49}SeekBar.OnSeekBarChangeListener seekBarChange = new OnSeekBarChangeListener() {(SeekBar seekBar) {progressR = sb_red.getProgress()/128f;57float progressG = sb_green.getProgress()/128f;58float progressB = sb_blue.getProgress()/128f;59float progressA=sb_alpha.getProgress()/128f;60Log.i(“main”, “R:G:B=”+progressR+”:”+progressG+”:”+progressB);[] src = new float[]{63progressR, 0, 0, 0, 0, 640, progressG, 0, 0, 0,650, 0, progressB, 0, 0, 660, 0, 0, progressA, 0};ColorMatrix colorMatrix = new ColorMatrix();69colorMatrix.set(src);paint.setColorFilter(new ColorMatrixColorFilter(src));canvas.drawBitmap(baseBitmap, new Matrix(), paint);74iv_show.setImageBitmap(afterBitmap);75}(SeekBar seekBar) {79}(SeekBar seekBar, int progress,83boolean fromUser) {84}85};86 }

效果图:

android把彩色图像变成灰度图(黑白)人生就像是一场旅行,遇到的既有感人的,

黑白老照片、泛黄旧照片、高对比度等效果

相关文章:

你感兴趣的文章:

标签云: