[Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜
android.graphics.Camera可以对图像执行一些比较复杂的操作,诸如旋转与绽放,与Matrix可实现图像的倾斜。
个人总结Camera与Matrix的一些区别如下:
- Camera的rotate()相关方法是指定某一维度上旋转指定的角度。
- Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。
- Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,只是Matrix的scale()相关方法是直接指定缩放比例。
- Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。
本文为练习Camera的使用。实现效果图如下:

Camera的处理结果只是生成一个Matrix,该Matrix用于Bitmap或Canvas绘制Bitmap时才能产生旋转或缩放的效果。
代码如下:
- package lab.sodino.camera;
- import android.app.Activity;
- import android.graphics.Bitmap;
- import android.graphics.Camera;
- import android.graphics.Matrix;
- import android.graphics.drawable.BitmapDrawable;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.ImageView;
- import android.widget.SeekBar;
- import android.widget.SeekBar.OnSeekBarChangeListener;
- import android.widget.TextView;
- /**
- * Camera与Matrix的比较:<br/>
- * Camera的rotate()相关方法是指定某一维度上旋转指定的角度。<br/>
- * Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。<br/>
- *
- * Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,
- * 只是Matrix的scale()相关方法是直接指定缩放比例。<br/>
- *
- * Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。<br/>
- *
- * @author Sodino E-mail:sodinoopen@hotmail.com
- * @version Time:2011-9-26 下午04:17:49
- */
- public class ActCamera extends Activity implements OnSeekBarChangeListener {
- private Camera camera;
- // views
- private SeekBar seekbarXRotate;
- private SeekBar seekbarYRotate;
- private SeekBar seekbarZRotate;
- private TextView txtXRotate;
- private TextView txtYRotate;
- private TextView txtZRotate;
- private SeekBar seekbarXSkew;
- private SeekBar seekbarYSkew;
- private SeekBar seekbarZTranslate;
- private TextView txtXTranslate;
- private TextView txtYTranslate;
- private TextView txtZTranslate;
- private ImageView imgResult;
- // integer params
- private int rotateX, rotateY, rotateZ;
- private float skewX, skewY;
- private int translateZ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // camera
- camera = new Camera();
- // initViews
- // rotate
- seekbarXRotate = (SeekBar) findViewById(R.id.seekbarXRotate);
- seekbarXRotate.setOnSeekBarChangeListener(this);
- seekbarYRotate = (SeekBar) findViewById(R.id.seekbarYRotate);
- seekbarYRotate.setOnSeekBarChangeListener(this);
- seekbarZRotate = (SeekBar) findViewById(R.id.seekbarZRotate);
- seekbarZRotate.setOnSeekBarChangeListener(this);
- txtXRotate = (TextView) findViewById(R.id.txtXRotate);
- txtYRotate = (TextView) findViewById(R.id.txtYRotate);
- txtZRotate = (TextView) findViewById(R.id.txtZRotate);
- // translate
- seekbarXSkew = (SeekBar) findViewById(R.id.seekbarXSkew);
- seekbarXSkew.setOnSeekBarChangeListener(this);
- seekbarYSkew = (SeekBar) findViewById(R.id.seekbarYSkew);
- seekbarYSkew.setOnSeekBarChangeListener(this);
- seekbarZTranslate = (SeekBar) findViewById(R.id.seekbarZTranslate);
- seekbarZTranslate.setOnSeekBarChangeListener(this);
- txtXTranslate = (TextView) findViewById(R.id.txtXSkew);
- txtYTranslate = (TextView) findViewById(R.id.txtYSkew);
- txtZTranslate = (TextView) findViewById(R.id.txtZTranslate);
- imgResult = (ImageView) findViewById(R.id.imgResult);
- // refresh
- refreshImage();
- }
- private void refreshImage() {
- // 获取待处理的图像
- BitmapDrawable tmpBitDra = (BitmapDrawable) getResources().getDrawable(R.drawable.honeycomb);
- Bitmap tmpBit = tmpBitDra.getBitmap();
- // 开始处理图像
- // 1.获取处理矩阵
- // 记录一下初始状态。save()和restore()可以将图像过渡得柔和一些。
- // Each save should be balanced with a call to restore().
- camera.save();
- Matrix matrix = new Matrix();
- // rotate
- camera.rotateX(rotateX);
- camera.rotateY(rotateY);
- camera.rotateZ(rotateZ);
- // translate
- camera.translate(0, 0, translateZ);
- camera.getMatrix(matrix);
- // 恢复到之前的初始状态。
- camera.restore();
- // 设置图像处理的中心点
- matrix.preTranslate(tmpBit.getWidth() >> 1, tmpBit.getHeight() >> 1);
- matrix.preSkew(skewX, skewY);
- // matrix.postSkew(skewX, skewY);
- // 直接setSkew(),则前面处理的rotate()、translate()等等都将无效。
- // matrix.setSkew(skewX, skewY);
- // 2.通过矩阵生成新图像(或直接作用于Canvas)
- Log.d("ANDROID_LAB", "width=" + tmpBit.getWidth() + " height=" + tmpBit.getHeight());
- Bitmap newBit = null;
- try {
- // 经过矩阵转换后的图像宽高有可能不大于0,此时会抛出IllegalArgumentException
- newBit = Bitmap.createBitmap(tmpBit, 0, 0, tmpBit.getWidth(), tmpBit.getHeight(), matrix, true);
- } catch (IllegalArgumentException iae) {
- iae.printStackTrace();
- }
- if (newBit != null) {
- imgResult.setImageBitmap(newBit);
- }
- }
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (seekBar == seekbarXRotate) {
- txtXRotate.setText(progress + "゜");
- rotateX = progress;
- } else if (seekBar == seekbarYRotate) {
- txtYRotate.setText(progress + "゜");
- rotateY = progress;
- } else if (seekBar == seekbarZRotate) {
- txtZRotate.setText(progress + "゜");
- rotateZ = progress;
- } else if (seekBar == seekbarXSkew) {
- skewX = (progress - 100) * 1.0f / 100;
- txtXTranslate.setText(String.valueOf(skewX));
- } else if (seekBar == seekbarYSkew) {
- skewY = (progress - 100) * 1.0f / 100;
- txtYTranslate.setText(String.valueOf(skewY));
- } else if (seekBar == seekbarZTranslate) {
- translateZ = progress - 100;
- txtZTranslate.setText(String.valueOf(translateZ));
- }
- refreshImage();
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
- }
本文内容归CSDN博客博主Sodino 所有
转载请注明出处:http://blog.csdn.net/sodino/article/details/6823315
[Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜的更多相关文章
- Android中利用Camera与Matrix实现3D效果详解
本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...
- Android -- ImageView(控制图片的大小以及旋转的角度)
1.
- 【转】[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
参考http://stackoverflow.com/questions/18460647/android-setfocusarea-and-auto-focus http://blog.csdn.n ...
- Android 自带 camera 详解
在本文中 需要考虑的问题 概述 Manifest声明 使用内置的摄像头应用程序 捕获图像的intent 捕获视频的intent 接收摄像头intent的结果 创建摄像头应用程序 检测摄像头硬件 访问摄 ...
- Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移
Android Bitmap 相关操作 常见的几个操作:缩放,裁剪,旋转,偏移 很多操作需要 Matrix 来支持:Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitma ...
- [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
写在前面 最近在从零开始写一个移动端的AR系统,坑实在是太多了!!!整个项目使用了OpenCV第三方库,但对于摄像机来说,和原生Camera的方法基本相同. 实现 以OpenCV的JavaCamera ...
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...
- Android视频录制从不入门到入门系列教程(二)————显示视频图像
1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...
- Android 自定义属性动画&Camera动画
摘要: Android 自定义属性动画&Camera动画 1.相关知识点 对于Androi的帧动画,可以制作gif图片,有时为了能够动态的生成帧动画,就得需要使用代码构建了 Animati ...
随机推荐
- Java数据库连接池的几种配置方法(以MySQL数据库为例)
Java数据库连接池的几种配置方法(以MySQL数据库为例) 一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1 ...
- PL/SQL设置关键字大写
Tools->Preferences->User Interface->Keyword case = Uppercase,就设置为大写了.
- Javascript中回调函数的学习笔记
function a_b(kkis){ document.body.style.background ='red'; kkis(); } function fli(){ alert('######## ...
- thinkphp G方法的华丽升级
ThinkPHP长期以来需要通过debug_start.debug_end方法甚至Debug类才能完成的功能,3.1版本中被一个简单的G方法取代了,不可不谓是一次华丽升级. G方法的作用包括标记位置和 ...
- node.js使用经验记录
MongoDB使用经验: 有时不知道MongoDB的错误码代表什么,那有这个链接: https://github.com/mongodb/mongo/blob/master/src/mongo/bas ...
- TMethod的学习与使用
http://bbs.2ccc.com/topic.asp?topicid=496893
- 为什么 O2O 领域融资额特别高?
在36氪搜索“o2o”,融资额基本都是数千万乃至数亿,为什么这个领域的创业项目融资额如此之高?融到的钱一般用在什么地方? --------------------------------------- ...
- onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击 onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击
已经知道了.复写getView()的时候,在内部Viewholder.length.setOnClickListener(匿名内部类) 然后新建一个接口方进去 ,然后外面的listView设置&l ...
- -_-#【JS】HTML5 API
<JavaScript高级程序设计(第3版)> <!DOCTYPE html> <html> <head> <meta charset=" ...
- 在 Windows 下远程桌面连接 Linux - XManager 篇
XManager是一个简单易用的高性能的运行在Windows平台上的X-Server软件,而Gnome和KDE就是X-Client,Linux下的X-Server则为Xorg.它能把远端Unix/Li ...