图像缩放和旋转

在绘制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相机的效果

猜你喜欢

转载自null-point.iteye.com/blog/1727724