[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 ...
随机推荐
- [转]Delphi 控件属性和事件
常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大 ...
- Cloud Foundry中 JasperReports service集成
Cloud Foundry作为业界第一个开源的PaaS解决方案,正越来越多的被业界接受和认可.随着PaaS的发展,Cloud Foundry顺应潮流,充分发挥开源项目的特点,到目前为止,已经支持了大批 ...
- Spring4.0学习笔记(7) —— 通过FactoryBean配置Bean
1.实现Spring 提供的FactoryBean接口 package com.spring.facoryBean; import org.springframework.beans.factory. ...
- 导出页面文档(只在IE8下测试过)
之前说过一篇关于打印的方法,就顺便也看了一下导出,但是该方法需要用户更改浏览器的安全级别设置,因此并不十分推荐,大家如真有需要可以参考一下ZeroClipboard这款插件,我有时间也会去学习一下并贴 ...
- PHP文件系统概述
>> 本文固定链接: http://php.ncong.com/php_course/file/wenjianxitong.html >> 转载请注明: 恩聪php 2014年 ...
- python函数参数的pack与unpack
python函数参数的pack与unpack 上周在使用django做开发的时候用到了mixin(关于mixin我还要写一个博客专门讨论一下,现在请参见这里),其中又涉及到了一个关于函数参数打包(pa ...
- python -i filename
今天学习的时候看见python -i filaname 这个命令,书上说使用这个命令可以去执行filename文件中的代码.但是今天在使用的时候却一直报错,经过多次测试才把问题解决. 原来这个命令是不 ...
- 基于OSGi的企业级快速开发平台(开源)
模块化.插件化是未来的主流趋势,他很好的解决了,公司知识的积累.应用分发.商务模式.快速构建等一系列问题,国外著名的插件化平台JIRA就非常成功,国内的目前很多公司在偿试插件化的开发模式,作为平台推出 ...
- cocos2d-x把json数据解析到数组或字典中(libjson库)
以前在cocos2d-x项目中用到json解析,集成了libjson库后发现网上提供的解析方法大多是在解析过程中取得值,并没有将解析结果有效的保存起来,于是摸索一番,把解析结果根据数据格式存到数组或字 ...
- 转:ElasticSearch 简单入门
原文来自于:http://www.oschina.net/translate/elasticsearch-getting-started?cmp 教程样例 我们将要部署一个非常简单的应用--在一个部门 ...