[Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜

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时才能产生旋转或缩放的效果。

代码如下:

[java] view plaincopy

  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:[email protected]
  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

时间: 2024-10-14 10:49:23

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

Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix

MainActivity如下: package cc.c; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; /** * Demo描述: * 利用B

一起学android之从Camera捕获图像讲解(38)

我们知道所有带有摄像头的设备都会附带Camera应用程序,Camera 应用程序包含一个意图过滤器,用于与Camera 应用程序图像的获取. 为了通过一个意图利用Camera应用程序,我们需要构造一个意图过滤器,可以这样定义: Intent intent=new Intent("android.media.action.IMAGE_CAPTURE"); 但在实际开发中,并不推荐这样做,这时我们可以指定MediaStore类中的常量ACTION_IMAGE_CAPTURE,使用这样 的好

【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变). 第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似. 下面就讲一下Tweene Animations. 主要类: Animation  动画 AlphaAnimation 渐变透明度 RotateAnimation 画面旋转 ScaleAnimation 渐变尺寸缩放 TranslateAnimation 位置移动 Animatio

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

1.  2.   实现代码 package com.example.myimageview3; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.util.DisplayMetrics

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

1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 2.布局文件 <?xml version="1.0" encoding="utf-8"

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

MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.app.Activity; import android.graphics.Matrix; /** * Demo描

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

MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.app.Activity; import android.graphics.Matrix; /** * Demo描述:

进阶六之Android UI介面之(介面3D旋转)

天道酬勤.也许你付出了不一定得到回报,但不付出一定得不到回报. 本讲内容:介面3D旋转 示例一效果图:                 下面是res/layout/activity_main.xml 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android 5.1 Camera 架构学习(一)——Camera初始化

Android Camera 采用C/S架构,client 与server两个独立的线程之间(CameraService)使用Binder通信. 一 CameraService的注册. 1.手机开机后,会走init.rc流程,init.rc会启动MediaServer Service. service media /system/bin/mediaserver class main user root #### # google default #### # user media #### gr