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



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

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

  • 相关阅读:
    连续3年!SpreadJS 纯前端表格控件荣获“中国优秀软件产品”
    终于有一款组件可以全面超越Apache POI
    List<Object> 多条件去重
    xml文档的解析并通过工具类实现java实体类的映射:XML工具-XmlUtil
    soap get/post请求
    map转java对象
    springboot postman 对象里传时间格式问题
    spring boot的多环境部署
    Hibernate 之 @Query查询
    利用maven命令将外部jar包导进maven仓库
  • 原文地址:https://www.cnblogs.com/dongweiq/p/3934987.html
Copyright © 2011-2022 走看看