Android图片处理(Matrix,ColorMatrix)

合集下载

内参矩阵的使用

内参矩阵的使用

内参矩阵的使用内参矩阵是在图像处理和计算机视觉领域中常用的一种技术。

它是一种用来衡量图像的亮度、对比度和颜色信息的矩阵。

内参矩阵的使用可以帮助我们更好地理解和分析图像,并在图像处理过程中提供有价值的信息。

本文将介绍内参矩阵的定义、作用和使用方法。

内参矩阵是指相机的内部参数矩阵,也称为相机矩阵。

它是一个3x3的矩阵,其中包含了相机的焦距、主点位置和图像的旋转和平移信息。

通过内参矩阵,我们可以计算出图像中每个像素点的真实世界坐标,从而实现图像到现实世界的映射。

内参矩阵在计算机视觉和图像处理中的应用非常广泛。

首先,内参矩阵可以用于相机标定。

相机标定是指确定相机的内部参数和外部参数的过程,其中内参矩阵就是相机的内部参数之一。

通过相机标定,我们可以得到准确的内参矩阵,从而提高图像处理的精度和准确性。

内参矩阵可以用于图像纠正。

在拍摄过程中,相机可能会产生畸变,如径向畸变和切向畸变。

通过内参矩阵,我们可以对图像进行畸变校正,使得图像中的直线保持直线,圆形保持圆形,从而提高图像的质量和准确性。

内参矩阵还可以用于图像的特征提取和匹配。

在计算机视觉中,特征提取是指从图像中提取出具有独特性质的点或区域,以用于后续的图像处理和分析。

通过内参矩阵,我们可以将图像坐标转换为世界坐标,从而实现对图像中特征点的准确提取和匹配。

在使用内参矩阵时,我们需要注意几个关键点。

首先,内参矩阵的计算需要相机标定的数据,包括相机拍摄的多组图像和相应的真实世界坐标。

其次,内参矩阵的计算需要使用特定的算法,如点对点对应法、直线对应法等。

最后,内参矩阵的使用需要结合其他的图像处理技术和算法,如图像增强、边缘检测、图像分割等。

内参矩阵的使用在图像处理和计算机视觉领域中具有重要的意义。

它可以帮助我们更好地理解和分析图像,并在图像处理过程中提供有价值的信息。

通过相机标定和图像校正,内参矩阵可以提高图像处理的精度和准确性。

通过特征提取和匹配,内参矩阵可以实现对图像中特征点的准确提取和匹配。

matrix.scalem 偏移量的理解

matrix.scalem 偏移量的理解

标题:深度解析 matrix.scalem 偏移量的理解一、引言在计算机图形学中,矩阵是起着非常重要作用的数学工具。

而在Android 开发中,matrix 类中的 scalem 方法更是被广泛运用于图形的变换和绘制中。

本文将深入探讨 matrix.scalem 方法中的偏移量,以期帮助读者更全面、深刻地理解该方法。

二、matrix.scalem 方法概述在 Android 的开发中,matrix 类主要用于对图像进行变换。

其中,matrix.scalem 方法用于对图像进行缩放的变换。

其方法签名为:```public boolean scalem (float[] m, int mOffset, float x, float y,float z)```其中,m 为原始的变换矩阵,mOffset 表示矩阵中偏移的位置,x、y、z 分别表示在对应轴上的缩放因子。

三、偏移量的理解在 matrix.scalem 方法中,偏移量指的是 mOffset 参数,它表示了矩阵中的偏移位置。

在实际使用中,我们需要确保偏移量的正确性,以避免对矩阵的修改错误。

理解偏移量是十分重要的。

偏移量的正确性意味着在对矩阵进行缩放变换时,能够正确地定位到需要进行缩放的部分。

如果我们希望对图像的某个特定区域进行缩放,就需要确保偏移量指向该区域在矩阵中的位置,以保证缩放效果的准确性。

四、对 matrix.scalem 方法的理解与实践在实际开发中,我们可以通过以下步骤来正确地理解和使用matrix.scalem 方法中的偏移量:1. 确定需要进行缩放的图像或区域,并理解其在矩阵中的位置;2. 在调用 matrix.scalem 方法时,将正确的偏移量传入,以确保缩放操作作用于预期的图像或区域;3. 结合其他变换方法,如平移、旋转等,综合运用 matrix 类中的方法,以实现更加复杂的图形变换。

通过实践,我们能够更加深入地理解 matrix.scalem 方法中偏移量的作用,并且能够灵活地运用于实际的图形变换中。

