分享

android.graphics.Camera

 My镜像站 2012-02-14
android.graphics.Camera可以对图像执行一些比较复杂的操作,诸如旋转与绽放。

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

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. * @author Sodino E-mail:sodinoopen@hotmail.com
  15. * @version Time:2011-9-26 下午04:17:49
  16. */
  17. public class ActCamera extends Activity implements OnSeekBarChangeListener {
  18.         private Camera camera;
  19.         // views
  20.         private SeekBar seekbarXRotate;
  21.         private SeekBar seekbarYRotate;
  22.         private SeekBar seekbarZRotate;
  23.         private TextView txtXRotate;
  24.         private TextView txtYRotate;
  25.         private TextView txtZRotate;
  26.         private SeekBar seekbarXTranslate;
  27.         private SeekBar seekbarYTranslate;
  28.         private SeekBar seekbarZTranslate;
  29.         private TextView txtXTranslate;
  30.         private TextView txtYTranslate;
  31.         private TextView txtZTranslate;
  32.         private ImageView imgResult;
  33.         // integer params
  34.         private int rotateX, rotateY, rotateZ;
  35.         private int translateX, translateY, translateZ;

  36.         /** Called when the activity is first created. */
  37.         @Override
  38.         public void onCreate(Bundle savedInstanceState) {
  39.                 super.onCreate(savedInstanceState);
  40.                 setContentView(R.layout.main);
  41.                 // camera
  42.                 camera = new Camera();
  43.                 // initViews
  44.                 // rotate
  45.                 seekbarXRotate = (SeekBar) findViewById(R.id.seekbarXRotate);
  46.                 seekbarXRotate.setOnSeekBarChangeListener(this);
  47.                 seekbarYRotate = (SeekBar) findViewById(R.id.seekbarYRotate);
  48.                 seekbarYRotate.setOnSeekBarChangeListener(this);
  49.                 seekbarZRotate = (SeekBar) findViewById(R.id.seekbarZRotate);
  50.                 seekbarZRotate.setOnSeekBarChangeListener(this);
  51.                 txtXRotate = (TextView) findViewById(R.id.txtXRotate);
  52.                 txtYRotate = (TextView) findViewById(R.id.txtYRotate);
  53.                 txtZRotate = (TextView) findViewById(R.id.txtZRotate);
  54.                 // translate
  55.                 seekbarXTranslate = (SeekBar) findViewById(R.id.seekbarXTranslate);
  56.                 seekbarXTranslate.setOnSeekBarChangeListener(this);
  57.                 seekbarYTranslate = (SeekBar) findViewById(R.id.seekbarYTranslate);
  58.                 seekbarYTranslate.setOnSeekBarChangeListener(this);
  59.                 seekbarZTranslate = (SeekBar) findViewById(R.id.seekbarZTranslate);
  60.                 seekbarZTranslate.setOnSeekBarChangeListener(this);
  61.                 txtXTranslate = (TextView) findViewById(R.id.txtXTranslate);
  62.                 txtYTranslate = (TextView) findViewById(R.id.txtYTranslate);
  63.                 txtZTranslate = (TextView) findViewById(R.id.txtZTranslate);
  64.                 imgResult = (ImageView) findViewById(R.id.imgResult);
  65.                 // refresh
  66.                 refreshImage();
  67.         }

  68.         private void refreshImage() {
  69.                 // 获取待处理的图像
  70.                 BitmapDrawable tmpBitDra = (BitmapDrawable) getResources().getDrawable(R.drawable.honeycomb);
  71.                 Bitmap tmpBit = tmpBitDra.getBitmap();
  72.                 // 开始处理图像
  73.                 // 1.获取处理矩阵
  74.                 // 记录一下初始状态。save()和restore()可以将图像过渡得柔和一些。
  75.                 // Each save should be balanced with a call to restore().
  76.                 camera.save();
  77.                 Matrix matrix = new Matrix();
  78.                 // rotate
  79.                 camera.rotateX(rotateX);
  80.                 camera.rotateY(rotateY);
  81.                 camera.rotateZ(rotateZ);
  82.                 // translate
  83.                 camera.translate(translateX, translateY, translateZ);
  84.                 camera.getMatrix(matrix);
  85.                 // 恢复到之前的初始状态。
  86.                 camera.restore();
  87.                 // 设置图像处理的中心点
  88.                 matrix.preTranslate(tmpBit.getWidth() >> 1, tmpBit.getHeight() >> 1);
  89.                 // 2.通过矩阵生成新图像(或直接作用于Canvas)
  90.                 Log.d("ANDROID_LAB", "width=" + tmpBit.getWidth() + " height=" + tmpBit.getHeight());
  91.                 Bitmap newBit = null;
  92.                 try {
  93.                         // 经过矩阵转换后的图像宽高有可能不大于0,此时会抛出IllegalArgumentException
  94.                         newBit = Bitmap.createBitmap(tmpBit, 0, 0, tmpBit.getWidth(), tmpBit.getHeight(), matrix, true);
  95.                 } catch (IllegalArgumentException iae) {
  96.                         iae.printStackTrace();
  97.                 }
  98.                 if (newBit != null) {
  99.                         imgResult.setImageBitmap(newBit);
  100.                 }
  101.         }

  102.         @Override
  103.         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  104.                 if (seekBar == seekbarXRotate) {
  105.                         txtXRotate.setText(progress + "゜");
  106.                         rotateX = progress;
  107.                 } else if (seekBar == seekbarYRotate) {
  108.                         txtYRotate.setText(progress + "゜");
  109.                         rotateY = progress;
  110.                 } else if (seekBar == seekbarZRotate) {
  111.                         txtZRotate.setText(progress + "゜");
  112.                         rotateZ = progress;
  113.                 } else if (seekBar == seekbarXTranslate) {
  114.                         translateX = progress - 100;
  115.                         txtXTranslate.setText(String.valueOf(translateX));
  116.                 } else if (seekBar == seekbarYTranslate) {
  117.                         translateY = progress - 100;
  118.                         txtYTranslate.setText(String.valueOf(translateY));
  119.                 } else if (seekBar == seekbarZTranslate) {
  120.                         translateZ = progress - 100;
  121.                         txtZTranslate.setText(String.valueOf(translateZ));
  122.                 }
  123.                 refreshImage();
  124.         }

  125.         @Override
  126.         public void onStartTrackingTouch(SeekBar seekBar) {

  127.         }

  128.         @Override
  129.         public void onStopTrackingTouch(SeekBar seekBar) {

  130.         }
  131. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约