android.graphics.Camera可以对图像执行一些比较复杂的操作,诸如旋转与绽放,与Matrix可实现图像的倾斜。

个人总结Camera与Matrix的一些区别如下:

  1. Camera的rotate()相关方法是指定某一维度上旋转指定的角度。
  2. Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。
  3. Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,只是Matrix的scale()相关方法是直接指定缩放比例。
  4. Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。

本文为练习Camera的使用。实现效果图如下:

Camera的处理结果只是生成一个Matrix,该Matrix用于Bitmap或Canvas绘制Bitmap时才能产生旋转或缩放的效果。

代码如下:

  1. package lab.sodino.camera;
  2. import android.app.Activity;
  3. import android.graphics.Bitmap;
  4. import android.graphics.Camera;
  5. import android.graphics.Matrix;
  6. import android.graphics.drawable.BitmapDrawable;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.widget.ImageView;
  10. import android.widget.SeekBar;
  11. import android.widget.SeekBar.OnSeekBarChangeListener;
  12. import android.widget.TextView;
  13. /**
  14. * Camera与Matrix的比较:<br/>
  15. * Camera的rotate()相关方法是指定某一维度上旋转指定的角度。<br/>
  16. * Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。<br/>
  17. *
  18. * Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,
  19. * 只是Matrix的scale()相关方法是直接指定缩放比例。<br/>
  20. *
  21. * Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。<br/>
  22. *
  23. * @author Sodino E-mail:sodinoopen@hotmail.com
  24. * @version Time:2011-9-26 下午04:17:49
  25. */
  26. public class ActCamera extends Activity implements OnSeekBarChangeListener {
  27. private Camera camera;
  28. // views
  29. private SeekBar seekbarXRotate;
  30. private SeekBar seekbarYRotate;
  31. private SeekBar seekbarZRotate;
  32. private TextView txtXRotate;
  33. private TextView txtYRotate;
  34. private TextView txtZRotate;
  35. private SeekBar seekbarXSkew;
  36. private SeekBar seekbarYSkew;
  37. private SeekBar seekbarZTranslate;
  38. private TextView txtXTranslate;
  39. private TextView txtYTranslate;
  40. private TextView txtZTranslate;
  41. private ImageView imgResult;
  42. // integer params
  43. private int rotateX, rotateY, rotateZ;
  44. private float skewX, skewY;
  45. private int translateZ;
  46. /** Called when the activity is first created. */
  47. @Override
  48. public void onCreate(Bundle savedInstanceState) {
  49. super.onCreate(savedInstanceState);
  50. setContentView(R.layout.main);
  51. // camera
  52. camera = new Camera();
  53. // initViews
  54. // rotate
  55. seekbarXRotate = (SeekBar) findViewById(R.id.seekbarXRotate);
  56. seekbarXRotate.setOnSeekBarChangeListener(this);
  57. seekbarYRotate = (SeekBar) findViewById(R.id.seekbarYRotate);
  58. seekbarYRotate.setOnSeekBarChangeListener(this);
  59. seekbarZRotate = (SeekBar) findViewById(R.id.seekbarZRotate);
  60. seekbarZRotate.setOnSeekBarChangeListener(this);
  61. txtXRotate = (TextView) findViewById(R.id.txtXRotate);
  62. txtYRotate = (TextView) findViewById(R.id.txtYRotate);
  63. txtZRotate = (TextView) findViewById(R.id.txtZRotate);
  64. // translate
  65. seekbarXSkew = (SeekBar) findViewById(R.id.seekbarXSkew);
  66. seekbarXSkew.setOnSeekBarChangeListener(this);
  67. seekbarYSkew = (SeekBar) findViewById(R.id.seekbarYSkew);
  68. seekbarYSkew.setOnSeekBarChangeListener(this);
  69. seekbarZTranslate = (SeekBar) findViewById(R.id.seekbarZTranslate);
  70. seekbarZTranslate.setOnSeekBarChangeListener(this);
  71. txtXTranslate = (TextView) findViewById(R.id.txtXSkew);
  72. txtYTranslate = (TextView) findViewById(R.id.txtYSkew);
  73. txtZTranslate = (TextView) findViewById(R.id.txtZTranslate);
  74. imgResult = (ImageView) findViewById(R.id.imgResult);
  75. // refresh
  76. refreshImage();
  77. }
  78. private void refreshImage() {
  79. // 获取待处理的图像
  80. BitmapDrawable tmpBitDra = (BitmapDrawable) getResources().getDrawable(R.drawable.honeycomb);
  81. Bitmap tmpBit = tmpBitDra.getBitmap();
  82. // 开始处理图像
  83. // 1.获取处理矩阵
  84. // 记录一下初始状态。save()和restore()可以将图像过渡得柔和一些。
  85. // Each save should be balanced with a call to restore().
  86. camera.save();
  87. Matrix matrix = new Matrix();
  88. // rotate
  89. camera.rotateX(rotateX);
  90. camera.rotateY(rotateY);
  91. camera.rotateZ(rotateZ);
  92. // translate
  93. camera.translate(0, 0, translateZ);
  94. camera.getMatrix(matrix);
  95. // 恢复到之前的初始状态。
  96. camera.restore();
  97. // 设置图像处理的中心点
  98. matrix.preTranslate(tmpBit.getWidth() >> 1, tmpBit.getHeight() >> 1);
  99. matrix.preSkew(skewX, skewY);
  100. // matrix.postSkew(skewX, skewY);
  101. // 直接setSkew(),则前面处理的rotate()、translate()等等都将无效。
  102. // matrix.setSkew(skewX, skewY);
  103. // 2.通过矩阵生成新图像(或直接作用于Canvas)
  104. Log.d("ANDROID_LAB", "width=" + tmpBit.getWidth() + " height=" + tmpBit.getHeight());
  105. Bitmap newBit = null;
  106. try {
  107. // 经过矩阵转换后的图像宽高有可能不大于0,此时会抛出IllegalArgumentException
  108. newBit = Bitmap.createBitmap(tmpBit, 0, 0, tmpBit.getWidth(), tmpBit.getHeight(), matrix, true);
  109. } catch (IllegalArgumentException iae) {
  110. iae.printStackTrace();
  111. }
  112. if (newBit != null) {
  113. imgResult.setImageBitmap(newBit);
  114. }
  115. }
  116. @Override
  117. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  118. if (seekBar == seekbarXRotate) {
  119. txtXRotate.setText(progress + "゜");
  120. rotateX = progress;
  121. } else if (seekBar == seekbarYRotate) {
  122. txtYRotate.setText(progress + "゜");
  123. rotateY = progress;
  124. } else if (seekBar == seekbarZRotate) {
  125. txtZRotate.setText(progress + "゜");
  126. rotateZ = progress;
  127. } else if (seekBar == seekbarXSkew) {
  128. skewX = (progress - 100) * 1.0f / 100;
  129. txtXTranslate.setText(String.valueOf(skewX));
  130. } else if (seekBar == seekbarYSkew) {
  131. skewY = (progress - 100) * 1.0f / 100;
  132. txtYTranslate.setText(String.valueOf(skewY));
  133. } else if (seekBar == seekbarZTranslate) {
  134. translateZ = progress - 100;
  135. txtZTranslate.setText(String.valueOf(translateZ));
  136. }
  137. refreshImage();
  138. }
  139. @Override
  140. public void onStartTrackingTouch(SeekBar seekBar) {
  141. }
  142. @Override
  143. public void onStopTrackingTouch(SeekBar seekBar) {
  144. }
  145. }