pixelcopy 用法

pixelcopy 用法

pixelcopy 用法Pixelcopy 是一个用于在 Android 应用程序中进行位图复制和像素操作的实用工具类。

它提供了一些便捷的方法,让开发者能够轻松地复制、修改和处理位图上的像素数据。

首先,要使用 Pixelcopy,需要在 Android 设备上运行 Android 8.0(API 级别26)或更高版本的系统。

Pixelcopy 提供了以下几个主要的用法:1. 复制位图:使用 Pixelcopy,开发者可以轻松地复制一个位图。

只需将目标位图和源位图(要复制的位图)作为参数传递给 Pixelcopy.request() 方法即可。

一旦操作完成,复制后的位图将存储在目标位图中,可以对其进行进一步的操作。

2. 获取像素数据:Pixelcopy 允许开发者获取位图上指定区域内的像素数据。

通过调用Pixelcopy.request() 方法,并传递目标位图、源位图和要复制的区域作为参数,可以快速获取指定区域的像素数据。

返回的像素数据可以用于分析、处理或展示。

3. 修改像素数据:使用 Pixelcopy,可以修改位图上像素的颜色值。

通过获取位图的像素数据,可以对每个像素进行操作,例如更改颜色、应用滤镜效果或进行其他图像处理操作。

修改像素数据后,可以通过将修改后的像素数组重新应用到位图上来更新位图的外观。

总的来说,Pixelcopy 是一个有用的工具,可帮助开发者在 Android 应用程序中进行位图复制和像素操作。

它提供了简单且易于使用的 API,使开发者能够快速复制、获取和修改位图上的像素数据。

如果你需要在应用程序中进行位图处理或图像分析,Pixelcopy 是一个值得考虑的选择。

Android部分手机拍照后获取的图片被旋转问题的解决方法

Android部分手机拍照后获取的图片被旋转问题的解决方法

Android部分⼿机拍照后获取的图⽚被旋转问题的解决⽅法调⽤Android系统拍照功能后,三星⼿机拍摄后的照⽚被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。

其它品牌的⼿机都是正常的,就三星出现这个怪事。

在Android适配上,我原来⼀直以为国内的⼩⽶⼿机够奇葩了,结果还有更奇葩的!你说你没事旋转照⽚⼲啥,实在是猜不透其居⼼何在,纯粹是在给开发者制造⿇烦啊!解决办法是获取到拍照后照⽚被旋转的⾓度,再旋转回去就好了。

