Android中的Matrix类与ColorMatrix类

简介: Android中的Matrix类与ColorMatrix类

1.Matrix.


Android API中有一个Matirx类,当在现有位图对象上进行绘制或从另一个位图对象创建某个位图对象时,可以使用该类。这个类可以让我们对位图进行旋转、裁剪、缩放、平移等操作。


Matrix类是以9个float型数字的一维数组表示的。每个数字都对应于图像上每个点的3个坐标(x,y或z)之一。

Matrix matrix = new Matrix();
matrix.setValues(new float[] { 
1, 0, 0, 
0, 1, 0,
0, 0, 1 });

顶行(1,0,0)指定源图像的x坐标将根据以下公式转换:x=1*x+0*y+0*z。即顶行总会影响到目标图像的x坐标,但可以操作源图像的x,y,z坐标。


同理,第二行和第三行将影响目标图像的y和z坐标。


Matrix类有以下成员方法:


setRotate(), setScale(), setTranslate(), 而这几种方法还有个字之前之后的版本(preScale(), postRotate(), postTranslate()...),这使得我们可以每次按顺序完成一个以上的转换。


2.ColorMatrix


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


同样,ColorMatrix也是一个浮点数数组,可以对图像的像素进行操作。然后不同于操作x, y和z坐标,它操作的是颜色值——每个像素的RGBA值。


ColorMatrix的使用方式:

ColorMatrix cm = new ColorMatrix();
paint.setColorFilter(new ColorMatrixColorFilter(cm));

即构建一个ColorMatrixColorFilter对象,并将它应用于Paint对象,从而使得ColorMatrix对象可以用来改变Canvas对象上的绘制内容。

如上默认的ColorMatrix是不会改变图像的,因为它形如:


1,0,0,0,0


0,1,0,0,0


0,0,1,0,0


0,0,0,1,0


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


而与每行相乘的数字中,第一个数字是与像素的红色值相关联的乘数,第二个是绿色相关联,第三个是蓝色相关联,第四个是与Alpha相关联,而最后一个数字不与任何值相乘。


例如,如果想改变图像的对比度和亮度可以这样操作:

ColorMatrix cm = new ColorMatrix();
int contrast=2;
int brightness=-25;
cm.set(new float[] { 
  contrast, 0, 0, 0, brightness, 
  0, contrast, 0, 0, brightness, 
  0, 0, contrast, 0, brightness,
  0, 0, 0, 1, 0 });
//cm.setSaturation(.5f);//改变饱和度
paint.setColorFilter(new ColorMatrixColorFilter(cm));
目录
相关文章
|
21天前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
16 1
|
2天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
5 0
|
29天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
17 2
|
6月前
|
Android开发
Android 分享机顶盒项目的封装类《GridView》(二)(转)
Android 分享机顶盒项目的封装类《GridView》(二)(转)
47 2
|
3月前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
25 0
|
5月前
|
安全 Android开发 Kotlin
Android面试题之Kotlin的几种常见的类
这篇文章探讨了Kotlin编程语言中的初始化顺序、延迟初始化、惰性初始化、`lateinit`与`by lazy`的区别、初始化注意事项、继承、嵌套类、数据类、单例类和枚举类的使用,以及密封类的概念。文中通过示例代码详细解释了各种特性,并提醒读者关注初始化顺序和线程安全问题。同时,鼓励读者关注作者的公众号“AntDream”获取更多相关文章。
41 1
|
6月前
|
XML Java Android开发
Android 分享机顶盒项目的封装类《GridView》(三)(转)
Android 分享机顶盒项目的封装类《GridView》(三)(转)
37 2
|
6月前
|
Java 开发工具 Android开发
如何访问 android系统hide的类或接口
如何访问 android系统hide的类或接口
243 1
|
6月前
|
XML Java Android开发
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
647 1
|
6月前
|
缓存 Android开发
Android——application全局类的使用
Android——application全局类的使用