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. 装饰者模式(Decorator)

    首先来看一个例子: 比如,饮料可以分为很多种类,而这里我取一个咖啡,那么这个咖啡呢,有多种形式的, 比如有加糖了的咖啡,有加奶的咖啡,也有加热了的咖啡,也有加了冰块的咖啡. 而各个顾客的选择却是不同的 ...

  2. [转]Python中的with…as…

    先说明一个常见问题,文件打开: 1 2 3 4 5 6 7 try:     f = open('xxx')     do something except:     do something fin ...

  3. (转)[jQuery]使用jQuery.Validate进行客户端验证(初级篇)——不使用微软验证控件的理由

    以前在做项目的时候就有个很大心病,就是微软的验证控件,虽然微软的验证控件可以帮我们完成大部分的验证,验证也很可靠上手也很容易,但是我就是觉得不爽,主要理由有以下几点: 1.拖控件太麻烦,这个是微软控件 ...

  4. Jssdk微信分享

    <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppID", "yourApp ...

  5. WEB兼容性之JS

    1. 获取iframe的window对象 //三种方法 window.iframeName window.frames[iframeName] document.getElementById(ifra ...

  6. SQL Server DAC 管理员专用连接

    DAC 是Dedicated Administrator Connect 的缩写,是专用管理员连接通道,当SQL Server 因为资源不足而无法连接入系统的时候,管理员可通过该通道连接到数据,进行问 ...

  7. Android子线程更新主界面

    学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler ...

  8. where T:class 泛型类型约束

    对于一个定义泛型类型为参数的函数,如果调用时传入的对象为T对象或者为T的子类,在函数体内部如果需要使用T的属性的方法时,我们可以给这个泛型增加约束: 类的定义 public class Product ...

  9. 【数学】XMU 1597 GCD

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1597 题目大意: 求(am-bm, an-bn),结果取模1000000007,a,b ...

  10. LeetCode——Permutations

    Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ...