Android学习笔记11:图像的平移、旋转及缩放
2012-12-02 22:48
726 查看
在Android中,项目目录下的res\drawable用来放置该项目的图片资源。
Android中提供了Bitmap类来获取图像文件信息,进行图像的平移、旋转及缩放等操作,并可以指定格式保存图像文件。
1.图像绘制
在绘制图像之前,需要从项目目录下的res\drawable中获取所需的图片资源。我们可以通过资源索引来获得该图像对象Bitmap。具体方法如下(在项目目录下的res\drawable中放置了一张名为fuwa.png的图片):
mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.fuwa)).getBitmap():
其中,getResources()方法的作用是取得资源对象;getDrawable()方法的作用取得资源中的Drawable对象,参数为资源索引id;getBitmap()方法的作用是得到Bitmap对象。
获得图像资源后,可以使用drawBitmap()方法将图像显示到屏幕的(x,y)坐标位置上,具体方法如下:
Canvas.drawBitmap(mBitmap, x, y, null);
此外,要获得图像的信息,可以通过mBitmap.getHight()方法获得该图像的高度,通过mBitmap.getWidth()f方法获得该图像的宽度。
2.图像的平移
由图像的绘制方法,我们知道使用Canvas.drawBitmap(mBitmap, x, y, null)方法可以将图像绘制到屏幕的(x,y)坐标位置上。
所以,要实现图像的平移,只需要改变图像绘制到屏幕上的(x,y)坐标位置即可。
3.图像的旋转
在Android中,可以使用Matrix来进行图像旋转,Matrix是一个3*3的矩阵,专门用于图像变换匹配。Matrix没有结构体,必须被初始化,可以通过reset()或set()方法来实现,如下:
mMatrix.reset();
初始化之后就可以通过setRotate()方法来设置想要的旋转角度,如下:
mMatrix.setRotate();
旋转角度设置完毕后,可以使用creatBitmap()方法创建一个经过旋转处理的Bitmap对象,方法如下:
mBitmapRotate = Bitmap.creatBitmap(mBitmap, 0, 0, mBitmapWidth, mBitmapHight, mMatrix, true);
最后,将该Bitmap对象绘制到屏幕上,便实现了图像旋转的操作。
4.图像的缩放
在Android中,同样可以使用Matrix来实现图像的缩放。使用Matrix的postScale()方法来设置图像缩放的倍数,如下:
mMatrix.postScale();
缩放倍数设置完毕后,同样需要使用creatBitmap()方法创建一个经过缩放处理的Bitmap对象。最后,将该Bitmap对象绘制到屏幕上,便实现了图像缩放的操作。
5.使用线程更新界面
要达到在界面中实时的看到图像的旋转、缩放等效果,可以使用线程处理。在线程处理中加入postInvalidate()方法来实现。如下:
MyView.java源码
该实例原始图像效果如图1所示:
图1 原始图像效果
经过平移旋转及缩放后的效果如图2所示:
图2 经过平移旋转及缩放后的效果
相关资料:
Android图像处理之Bitmap类:http://www.open-open.com/lib/view/open1333418945202.html
Android图片处理(Matrix、ColorMatrix):http://www.cnblogs.com/leon19870907/articles/1978065.html
Android中提供了Bitmap类来获取图像文件信息,进行图像的平移、旋转及缩放等操作,并可以指定格式保存图像文件。
1.图像绘制
在绘制图像之前,需要从项目目录下的res\drawable中获取所需的图片资源。我们可以通过资源索引来获得该图像对象Bitmap。具体方法如下(在项目目录下的res\drawable中放置了一张名为fuwa.png的图片):
mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.fuwa)).getBitmap():
其中,getResources()方法的作用是取得资源对象;getDrawable()方法的作用取得资源中的Drawable对象,参数为资源索引id;getBitmap()方法的作用是得到Bitmap对象。
获得图像资源后,可以使用drawBitmap()方法将图像显示到屏幕的(x,y)坐标位置上,具体方法如下:
Canvas.drawBitmap(mBitmap, x, y, null);
此外,要获得图像的信息,可以通过mBitmap.getHight()方法获得该图像的高度,通过mBitmap.getWidth()f方法获得该图像的宽度。
2.图像的平移
由图像的绘制方法,我们知道使用Canvas.drawBitmap(mBitmap, x, y, null)方法可以将图像绘制到屏幕的(x,y)坐标位置上。
所以,要实现图像的平移,只需要改变图像绘制到屏幕上的(x,y)坐标位置即可。
3.图像的旋转
在Android中,可以使用Matrix来进行图像旋转,Matrix是一个3*3的矩阵,专门用于图像变换匹配。Matrix没有结构体,必须被初始化,可以通过reset()或set()方法来实现,如下:
mMatrix.reset();
初始化之后就可以通过setRotate()方法来设置想要的旋转角度,如下:
mMatrix.setRotate();
旋转角度设置完毕后,可以使用creatBitmap()方法创建一个经过旋转处理的Bitmap对象,方法如下:
mBitmapRotate = Bitmap.creatBitmap(mBitmap, 0, 0, mBitmapWidth, mBitmapHight, mMatrix, true);
最后,将该Bitmap对象绘制到屏幕上,便实现了图像旋转的操作。
4.图像的缩放
在Android中,同样可以使用Matrix来实现图像的缩放。使用Matrix的postScale()方法来设置图像缩放的倍数,如下:
mMatrix.postScale();
缩放倍数设置完毕后,同样需要使用creatBitmap()方法创建一个经过缩放处理的Bitmap对象。最后,将该Bitmap对象绘制到屏幕上,便实现了图像缩放的操作。
5.使用线程更新界面
要达到在界面中实时的看到图像的旋转、缩放等效果,可以使用线程处理。在线程处理中加入postInvalidate()方法来实现。如下:
MyView.java源码
package com.example.android_imagedraw; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.view.KeyEvent; import android.view.View; public class MyView extends View implements Runnable { Bitmap mBitmap = null; //图像对象 Matrix mMatrix = new Matrix(); //Matrix对象 int mBitmapToLeft = 0; //图像距离屏幕左边界的距离 int mBitmapToTop = 0; //图像距离屏幕顶端的距离 float mAngle = 0.0f; //旋转角度 float mScale = 1.0f; //缩放倍数 public MyView(Context context) { super(context); mBitmap = ((BitmapDrawable) getResources().getDrawable (R.drawable.fuwa)).getBitmap(); // 从资源文件中装载图片 new Thread(this).start(); //开启线程 } public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.GRAY); //设置画布底色为灰色 mMatrix.reset(); //重置Matrix mMatrix.setRotate(mAngle); //设置旋转的角度 mMatrix.postScale(mScale, mScale); //设置缩放的倍数 //构建经过处理的新的Bitmap Bitmap mBitmapRotate = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), mMatrix, true); MyView.drawImage(canvas, mBitmapRotate, mBitmapToLeft, mBitmapToTop); } // 按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { //处理平移 case KeyEvent.KEYCODE_DPAD_UP: //上方向键:上移 if (mBitmapToTop > 0){ mBitmapToTop--; } break; case KeyEvent.KEYCODE_DPAD_DOWN: //下方向键:下移 if ((mBitmapToTop + mBitmap.getHeight()) < 800) { mBitmapToTop++; } break; case KeyEvent.KEYCODE_DPAD_LEFT: //左方向键:左移 if (mBitmapToLeft > 0) { mBitmapToLeft--; } break; case KeyEvent.KEYCODE_DPAD_RIGHT: //右方向键:右移 if ((mBitmapToLeft + mBitmap.getWidth()) < 480) { mBitmapToLeft++; } break; } switch (keyCode) { //处理旋转事件 case KeyEvent.KEYCODE_MENU: //MENU键:顺时针旋转 mAngle--; break; case KeyEvent.KEYCODE_BACK: //BACK键:逆时针旋转 mAngle++; break; } switch (keyCode) { //处理缩放事件 case KeyEvent.KEYCODE_VOLUME_DOWN: //音量减键:缩小 if (mScale > 0.3) { mScale -= 0.1; } break; case KeyEvent.KEYCODE_VOLUME_UP: //音量加键:放大 if (mScale < 1.5) { mScale += 0.1; } break; } return true; } // 按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) { return false; } // 线程处理 public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } postInvalidate(); //使用postInvalidate可以直接在线程中更新界面 } } // 绘制Bitmap public static void drawImage(Canvas canvas, Bitmap bitmap, int x, int y) { canvas.drawBitmap(bitmap, x, y, null); } }
该实例原始图像效果如图1所示:
图1 原始图像效果
经过平移旋转及缩放后的效果如图2所示:
图2 经过平移旋转及缩放后的效果
相关资料:
Android图像处理之Bitmap类:http://www.open-open.com/lib/view/open1333418945202.html
Android图片处理(Matrix、ColorMatrix):http://www.cnblogs.com/leon19870907/articles/1978065.html
相关文章推荐
- Android学习笔记11-图像的平移、旋转及缩放
- Android学习笔记11:图像的平移、旋转及缩放
- 图像数据增强:平移、加噪、旋转、缩放(padding)
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
- matlab实现图像的平移、旋转、缩放
- Matlab 实现图像的平移,旋转,缩放
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)
- matlab实现图像的平移、旋转、缩放
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
- Open CV实现图像的旋转,平移,缩放
- 图像处理之图像基本变化(平移、缩放、旋转)(Octave实现)
- Android学习笔记11:图像的平移、旋转及缩放
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
- 【计算机视觉】【图像处理】几何变换之仿射变换(平移、缩放、旋转)
- QML图像、状态和动画--缩放、旋转和平移
- 图像处理---关于像素坐标矩阵变换(平移,旋转,缩放,错切)
- 【Android开发】图形图像处理技术-旋转、缩放、倾斜和平移图像