0°

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

内容预览:
  • 不断去学习,提高个人品质、气质和魅力,这才是值得自己去努力的事情~
  • 二、颜色矩阵 颜色矩阵是一个5*4的矩阵,用来对图片颜色值进行处理~
  • 更复杂一点的还有旋转效果,一个旋转变换矩阵如下: 结果为x’ = xcosθ –...~

始发于微信公众号: 程序员小乐

专注于编程、互联网动态。最终将总结的技术、心得、经验(数据结构与算法、源码分析等)分享给大家,这里不只限于技术!还有职场心得、生活感悟、以及面经点击上方 “程序员小乐” ,选择“置顶公众号”,第一时间送达!


每日英文
don’t corrupted themselves, life is not only an opportunity, try to.
不要堕落了自己,人生并不只有一次机会,努力把握。

乐乐有话说
不要做廉价的自己,不要随意去付出,不要一厢情愿去迎合别人,圈子不同,不必强融!将时间浪费在别人身上,倒不如专心做自己喜欢的事情。不断去学习,提高个人品质、气质和魅力,这才是值得自己去努力的事情。 

阅读目录

  • 基本概念

  • 颜色矩阵

  • 坐标变换矩阵

UI开发过程中,我们经常需要对图片进行处理,常见的如贴图,复杂一些的还有位置变换、旋转、滤镜特效等,下面简单介绍一下关于图片处理的一些基本知识和原理。

一、基本概念

对于图片的处理,最常使用到的数据结构是Bitmap,它包含了一张图片所有的数据,这些数据数据包括那些内容呢?简单说来就是由点阵和颜色值组成的,所谓点阵就是一个在概念上是Width * Height的矩阵,每一个元素对应着图片的一个像素,也就是说,点阵保存着图片的空间位置信息;而颜色值即ARGB,分别对应透明度、红、绿、蓝这四个通道分量,每个通道用8比特定义,所以一个颜色值就是一个int整型,可以表示256256256种颜色值。

Android中我们常用到这么几个常量:ARGB_8888、ARGB_4444、RGB_565。这几个常量其实就是告诉系统如何对图片的颜色值进行处理,例如ARGB_8888是告诉系统透明度、R、G、B在颜色值中分别用8bit表示,这时颜色值为32bit,这样的定义能够表示最多的颜色值,图片质量也是最好的;ARGB_4444则是每个通道用4bit表示,这样颜色值只用16bit,节省了空间,但是却只能表示161616种颜色,也就是说图片很失去很多彩色信息;RGB_565类型的颜色值同样是16bit,但是它丢弃了透明度信息,可以表示326432种颜色值。

二、颜色矩阵

颜色矩阵是一个5*4的矩阵,用来对图片颜色值进行处理。定义颜色矩阵和颜色值如下如下:

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

进行如下矩阵运算:

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

结果R为4*1的矩阵,这个矩阵就是新的颜色值,R中每个通道的值分别如下:

R’ = aR + bG + cB + dA + e;

G’ = fR + gG + hB + iA + j;

B’ = kR + lG + mB + nA + o;

A’ = pR + qG + rB + sA + t;

这样看起来或许很抽象,很难理解颜色矩阵和结果R直接的关系,我们假设颜色矩阵值如下所示:

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

那么结果为:

R’ = R;
G’ = G;
B’ = B;
A’ = A;

也就是说,新的颜色值跟原先的一样!再看一个例子,颜色矩阵取值为:

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

结果为:

R’ = R + 100;
G’ = G + 100;
B’ = B;
A’ = A;

新的颜色值中,红色通道值和绿色通道值分别增加了100,此时图片会泛黄(因为R + G = Yellow)。

从上面的几个例子我们很容易就能明白颜色矩阵中的每个分量(每一列)的意义:

第一行决定红色,
第二行决定绿色,
第三行决定蓝色,
第四行决定了透明度,
第五列是颜色的偏移量。
至此我们应该能理解如何通过颜色矩阵来改变颜色值的各个分量了。

下面是用于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;
   }
三、坐标变换矩阵

对图片的操作除了颜色值的处理外,最常用的就是空间坐标的变换了,常见的效果有平移、旋转、拉伸等,这其实也是通过一个矩阵来完成的。坐标变换矩阵是一个3*3的矩阵,通过与一个类似(X,Y,1)的坐标值的矩阵乘法运算,能够将这个坐标值转换成一个新的坐标值,计算过程如下:

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

结果为:

x’=ax+by+c
y’=dx+ey+f

同颜色矩阵一样,如果坐标变换矩阵如下,则新的坐标值X、Y增加50,也就是说图片的每一点都平移了(50,50)的距离,即图片整体平移到了(50,50)坐标处。

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

如果坐标变换矩阵如下,则所有的X、Y坐标都增大两倍,也就是说图片被放大了两倍,其他缩放效果原理类似。

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

更复杂一点的还有旋转效果,一个旋转变换矩阵如下:

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

结果为x’ = xcosθ – ysinθ 与 y’ = xsinθ + ycosθ,这个结果的效果是绕原点逆时针旋转θ度角。

下面是用于Android的一段示例代码,用于将图片平移,也就是裁剪的效果,其他效果可以参照对应坐标变换矩阵修改即可:

    public static Bitmap test1Bitmap(Bitmap bitmap)
   
{
       Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
               bitmap.getHeight(), Config.RGB_565);
       Canvas canvas = new Canvas(output);
       Paint paint = new Paint();        
       Matrix cm = new Matrix();
       float[] array = {1,0,50,
               0,1,50,
               0,0,1};
       cm.setValues(array);
       canvas.drawBitmap(bitmap, cm, paint);
       return output;
   }

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小乐最好的支持,非常感谢!

如何您想进技术群交流,关注公众号在后台回复 “加群”,或者 “学习” 即可

来自:ian

链接:http://www.icodelogic.com/?p=559

著作权归作者所有,欢迎投稿。

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


推荐阅读






看完本文有收获?请转发分享给更多人
关注「程序员小乐」,提升技能

以上就是:Android图片处理:颜色矩阵和坐标变换矩阵 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论