[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 ...
随机推荐
- C# static 干货全解析
讲解顺序 背景 静态字段 静态函数 静态方法 疑问解答 背景 static来源 在编写类的时候,有时候需要类里面的某个成员具有唯一性,也就是,对所有的对象都保持只有一个的状态.比如创建个人信息,我们都 ...
- ASP.NET菜鸟之路之登录系统
背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. 网站介绍 根据书上的例子做了一个比较粗糙的登录例 ...
- [500lines]500行代码写web server
项目地址:https://github.com/aosabook/500lines/tree/master/web-server.作者是来自Mozilla的Greg Wilson.项目是用py2写成. ...
- (转载)图解Linux系统的系统架构
我以下图为基础,说明Linux的架构(architecture).(该图参考<Advanced Programming in Unix Environment>) 最内层是硬件,最外层是用 ...
- 13_FCITX输入法安装及问题排查解决
使用linux最沮丧的事情莫过于中文输入法切换不出来,甚至有人错误地认为,要使用中文输入法,必须把“区域和语言”(Region & Language)设置为中国-中文.输入法只是一个软件,和区 ...
- JavaScript作用域链详解
JavaScript的作用域链还是很有味道的,搞懂了这个知识点,闭包的问题也就迎刃而解咯 1.JavaScript的全局变量和局部变量 首先,先来看看js的全局变量和局部变量,js不是块级作用域,所以 ...
- jQuery1.6以上版本prop和attr的区别
- C:\WINDOWS\system32\config\systemprofile\Desktop引用了一个不可用的位置
使用迅雷下载压缩文件到桌面时,下载完毕后,如果直接点击"打开文件",则迅雷会报错: C:\WINDOWS\system32\config\systemprofile\Desktop ...
- codevs 1107 等价表达式
传送门 题解:第一眼这题好像非常难得样子,简直没有思路.但是这可以用栈带入特殊值来解决.这里用到两个栈,一个是存贮数字,另一个存贮运算符,按优先级进行运算.当读入的运算符比运算符栈的栈顶元素优先级低时 ...
- Java中String、StringBuffer、StringBuilder和toString的介绍
作为一个刚接触java的小白,觉得字符串是个比较大的知识点,所以我把自己整理的一点笔记写成随笔,与园友一起分享,也请园友多多指出意见. 一.String类 1.字符串长度——length() Stri ...