Android 绘图基础:Bitmap(位图)与Matrix(矩阵)实现图片5种操作(平移、旋转、错切、缩放、对称)
来源:互联网 发布:网络大电影众筹平台 编辑:程序博客网 时间:2024/05/21 05:23
Android的Matrix利用数学原理实现图片平移、旋转等操作详解
很庆幸自己的线性代数学的还可以,理解Matrix的矩阵变换完全没有问题。Matrix矩阵实现图片的平移旋转等操作涉及到线性代数问题,感兴趣它的具体实现的话可以参考一下上面的博客,非常详细,非常好。如果不想深究也可以简单的理解为BitMap的像素点通过某种方式(Matrix)移动了相应的位置,这样就实现了图片的变换。不管怎样,先学会如何使用它就可以了。
注:我们所使用的Matrix变换必须有一个Bitmap基础,因此,代码中需要先获得Bitmap。
一、总体使用的简单展示
平移变换
//参数:移动到的位置的放大倍数matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2);canvas.drawBitmap(mbitmap,matrix, mpaintline);
旋转变换
matrix.postRotate(180); canvas.drawBitmap(mbitmap,matrix, mpaintline);
缩放变换
//参数:缩放倍数matrix.postScale(2, 2);canvas.drawBitmap(mbitmap,matrix, mpaintline);
错切变换
//x轴不变,y轴进行拉伸matrix.postSkew(0, 1); canvas.drawBitmap(mbitmap,matrix, mpaintline);
对称(关于x轴对称 倒影)
float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f}; matrix.setValues(matrix_value); canvas.drawBitmap(mbitmap,matrix, mpaintline);
对称(关于Y轴对称 镜像)
float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f}; matrix.setValues(matrix_value1); matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2); canvas.drawBitmap(mbitmap,matrix, mpaintline);
关于它的使用我们也是需要自定义一个class继承View,在布局中类名加包名进行添加布局。
二、平移变换
//原图加平移 matrix.reset(); canvas.drawBitmap(mbitmap, matrix, mpaintline); //平移 matrix.reset(); matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2); canvas.drawBitmap(mbitmap,matrix, mpaintline);
三、旋转变换
//原图加旋转加平移matrix.reset(); matrix.postRotate(180); matrix.postTranslate(mBitmapwidth*3,mBitmapheight* 2); canvas.drawBitmap(mbitmap,matrix, mpaintline);
四、缩放变换
matrix.reset(); matrix.postScale(2, 2); canvas.drawBitmap(mbitmap,matrix, mpaintline); matrix.reset(); //将原图绘制出来 canvas.drawBitmap(mbitmap, matrix, mpaintline);
五、错切变换
matrix.reset(); matrix.postSkew(0, 1); matrix.postTranslate(mBitmapwidth*3,mBitmapheight*3); canvas.drawBitmap(mbitmap,matrix, mpaintline);
六、对称变换
1、关于x轴对称
//对称 关于x轴对称 倒影 matrix.reset(); float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f}; matrix.setValues(matrix_value); matrix.postTranslate(0, mBitmapheight*3); canvas.drawBitmap(mbitmap,matrix, mpaintline);
2、关于Y轴对称
//对称 关于y轴 镜像 matrix.reset(); float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f}; matrix.setValues(matrix_value1); matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2); canvas.drawBitmap(mbitmap,matrix, mpaintline);
七、附完整代码
public class MyBitmapView extends View{ private int width; private int height; private Paint mpaintline; private Bitmap mbitmap; private int mBitmapwidth; private int mBitmapheight; private Matrix matrix; public MyBitmapView(Context context) { super(context); } public MyBitmapView(Context context, AttributeSet attrs) { super(context, attrs); mpaintline = new Paint(); mpaintline.setColor(Color.RED); mpaintline.setStrokeWidth(10); mpaintline.setAntiAlias(true); mbitmap=BitmapFactory.decodeResource(getResources(), R.drawable.yourimg); mBitmapwidth=mbitmap.getWidth(); mBitmapheight=mbitmap.getHeight(); Log.d("图片信息","高:"+ mbitmap.getHeight()+"宽:"+mbitmap.getWidth()); matrix=new Matrix(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);// canvas.drawBitmap(mbitmap, 20, 20, mpaintline); //放缩 matrix.reset(); matrix.postScale(2, 2); canvas.drawBitmap(mbitmap,matrix, mpaintline); matrix.reset(); canvas.drawBitmap(mbitmap, matrix, mpaintline); //平移 matrix.reset(); matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2); canvas.drawBitmap(mbitmap,matrix, mpaintline); //旋转 matrix.reset(); matrix.postRotate(180); matrix.postTranslate(mBitmapwidth*3,mBitmapheight* 2); canvas.drawBitmap(mbitmap,matrix, mpaintline); //错切 matrix.reset(); matrix.postSkew(0, 1); matrix.postTranslate(mBitmapwidth*3,mBitmapheight*3); canvas.drawBitmap(mbitmap,matrix, mpaintline); //对称 关于x轴对称 倒影 matrix.reset(); float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f}; matrix.setValues(matrix_value); matrix.postTranslate(0, mBitmapheight*3); canvas.drawBitmap(mbitmap,matrix, mpaintline); //对称 关于y轴 镜像 matrix.reset(); float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f}; matrix.setValues(matrix_value1); matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2); canvas.drawBitmap(mbitmap,matrix, mpaintline); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); }}
0 0
- Android 绘图基础:Bitmap(位图)与Matrix(矩阵)实现图片5种操作(平移、旋转、错切、缩放、对称)
- 图片处理(旋转,平移,缩放)View---Canvas;Paint;Bitmap
- Bitmap简单操作-平移旋转缩放(VC++/Windows SDK)
- Android中利用Matrix实现图片平移、缩放和旋转
- Android 利用Matrix实现图片随手指平移、旋转、缩放
- Android 利用Matrix实现图片随手指平移、旋转、缩放
- Android 利用Matrix实现图片随手指平移、旋转、缩放
- iOS 图形上下文的矩阵操作(平移、旋转、缩放)
- 矩阵改变,平移,缩放,旋转(转)
- Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix
- 动态旋转图片(Bitmap与Matrix 旋转ImageView)
- Android-实现图片的简单特效(平移、缩放、旋转、镜面、倒影)
- android动画(平移,旋转,缩放,透明度)
- Bitmap位图渲染与操作(图片移动,放大,缩小,旋转,镜像发转)
- 矩阵变换与图片平移,旋转,缩放的原理
- 七 iOS之 矩阵操作(图形上下文的平移、缩放、旋转)
- osg 矩阵的平移缩放旋转(转)
- Android 图片旋转 缩放 平移
- 看《暗杀》全智贤 去杀人都能美成神
- iOS国际化---跟随系统语言
- hdu5444 Elven Postman 二叉树建树
- CodeVS1394 数字串
- java__io__序列流(合并MP3)和对象序列化
- Android 绘图基础:Bitmap(位图)与Matrix(矩阵)实现图片5种操作(平移、旋转、错切、缩放、对称)
- ubuntu kylin上部署hadoop源码环境
- 自定义View3 仿联系人A-Z选择效果
- 0916_vbs加密与远程登录融合
- Android自定义控件打包,方便项目上使用
- 关于编程中人脑复杂度的设想,源于命名规则的对象细致化
- 提交按钮的使用
- IOS 刷新UItableView 中的行或组详细介绍
- 决定学linux了