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. 【COGS 56】质数取石子

    [问题描述] DD 和 MM 正在玩取石子游戏.他们的游戏规则是这样的:桌上有若干石子,DD 先取,轮流取,每次必须取质数个.如果某一时刻某一方无法从桌上的石子中取质数个,比如说剩下 0 个或 1 个 ...

  2. jquery find选择器在不同浏览器下的差异

    初步测试,5000个节点的隐藏. 代码如下: <!doctype html> <html lang="en"> <head> <scrip ...

  3. JQUERY1.9学习笔记 之内容过滤器(三) has选择器

    描述:选择至少包含一个元素,匹配指定的标签的标签.jQuery( ":has(selector)" ) 例:给所有的div添加一个类"test",在他们中有一个 ...

  4. 用python+selenium获取XX省交通违章数据

    前言: 目前在研究易信公众号,想给公众号增加一个获取个人交通违章的查询菜单,通过点击返回查询数据.以下是实施过程. 一.首先,用火狐浏览器打开XX省交管网,分析页面信息: 可以看到共有4种查询种类,我 ...

  5. django group_by

    from django.db.models import Count Members.objects.values('designation').annotate(dcount=Count('desi ...

  6. C语言笔记(结构体与offsetof、container_of之前的关系)

    关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 typedef struct mystruct { ...

  7. Oracle中批量插入

    为了防止OracleConnection的重复打开和关闭,使用begin end:将sql语句包在里面,然后一次性执行提高插入的效率. 下面代码中要插入的数据在list集合中,如果list集合的cou ...

  8. C# Attribute

    Attribute 是C#非常重要的一块内容,需要研究一下. Attribute  的简单使用:简而言之,就是可以自定义通用标志位,而不是在每个所需的类型中分别增加标志位. //class专用attr ...

  9. C语言itoa函数和atoi 函数

    C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转 换为字符串的一个例子: # include <stdio.h>  ...

  10. angular2 学习笔记 ( rxjs 流 )

    RxJS 博大精深,看了好几篇文章都没有明白. 范围牵扯到了函数响应式开发去了... 我对函数式一知半解, 响应式更是第一次听到... 唉...不过日子还是得过...混着过先呗 我目前所理解的很浅,  ...