如何使用Matrix对bitmap的旋转与镜像水平垂直翻转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Matrix对bitmap的旋转与镜像水平垂直翻转相关的知识,希望对你有一定的参考价值。

参考技术A   下面对使用Matrix对bitmap的旋转与镜像水平垂直翻转进行了详细的分析介绍,需要的朋友参考下

Bitmap convert(Bitmap a, int width, int height)

int w = a.getWidth();
int h = a.getHeight();
Bitmap newb = Bitmap.createBitmap(ww, wh, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
Canvas cv = new Canvas(newb);
Matrix m = new Matrix();
m.postScale(1, -1); //镜像垂直翻转
m.postScale(-1, 1); //镜像水平翻转
m.postRotate(-90); //旋转-90度
Bitmap new2 = Bitmap.createBitmap(a, 0, 0, w, h, m, true);
cv.drawBitmap(new2, new Rect(0, 0, new2.getWidth(), new2.getHeight()),new Rect(0, 0, ww, wh), null);
return newb;
本回答被提问者和网友采纳

Android Matrix 的理解与应用

图像处理中的矩阵能做什么

仿射变换

  • 缩放 旋转 移动 翻转 错切对应Matrix类

颜色与色相修改

  • 对比度 亮度 饱和度 滤镜 对应ColorMatrix类

Matrix内部实现

点坐标用矩阵表示为

多一个1是为了形成齐次坐标系,以便用矩阵乘法来实现图像的仿射变换

变换矩阵为3*3的矩阵

下面来看一段代码

上图第四行的平移变换实现如下

通过矩阵计算可验证其正确性

第三行的缩放变换实现如下

第四行的旋转变换实现如下

如何理解旋转矩阵:
现设点P0(x0, y0)旋转θ角后的对应点为P(x, y)。通过使用向量,我们得到如下:
x0 = r cosα
y0 = r sinα
x = r cos(α+θ) = x0 cosθ - y0 sinθ
y = r sin(α+θ) = x0 sinθ + y0 cosθ
于是我们得到如上旋转矩阵。

矩阵相乘实现图像的变换

如果图像围绕着某个点P(tx,ty)旋转,则先要
1. 平移——将坐标系原点平移到点P(tx,ty);
2. 旋转——以原点为中心旋转图像;
3. 平移——将坐标系原点平移到原来的位置;

如下图所示

代码实现如下(忽略第三行。。。)

其实Android已经封装了这样的操作,即 matrix.setRotate(30,tx,ty);

理解常用的三种API

  • setXXX
    先调用reset, 重置矩阵,然后set,所以之前例子的setScale( 0.5f,0.5f )实际上是无效的

  • preXXX
    右乘矩阵

  • postXXX
    左乘矩阵

看个例子

对应的矩阵乘法如下

矩阵运算满足交换律 (AB)C=A(BC)

安卓执行矩阵变换时,变换的矩阵放在左边,所以应该从右到左的理解上图。所以上图的执行顺序是 translate -> rotate -> scale -> translate。这样,pre就可以理解为先行执行的操作,post为靠后执行的操作

结语

如果是简单的矩阵变换,调用安卓的封装好的API就行,但了解矩阵变换的原理,能让我们实现复杂的图像变换,遇到问题时,也能通过打印矩阵来调试

本文是自己理解矩阵的一些总结。参考和引用了如下文章,感谢各位作者

Android Matrix理论与应用详解
理解矩阵Matrix
深入理解 Android 中的 Matrix
仿射变换与齐次坐标

以上是关于如何使用Matrix对bitmap的旋转与镜像水平垂直翻转的主要内容,如果未能解决你的问题,请参考以下文章

android如何利用matrix类直接对图元进行旋转、平移等操作?而不是对Bitmap进行操作。

bitmap图片用matrix旋转会失真,怎么同时旋转而不失真!

关于位图Bitmap的矩阵变换Matrix方法的总结:

android 图片旋转

Android 中的 Matrix

android: android 中的Matrix (android.graphics.Matrix) (转)