本文内容归CSDN博客博主Sodino 所有

转载请注明出处:http://blog.csdn.net/sodino/article/details/6823315

[Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜的更多相关文章

  1. Android中利用Camera与Matrix实现3D效果详解

    本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...

  2. Android -- ImageView(控制图片的大小以及旋转的角度)

    1. 

  3. 【转】[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

    参考http://stackoverflow.com/questions/18460647/android-setfocusarea-and-auto-focus http://blog.csdn.n ...

  4. Android 自带 camera 详解

    在本文中 需要考虑的问题 概述 Manifest声明 使用内置的摄像头应用程序 捕获图像的intent 捕获视频的intent 接收摄像头intent的结果 创建摄像头应用程序 检测摄像头硬件 访问摄 ...

  5. Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移

    Android Bitmap 相关操作 常见的几个操作:缩放,裁剪,旋转,偏移      很多操作需要 Matrix 来支持:Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitma ...

  6. [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

    写在前面 最近在从零开始写一个移动端的AR系统,坑实在是太多了!!!整个项目使用了OpenCV第三方库,但对于摄像机来说,和原生Camera的方法基本相同. 实现 以OpenCV的JavaCamera ...

  7. Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...

  8. Android视频录制从不入门到入门系列教程(二)————显示视频图像

    1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...

  9. Android 自定义属性动画&Camera动画

      摘要: Android 自定义属性动画&Camera动画 1.相关知识点 对于Androi的帧动画,可以制作gif图片,有时为了能够动态的生成帧动画,就得需要使用代码构建了 Animati ...

随机推荐

  1. sqlite3 小结

    sqlite安装 DDL(数据定义语言):create.alter.drop DML(数据操作语言):insert.update.delete DQL(数据查询语言):select sqlite3 命 ...

  2. SqlParameter的用法和好处

    关于Sql注入的基本概念,相信不需要多说,大家都清楚,经典的注入语句是' or 1=1--单引号而截断字符串,"or 1=1"的永真式的出现使得表的一些信息被暴露出来,如果sql语 ...

  3. linux dd命令测试U盘读写速度

    1. dd命令简述: if=输入文件, of=输出文件, ibs=一次读取字节数, obs=一次写入字节数, bs=设置一次读取写入的字节数, skip=跳过的bs数, count=拷贝的块数 2. ...

  4. 关闭iOS的自动更新

    Safari打开网址https://oldcat.me/web/NOOTA9.mobileconfig,安装描述文件,就不会自动下载和提示更新最新的iOS了

  5. php常用的排序算法与二分法查找

    一 : 归并排序 将两个的有序数列合并成一个有序数列,我们称之为"归并".归并排序(Merge Sort)就是利用归并思想对数列进行排序.根据具体的实现,归并排序包括"从 ...

  6. VS2013安装过程截图

    ================================================================ VS 2013 中新增了很多提高开发人员工作效率的新功能,比如自动补全 ...

  7. 由于权限不足而无法读取配置文件出现的HTTP 500.19解决办法

    无法访问请求的页面,因为该页的相关配置数据无效. 如下图: 解决方法, 到站点目录的属性,安全标签,添加用户(Everyone),并给修改权限:

  8. Foreign Exchange(交换生换位置)

     Foreign Exchange Your non-profit organization (iCORE - international Confederation of Revolver Enth ...

  9. Stack集合 Queue队列集合 Hashtable哈希表

    Stack集合 干草堆集合 栈集合 栈;stack,先进后出,一个一个赋值,一个一个取值,安装顺序来. 属性和方法 实例化 初始化 Stack st = new Stack(); 添加元素 个数 Co ...

  10. Es kibana

    http://kibana.logstash.es/content/kibana/v4/setup/production.html