具体思路:1、⾸先在调⽤拍照⽅法时,保存拍照后的相⽚原图,得到原图路径,(PhotoBitmapUtils是我⾃⼰写的⼀个⼯具类)String fileName = "";/*** 启动相机拍照*/private void addBitmapShoots() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 设置图⽚要保存的根路径+⽂件名fileName = PhotoBitmapUtils.getPhotoFileName(getContext());File file = new File(fileName);if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));startActivityForResult(intent, OPEN_CAMERA);}2、在获取相机返回的回调⽅法onActivityResult()中,修复被旋转的图⽚并取得修复后的图⽚路径,有了这个路径后就可以展⽰出来了@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 获取相机拍照返回if (resultCode == Activity.RESULT_OK && requestCode == OPEN_CAMERA) {// 得到修复后的照⽚路径String filepath = PhotoBitmapUtils.amendRotatePhoto(fileName, getContext());}}PhotoBitmapUtils类:/*** 集合⼀些图⽚⼯具** Created by zhuwentao on 2016-07-22.*/public class PhotoBitmapUtils {/*** 存放拍摄图⽚的⽂件夹*/private static final String FILES_NAME = "/MyPhoto";/*** 获取的时间格式*/public static final String TIME_STYLE = "yyyyMMddHHmmss";/*** 图⽚种类*/public static final String IMAGE_TYPE = ".png";// 防⽌实例化private PhotoBitmapUtils() {}/*** 获取⼿机可存储路径** @param context 上下⽂* @return ⼿机可存储路径*/private static String getPhoneRootPath(Context context) {// 是否有SD卡if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)|| !Environment.isExternalStorageRemovable()) {// 获取SD卡根⽬录return context.getExternalCacheDir().getPath();} else {// 获取apk包下的缓存路径return context.getCacheDir().getPath();}}/*** 使⽤当前系统时间作为上传图⽚的名称** @return 存储的根路径+图⽚名称*/public static String getPhotoFileName(Context context) {File file = new File(getPhoneRootPath(context) + FILES_NAME);// 判断⽂件是否已经存在,不存在则创建if (!file.exists()) {file.mkdirs();}// 设置图⽚⽂件名称SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault()); Date date = new Date(System.currentTimeMillis());String time = format.format(date);String photoName = "/" + time + IMAGE_TYPE;return file + photoName;}/*** 保存Bitmap图⽚在SD卡中* 如果没有SD卡则存在⼿机中** @param mbitmap 需要保存的Bitmap图⽚* @return 保存成功时返回图⽚的路径,失败时返回null*/public static String savePhotoToSD(Bitmap mbitmap, Context context) {FileOutputStream outStream = null;String fileName = getPhotoFileName(context);try {outStream = new FileOutputStream(fileName);// 把数据写⼊⽂件,100表⽰不压缩press(pressFormat.PNG, 100, outStream);return fileName;} catch (Exception e) {e.printStackTrace();return null;} finally {try {if (outStream != null) {// 记得要关闭流!outStream.close();}if (mbitmap != null) {mbitmap.recycle();}} catch (Exception e) {e.printStackTrace();}}}/*** 把原图按1/10的⽐例压缩** @param path 原图的路径* @return 压缩后的图⽚*/public static Bitmap getCompressPhoto(String path) {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = false;options.inSampleSize = 10; // 图⽚的⼤⼩设置为原来的⼗分之⼀Bitmap bmp = BitmapFactory.decodeFile(path, options);options = null;return bmp;}/*** 处理旋转后的图⽚* @param originpath 原图路径* @param context 上下⽂* @return 返回修复完毕后的图⽚路径*/public static String amendRotatePhoto(String originpath, Context context) {// 取得图⽚旋转⾓度int angle = readPictureDegree(originpath);// 把原图压缩后得到Bitmap对象Bitmap bmp = getCompressPhoto(originpath);;// 修复图⽚被旋转的⾓度Bitmap bitmap = rotaingImageView(angle, bmp);// 保存修复后的图⽚并返回保存后的图⽚路径return savePhotoToSD(bitmap, context);}/*** 读取照⽚旋转⾓度** @param path 照⽚路径* @return ⾓度*/public static int readPictureDegree(String path) {int degree = 0;try {ExifInterface exifInterface = new ExifInterface(path);int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) {case ExifInterface.ORIENTATION_ROTATE_90:degree = 90;break;case ExifInterface.ORIENTATION_ROTATE_180:degree = 180;break;case ExifInterface.ORIENTATION_ROTATE_270:degree = 270;break;}} catch (IOException e) {e.printStackTrace();}return degree;}/*** 旋转图⽚* @param angle 被旋转⾓度* @param bitmap 图⽚对象* @return 旋转后的图⽚*/public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {Bitmap returnBm = null;// 根据旋转⾓度,⽣成旋转矩阵Matrix matrix = new Matrix();matrix.postRotate(angle);try {// 将原始图⽚按照旋转矩阵进⾏旋转,并得到新的图⽚returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);} catch (OutOfMemoryError e) {}if (returnBm == null) {returnBm = bitmap;}if (bitmap != returnBm) {bitmap.recycle();}return returnBm;}}在调⽤修复图⽚⾓度⽅法的时候需要注意,现在的⼿机像素越来越⼤,拍完后⼀张照⽚有近10M,所以我们需要对图⽚进⾏压缩处理。

android透明度原理

android透明度原理

android透明度原理
Android 中的透明度原理涉及到图形处理和界面渲染的相关知识。

在 Android 中,透明度是通过颜色的 alpha 通道来控制的,alpha 通道的取值范围是 0 到 255,其中 0 表示完全透明,255 表示完全不透明。

Android 中的透明度原理主要涉及到以下几个方面:
1. 图形处理,在 Android 中,绘制图形和控件时,可以通过设置颜色的 alpha 通道来控制透明度。

比如,可以使用 ARGB (Alpha、Red、Green、Blue)来表示颜色,其中 Alpha 通道就是用来表示透明度的。

2. 界面渲染,在界面渲染过程中,系统会根据设置的透明度来混合不同的图层,从而实现整体界面的透明效果。

这涉及到了界面的层叠和混合计算,以及硬件加速和 GPU 渲染等技术。

3. XML 属性,在 Android 的布局文件中,可以通过设置控件的 alpha 属性来控制透明度,这样可以在不修改代码的情况下实现界面元素的透明效果。

总体来说,Android 中的透明度原理是通过控制颜色的 alpha
通道来实现的,涉及到图形处理、界面渲染和 XML 属性等多个方面。

这种透明度原理的实现方式能够让开发者灵活地控制界面元素的透
明效果,从而实现更加丰富多彩的界面设计。

android bitmap修改饱和度原理

android bitmap修改饱和度原理

android bitmap修改饱和度原理在Android中修改位图(Bitmap)的饱和度,实际上是通过对位图的每个像素进行处理来改变图像的颜色饱和度。

要理解具体的操作原理,我们需要了解以下几个概念和算法:色彩模型、色彩空间转换,以及调整饱和度的算法。

一、色彩模型和色彩空间转换:1. 色彩模型:色彩模型是指用于描述和表示色彩的方式,常见的有RGB(红绿蓝)、CMYK(青、品红、黄、黑)和HSV(色调、饱和度、明度)等。

在Android中,位图以RGB色彩模型来存储图像的像素信息。

2. 色彩空间转换:色彩空间转换是指将一个色彩模型转换为另一个色彩模型的过程。

在修改位图的饱和度之前,我们需要将RGB色彩模型转换为HSV色彩模型。

HSV色彩模型中的H分量表示色调(0-360度),S分量表示饱和度(0-1),V分量表示明度(0-1)。

二、调整饱和度的算法:1. RGB转HSV算法:RGB转HSV的算法如下:```float r, g, b;float h, s, v;float max = max(r, max(g, b)); float min = min(r, min(g, b));v = max; // 明度float delta = max - min;if (max != 0) {s = delta / max; // 饱和度} else {s = 0;h = -1;return;}if (delta == 0) {h = 0;} else {if (r == max) {h = (g - b) / delta; // 色调} else if (g == max) {h = 2 + (b - r) / delta;} else {h = 4 + (r - g) / delta;}h *= 60;if (h < 0) {h += 360;}}```2. 修改饱和度算法:修改饱和度的算法如下:```float h, s, v; // HSV分量float saturation; // 饱和度增量s += saturation; // 调整饱和度if (s > 1) {s = 1;} else if (s < 0) {s = 0;}```三、位图修改饱和度的原理:根据上述算法,我们可以通过对位图的每个像素进行遍历和修改来改变位图的饱和度。

android hwc service的处理流程

android hwc service的处理流程

android hwc service的处理流程Android HWC Service的处理流程概述Android HWC(Hardware Composer)Service是Android系统中负责处理图形合成和显示的重要组件之一。

它负责接收来自应用程序和系统服务的请求,将图形元素合成为最终的图像帧,并通过硬件接口将图像显示到屏幕上。

本文将详细说明Android HWC Service的处理流程。

流程一:接收请求在Android系统中,应用程序和系统服务通过SurfaceFlinger将图形请求发送给HWC Service。

HWC Service会按照请求的先后顺序接收并处理这些请求。

流程二:合成图像HWC Service将接收到的多个图形请求进行合成,生成最终的图像帧。

图像合成过程包括以下几个步骤: - 图层排序:根据每个图层的显示顺序和属性,对所有图层进行排序,确定它们在最终图像中的叠放次序。

- 图层合成:将排序后的图层依次合成到一个缓冲区中。

在合成过程中,HWC Service可能会使用硬件加速功能,例如GPU加速,以提高合成效率。

- 混合模式:根据每个图层的设置,将它们合成到最终图像中,并应用相应的混合模式,例如正常混合、透明混合等。

流程三:交给显示引擎合成完成后,HWC Service将最终的图像帧交给显示引擎,通过硬件接口将图像显示到屏幕上。

流程四:VSync同步为了保证图像显示的流畅性,Android系统采用了VSync(垂直同步)机制。

HWC Service会监听VSync信号,并在信号到来时将当前的图像帧发送到显示引擎,以进行显示。

这样,图像的更新频率将与显示设备的刷新率保持同步,避免出现画面撕裂等问题。

结论通过以上的流程,Android HWC Service可以高效地处理图形合成和显示任务,确保应用程序和系统界面在屏幕上的流畅显示。

了解HWC Service的处理流程对于开发者来说是非常重要的,可以帮助他们优化图形渲染和图层合成的性能,提升用户体验。

Android应用使用WebP格式优化图片资源

Android应用使用WebP格式优化图片资源

Android应用使用WebP格式优化图片资源Android应用的用户界面中通常包含大量的图片资源,而这些图片资源对应用的性能和用户体验有着重要的影响。

在过去的几年中,WebP格式作为一种高效的图片压缩格式受到了广泛的关注和应用。

本文将介绍WebP格式的特点和优势,并探讨在Android应用中如何使用WebP格式来优化图片资源。

一、什么是WebP格式WebP是一种由Google开发的用于图像压缩的格式,它旨在提供更高的压缩率同时保持较高的图像质量。

WebP格式的一个特点是它支持有损和无损压缩,并提供了透明度和动画的支持。

与传统的图片格式如JPEG和PNG相比,WebP格式可以实现更小的文件大小,从而减少网络传输和存储成本。

二、WebP格式的优势1. 更高的压缩率:WebP格式相比JPEG和PNG可以实现更高的压缩率,这意味着可以使用更少的存储空间来保存同样质量的图片。

对于网络传输来说,WebP格式可以减少带宽的使用,提高加载速度和用户体验。

2. 较高的图像质量:尽管WebP格式实现了较高的压缩率,但它仍然可以保持相对较高的图像质量。

这意味着应用中的图片资源可以以更小的文件大小展示出更清晰、更细腻的效果,提高用户对应用的好感度。

3. 透明度和动画的支持:WebP格式支持透明度和动画的处理,这对于一些需要展示动态效果或者需要透明背景的图片资源尤为重要。

通过使用WebP格式,开发者可以实现更灵活、更多样化的界面设计。

三、使用WebP格式优化图片资源在Android应用中使用WebP格式优化图片资源可以通过以下几个步骤进行:1. 转换图片格式:将原有的图片资源转换为WebP格式。

可以使用一些图片编辑软件或者在线转换工具来完成这一步骤。

转换的过程中需要注意选择合适的压缩率和质量设置,以保证转换后的图片在文件大小和清晰度之间达到一个平衡。

2. 适配WebP格式:在应用中使用转换后的WebP格式图片资源。

Android系统从Android 4.0(API level 14)开始正式支持WebP格式,开发者可以直接在布局文件或者代码中引用WebP格式的图片资源。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。

这些效果在android中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以完美的做出上面的所说的效果。

下面将分别介绍这两个矩阵的用法和相关的函数。 颜色矩阵 android中可以通过颜色矩阵(ColorMatrix类)方面的操作颜色,颜色矩阵是一个5x4 的矩阵(如图1.1)

可以用来方面的修改图片中RGBA各分量的值,颜色矩阵以一维数组的方式存储如下: [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ] 他通过RGBA四个通道来直接操作对应颜色,如果会使用Photoshop就会知道有时处理图片通过控制RGBA各颜色通道来做出特殊的效果。

这个矩阵对颜色的作用计算方式如1.3示:

矩阵的运算规则是矩阵A的一行乘以矩阵C的一列作为矩阵R的一行, C矩阵是图片中包含的ARGB信息,R矩阵是用颜色矩阵应用于C之后的新的颜色分量,运算结果如下:

R' = a*R + b*G + c*B + d*A + e; G' = f*R + g*G + h*B + i*A + j; B' = k*R + l*G + m*B + n*A + o; A' = p*R + q*G + r*B + s*A + t;

颜色矩阵并不是看上去那么深奥,其实需要使用的参数很少,而且很有规律第一行决定红色第二行决定绿色 第三行决定蓝色,第四行决定了透明度,第五列是颜色的偏移量。下面是一个实际中使用的颜色矩阵。

如果把这个矩阵作用于各颜色分量的话,R=A*C,计算后会发现,各个颜色分量实际上没有任何的改变(R'=R G'=G B'=B A'=A)。

图1.5所示矩阵计算后会发现红色分量增加100,绿色分量增加100, 这样的效果就是图片偏黄,因为红色和绿色混合后得到黄色,黄色增加了100,图片当然就偏黄了。

改变各颜色分量不仅可以通过修改第5列的颜色偏移量也可如上面矩阵所示将对应的颜色值乘以一个倍数,直接放大。

上图1.6是将绿色分量乘以2变为原来的2倍。相信读者至此已经明白了如何通过颜色矩阵来改变各颜色分量。

下面编写一段代码来,通过调整颜色矩阵来获得不同的颜色效果,JavaCode如下: 复制到剪贴板 Java代码

1 CMatrix类: 2 public class CMatrix extends Activity { 3 4 private Button change; 5 private EditText [] et=new EditText[20]; 6 private float []carray=new float[20]; 7 private MyImage sv; 8 @Override 9 public void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.main); 12 13 change=(Button)findViewById(R.id.set); 14 sv=(MyImage)findViewById(R.id.MyImage); 15 16 for(int i=0;i<20;i++){ 17 18 et[i]=(EditText)findViewById(R.id.indexa+i); 19 carray[i]=Float.valueOf(et[i].getText().toString()); 20 } 21 22 change.setOnClickListener(l); 23 } 24 25 private Button.OnClickListener l=new Button.OnClickListener(){ 26 27 @Override 28 public void onClick(View arg0) { 29 // TODO Auto-generated method stub 30 getValues(); 31 sv.setValues(carray); 32 sv.invalidate(); 33 } 34 35 }; 36 public void getValues(){ 37 for(int i=0;i<20;i++){ 38 39 carray[i]=Float.valueOf(et[i].getText().toString()); 40 } 41 42 } 43 44 45 } 46 MyImage类继承自View类: 47 public class MyImage extends View { 48 private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 49 private Bitmap mBitmap; 50 private float [] array=new float[20]; 51 52 private float mAngle; 53 54 public MyImage(Context context,AttributeSet attrs) { 55 super(context,attrs); 56 57 mBitmap = BitmapFactory.decodeResource(context.getResources(), 58 R.drawable.test); 59 invalidate(); 60 } 61 62 63 public void setValues(float [] a){ 64 for(int i=0;i<20;i++){ 65 array[i]=a[i]; 66 } 67 68 } 69 70 @Override protected void onDraw(Canvas canvas) { 71 Paint paint = mPaint; 72 73 74 75 paint.setColorFilter(null); 76 canvas.drawBitmap(mBitmap, 0, 0, paint); 77 78 ColorMatrix cm = new ColorMatrix(); 79 //设置颜色矩阵 80 cm.set(array); 81 //颜色滤镜,将颜色矩阵应用于图片 82 paint.setColorFilter(new ColorMatrixColorFilter(cm)); 83 //绘图 84 canvas.drawBitmap(mBitmap, 0, 0, paint); 85 Log.i("CMatrix", "--------->onDraw"); 86 87 88 } 89 90 }

复制代码 CMatrix类主要负责 接收颜色矩阵的设置和重绘,没有要说的。MyImage类中进行绘图工作,首先设置颜色矩阵cm.set(..)从一维数组中读取数据20个数据给颜色矩 阵赋值,paint.setColorFilter(..)设置颜色滤镜,然后绘图,效果就出来了(这个过程和PS差不多)如下: 看到这里,相信大家对颜色矩阵的作用已经有了一个直观的感受,现在也可以尝试做一个照片特效的软件。

但是各种效果并不能让用户手动调节颜色矩阵,这里需要计算公式,由于本人并不是做图形软件的也不能提供,可以参考这个链接: http://www.adobe.com/devnet/flash/articles/matrix_transformations/ColorMatrixDemo.swf

坐标变换矩阵 坐标变换矩阵是一个3*3的矩阵如图2.1,用来对图形进行坐标变化,将原来的坐标点转移到新的坐标点,

因为一个图片是有点阵和每一点上的颜色信息组成的,所以对坐标的变换,就是对每一点进行搬移形成新的图片。

具体的说图形的放大缩小,移动,旋转,透视,扭曲这些效果都可以用此矩阵来完成。

这个矩阵的作用是对坐标x,y进行变换计算结果如下: x'=a*x+b*y+c y'=d*x+e*y+f 通常情况下g=h=0,这样使1=0*x+0*y+1恒成立。和颜色矩阵一样,坐标变换矩阵真正使用的参数很少也很有规律。 上图就是一个坐标变换矩阵的简单例子,计算后发现x'=x+50,y'=y+50. 可见图片的每一点都在x和y方向上平移到了(50,50)点处,这种效果就是平移效果,将图片转移到了(50,50)处。

计算上面得矩阵x'=2*x,y‘=2*y.经过颜色矩阵和上面转移效果学习,相信读者可以明白这个矩阵的作用了,这个矩阵对图片进行了放大,具体的说是放大了二倍。 下面将介绍几种常用的变换矩阵: 1. 旋转

绕原点逆时针旋转θ度角的变换公式是 x' = xcosθ − ysinθ 与 y。' = xsinθ + ycosθ 2. 缩放

变换后长宽分别放大x'=scale*x;y'=scale*y.

相关文档
最新文档