在绘制bitmap时,都会涉及一个参数矩阵Matrix,Matrix(矩阵)类,当在现有位图对象上进行绘制或从另一个位图对象创建某个位图对象时,可以使用该类。这个类使得我们能够在一幅图像上应用空间转换。这种类型的转换可以是旋转、裁剪、缩放或者更改图像的坐标空间。
Matrix 类以9 个数字的数组表示转换。在许多情况下,这些数字可以由一个公式生成,
该公式在数学上表示应该发生的转换。例如,对于旋转公式,通过使用正弦和余弦生成矩
阵中的数字。
Matrix 类中的数字也可以手动输入。为了了解Matrix 类如何工作,我们将以一些手动
转换作为开始。
Matrix 类中的每个数字都将应用于图像上每个点的3 个坐标(x、y 或z)之一。
例如,下面是一个包含9 个浮点数的矩阵:
1 0 0
0 1 0
0 0 1
顶行(1 , 0 , 0)指定源图像的x 坐标将根据以下公式转换:x = 1x + 0y + 0z。正如您所看
到的,值在矩阵中的放置位置决定对应数字将会如何影响结果。顶行总是会影响到x 坐标,
但可以操作源图像的x、y 和z 坐标。
第二行(0 , 1 , 0)意味着y 坐标将被确定为y = 0x + 1y + 0z,第三行(0 , 0 , 1)意味着z 坐
标将确定为z = 0x + 0y + 1z。
Matrix 类的方法:旋转、平移、缩放,其它的一些效果可以通过这三种方法的变化而来.
镜像
一个特别有用的方法对是setScale 和postTranslate,它们允许跨单个轴(或者两个轴)翻
转图像。如果以一个负数缩放,那么会将该图像绘制到坐标系统的负值空间。由于(0,0)点
位于左上角,使用x 轴上的负数会导致向左绘制图像。因此我们需要使用postTranslate 方
法,将图像向右移动
matrix.setScale(-1, 1);
matrix.postTranslate(bmp.getWidth(),0);
翻转
可以在y 轴上做同样的事情,翻转图像以使其倒置。通过将图像围绕两个轴上的中心
点旋转180°
matrix.setScale(1, -1);
matrix.postTranslate(0, bmp.getHeight());
类似于在Canvas 对象上绘制时使用Matrix 对象的方法,也可以使用一个ColorMatrix
对象来改变用于在Canvas 对象上绘制的Paint 对象。
默认的ColorMatrix 对象就是所谓的标识,就像默认的Matrix 对象一样,当应用它时
不会改变图像。查看以下这个数组所包含的内容将帮助我们理解它如何工作。
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
假设现在有一个中等灰度的像素,其红色值是128,蓝色值是128,绿色值是128,Alpha
值为0(它是不透明的)。如果通过上面的颜色矩阵来操作这个像素,那么数学公式将看起来
如下所示:
新的红色值= 1 * 128 + 0 * 128 + 0 * 128 + 0 * 0 + 0
新的蓝色值= 0 * 128 + 1 * 128 + 0 * 128 + 0 * 0 + 0
新的绿色值= 0 * 128 + 0 * 128 + 1 * 128 + 0 * 0 + 0
新的Alpha 值= 0 * 128 + 0 * 128 + 0 * 128 + 1 * 0 + 0
改变对比度和亮度
ColorMatrix cm = new ColorMatrix();
float contrast = 2;
cm.set(new float[] {
contrast, 0, 0, 0, 0,
0, contrast, 0, 0, 0,
0, 0, contrast, 0, 0,
0, 0, 0, 1, 0 });
paint.setColorFilter(new ColorMatrixColorFilter(cm));
通常,当调整亮度时,对每种颜色只使用矩阵的最后一列会更加简单。这仅仅是添加
到颜色值的量,而无须乘以已有的颜色值。
因此,为了降低亮度,可以使用矩阵代码如下。
ColorMatrix cm = new ColorMatrix();
float brightness = -25;
cm.set(new float[] {
1, 0, 0, 0, brightness,
0, 1, 0, 0, brightness,
0, 0, 1, 0, brightness,
0, 0, 0, 1, 0 });
paint.setColorFilter(new ColorMatrixColorFilter(cm));
改变饱和度
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(.5f);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
图像合成
需要在Paint 对象上指定一个过渡模式(Xfermode)。
可用作过渡模式的类集合都继承自Xfermode 基类,而且其中包括一个称为PorterDuffXfermode 的类,例如:
Bitmap drawingBitmap = Bitmap.createBitmap(bmp1.
getWidth(),bmp1.getHeight(), bmp1.getConfig());
canvas = new Canvas(drawingBitmap);
paint = new Paint();
canvas.drawBitmap(bmp1, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.MULTIPLY));
canvas.drawBitmap(bmp2, 0, 0, paint);
compositeImageView.setImageBitmap(drawingBitmap);
更多内容可以参考<Android 多媒体开发高级编程>第三章
附件是更多图片处理效果文档及demo,类似与360相机的效果
分享到:
相关推荐
总的来说,理解和掌握图片缩放与旋转的技术对于开发涉及图像处理的软件至关重要。这不仅可以帮助我们创建美观的用户界面,还能在数据分析、机器学习等更复杂的场景中发挥作用。通过不断学习和实践,我们可以更好地...
在MATLAB中,图像处理是一项常见且重要的任务,包括图像的缩放和旋转。这两个操作在图像分析、图像增强和计算机视觉应用中扮演着关键角色。以下是对标题和描述中涉及的知识点的详细解释。 首先,图像缩放是指改变...
在OpenCV库中,图像处理是其核心功能之一,其中包括图像的缩放和旋转操作。这两个操作在图像处理和计算机视觉领域中非常常见,比如在图像预处理、目标检测、图像分析等场景都有广泛应用。 首先,我们来了解一下图像...
**图片缩放** 在Android中,图片的缩放主要通过Bitmap的createScaledBitmap()方法来实现。这个方法接受三个参数:源Bitmap对象,目标宽度和目标高度。以下是一个简单的缩放图片的例子: ```java Bitmap ...
通过CDC,我们可以绘制直线、曲线、矩形、文本等,并执行图像的旋转和缩放。 7. **代码实现**: 在MFC应用程序中,通常在OnDraw虚函数中处理图像的绘制。首先,创建一个CBitmap对象,加载图像,然后创建一个CDC...
这个压缩包“android ImageView控件缩放和旋转图片源码.rar”显然包含了一个实现ImageView图片缩放和旋转功能的示例代码。下面将详细解释Android中ImageView的缩放和旋转操作,并给出相关知识点。 1. **ImageView的...
在图像处理领域,MATLAB是一种常用的工具,它提供了丰富的函数和工具箱来处理各种图像操作,包括图像的缩放和旋转。本篇文章将详细探讨这些关键知识点。 首先,我们要了解图像缩放。图像缩放是改变图像尺寸的过程,...
Matlab 图像缩放和旋转 Matlab 是一个功能强大的计算软件,可以用于图像处理和分析。在图像处理中,缩放和旋转是两种常见的操作。缩放是指改变图像的尺寸,使其变得更大或更小;旋转是指将图像旋转到一定的角度。...
线性插值是一种在计算机图形学中广泛应用的简单而有效的数据插值方法...在实际编程实现时,理解坐标变换和插值计算是关键,而提供的“线性插值算法实现图像缩放旋转祥解.doc”文档应能提供更具体的实现细节和技术要点。
总之,C#提供了一套强大的图像处理工具,通过使用Bitmap和Graphics类,我们可以轻松地实现图像的缩放、放大、缩小和旋转等操作。理解这些基本操作对于开发涉及图像处理的应用程序至关重要。在实践中,你可能还会遇到...
- Android的`Animator`类族可以用于实现平滑的图片缩放和旋转动画。 - `ObjectAnimator`可以从一个值平滑过渡到另一个值,例如,从一个旋转角度到另一个旋转角度。 - `ValueAnimator`也可以实现类似效果,但需要...
在一些应用场景中,我们可能需要实现ImageView的图片缩放和旋转功能,例如在设计一个图片查看器或者编辑器时。这个压缩包"Android ImageView控件缩放和旋转图片源码.zip"很可能包含了实现这些功能的示例代码。 首先...
在实现图片旋转和缩放时,理解图像坐标系统是必要的。图片通常在二维平面上有一个原点,旋转和缩放都是在这个坐标系统上进行的。 8. 用户交互设计: 考虑到用户界面的友好性和易用性,设计合理的交互提示和反馈至...
总的来说,这个程序包提供了一个很好的学习平台,让你掌握MATLAB在图像缩放和旋转方面的应用。通过实践和调试代码,你可以进一步提升在图像处理领域的技能,为后续复杂的图像分析和处理任务打下坚实的基础。
"android手势处理图片平移、缩放和旋转"这个主题涉及到的主要知识点包括Android手势检测、ImageView的扩展以及图片操作。 首先,我们要了解Android的手势检测。Android系统提供了一套GestureDetector和...
这个压缩包"Android ImageView控件缩放和旋转图片源码.rar"显然包含了实现ImageView图像缩放和旋转功能的源代码。以下是对这些关键知识点的详细解释: 1. **ImageView**: - ImageView是Android SDK中的一个视图类...
总结来说,这个压缩包中的源码涵盖了Android中ImageView的图片缩放和旋转的核心技术,包括使用Matrix进行自由变换、设置ScaleType调整缩放策略、使用Bitmap旋转图片,以及可能的动画实现。通过分析和实践这些代码,...
在图像处理领域,图像缩放和旋转是两个基础但至关重要的操作。它们广泛应用于各种场景,包括图像识别、计算机视觉、图像编辑、机器学习模型的训练等。图像选择在这个过程中起到决定性的作用,因为它决定了我们要处理...
在本教程中,我们将深入探讨如何在Android应用中实现ImageView控件的图片缩放和旋转功能,这正是"android手机应用源码ImageView控件缩放和旋转图片源码.rar"这个压缩包提供的内容。 首先,让我们了解Android中的...