欢迎访问 水平网    今天是:2017年11月22日 注册 | 登录 | 订阅 | 收藏
>> 安卓【Android】 >> 编程应用 >> Android.graphics.Camera实现图像的旋转、缩放
推荐文章
热点文章

Android.graphics.Camera实现图像的旋转、缩放

作者:未知,  来源:网络,  阅读:1212,  发布时间:2014-10-25  【放入收藏夹

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的处理结果只是生成一个Matrix,该Matrix用于Bitmap或Canvas绘制Bitmap时才能产生旋转或缩放的效果

java代码如下

packagelab.sodino.camera;
importandroid.app.Activity;
importandroid.graphics.Bitmap;
importandroid.graphics.Camera;
importandroid.graphics.Matrix;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.widget.ImageView;
importandroid.widget.SeekBar;
importandroid.widget.SeekBar.OnSeekBarChangeListener;
importandroid.widget.TextView;

/**
* Camera与Matrix的比较:<br/>
* Camera的rotate()相关方法是指定某一维度上旋转指定的角度。<br/>
* Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。<br/>
*
* Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,
* 只是Matrix的scale()相关方法是直接指定缩放比例。<br/>
*
* Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。<br/>
*
* <a href=http://http://blog.csdn.net/by317966834/article/details/"http://my.oschina.net/arthor" class="referer" target="_blank">@author</a> Sodino E-mail:sodinoopen@hotmail.com
* @version Time:2011-9-26 下午04:17:49
*/
publicclassActCamera extendsActivity implementsOnSeekBarChangeListener {
privateCamera camera;
// views
privateSeekBar seekbarXRotate;
privateSeekBar seekbarYRotate;
privateSeekBar seekbarZRotate;
privateTextView txtXRotate;
privateTextView txtYRotate;
privateTextView txtZRotate;
privateSeekBar seekbarXSkew;
privateSeekBar seekbarYSkew;
privateSeekBar seekbarZTranslate;
privateTextView txtXTranslate;
privateTextView txtYTranslate;
privateTextView txtZTranslate;
privateImageView imgResult;
// integer params
privateintrotateX, rotateY, rotateZ;
privatefloatskewX, skewY;
privateinttranslateZ;

/** Called when the activity is first created. */
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// camera
camera = newCamera();
// initViews
// rotate
seekbarXRotate = (SeekBar) findViewById(R.id.seekbarXRotate);
seekbarXRotate.setOnSeekBarChangeListener(this);
seekbarYRotate = (SeekBar) findViewById(R.id.seekbarYRotate);
seekbarYRotate.setOnSeekBarChangeListener(this);
seekbarZRotate = (SeekBar) findViewById(R.id.seekbarZRotate);
seekbarZRotate.setOnSeekBarChangeListener(this);
txtXRotate = (TextView) findViewById(R.id.txtXRotate);
txtYRotate = (TextView) findViewById(R.id.txtYRotate);
txtZRotate = (TextView) findViewById(R.id.txtZRotate);
// translate
seekbarXSkew = (SeekBar) findViewById(R.id.seekbarXSkew);
seekbarXSkew.setOnSeekBarChangeListener(this);
seekbarYSkew = (SeekBar) findViewById(R.id.seekbarYSkew);
seekbarYSkew.setOnSeekBarChangeListener(this);
seekbarZTranslate = (SeekBar) findViewById(R.id.seekbarZTranslate);
seekbarZTranslate.setOnSeekBarChangeListener(this);
txtXTranslate = (TextView) findViewById(R.id.txtXSkew);
txtYTranslate = (TextView) findViewById(R.id.txtYSkew);
txtZTranslate = (TextView) findViewById(R.id.txtZTranslate);
imgResult = (ImageView) findViewById(R.id.imgResult);
// refresh
refreshImage();
}

privatevoidrefreshImage() {
// 获取待处理的图像
BitmapDrawable tmpBitDra = (BitmapDrawable) getResources().getDrawable(R.drawable.honeycomb);
Bitmap tmpBit = tmpBitDra.getBitmap();
// 开始处理图像
// 1.获取处理矩阵
// 记录一下初始状态。save()和restore()可以将图像过渡得柔和一些。
// Each save should be balanced with a call to restore().
camera.save();
Matrix matrix = newMatrix();
// rotate
camera.rotateX(rotateX);
camera.rotateY(rotateY);
camera.rotateZ(rotateZ);
// translate
camera.translate(0, 0, translateZ);
camera.getMatrix(matrix);
// 恢复到之前的初始状态。
camera.restore();
// 设置图像处理的中心点
matrix.preTranslate(tmpBit.getWidth() >> 1, tmpBit.getHeight() >> 1);
matrix.preSkew(skewX, skewY);
// matrix.postSkew(skewX, skewY);
// 直接setSkew(),则前面处理的rotate()、translate()等等都将无效。
// matrix.setSkew(skewX, skewY);
// 2.通过矩阵生成新图像(或直接作用于Canvas)
Log.d(“ANDROID_LAB”, “width=” + tmpBit.getWidth() + “ height=” + tmpBit.getHeight());
Bitmap newBit = null;
try{
// 经过矩阵转换后的图像宽高有可能不大于0,此时会抛出IllegalArgumentException
newBit = Bitmap.createBitmap(tmpBit, 0, 0, tmpBit.getWidth(), tmpBit.getHeight(), matrix, true);
} catch(IllegalArgumentException iae) {
iae.printStackTrace();
}
if(newBit != null) {
imgResult.setImageBitmap(newBit);
}
}

@Override
publicvoidonProgressChanged(SeekBar seekBar, intprogress, booleanfromUser) {
if(seekBar == seekbarXRotate) {
txtXRotate.setText(progress + “゜”);
rotateX = progress;
} elseif(seekBar == seekbarYRotate) {
txtYRotate.setText(progress + “゜”);
rotateY = progress;
} elseif(seekBar == seekbarZRotate) {
txtZRotate.setText(progress + “゜”);
rotateZ = progress;
} elseif(seekBar == seekbarXSkew) {
skewX = (progress - 100) * 1.0f / 100;
txtXTranslate.setText(String.valueOf(skewX));
} elseif(seekBar == seekbarYSkew) {
skewY = (progress - 100) * 1.0f / 100;
txtYTranslate.setText(String.valueOf(skewY));
} elseif(seekBar == seekbarZTranslate) {
translateZ = progress - 100;
txtZTranslate.setText(String.valueOf(translateZ));
}
refreshImage();
}

@Override
publicvoidonStartTrackingTouch(SeekBar seekBar) {

}

@Override
publicvoidonStopTrackingTouch(SeekBar seekBar) {

}
}

TGAS:AndroidgraphicsCamera图像旋转缩放
评论【共有0条评论】查看所有评论
昵称:(*)   邮箱:   QQ:   验证码: 看不清楚?点击刷新验证码