您的位置:首页 > 移动开发 > Android开发

一些有关Android图片的操作,判断方向,旋转,根据uri获取绝对路径,缩放与移动

2015-01-28 17:15 731 查看
//获取图片方向
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
//旋转图片
public static Bitmap rotate(Bitmap b, int degrees) {
if(degrees==0){
return b;
}
if (degrees != 0 && b != null) {
Matrix m = new Matrix();
m.setRotate(degrees, (float) b.getWidth() ,
(float) b.getHeight() );
try {
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
b.getHeight(), m, true);
if (b != b2) {
b.recycle(); // Android开发网再次提示Bitmap操作完应该显示的释放
b = b2;
}
} catch (OutOfMemoryError ex) {
// Android123建议大家如何出现了内存不足异常,最好return 原始的bitmap对象。.
}
}
return b;
}
//根据uri获取绝对路径
protected String getAbsoluteImagePath(Uri uri)
{
// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( uri,
proj,                 // Which columns to return
null,       // WHERE clause; which rows to return (all rows)
null,       // WHERE clause selection arguments (none)
null);                 // Order-by clause (ascending by name)

int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();

return cursor.getString(column_index);
}
//支持多点触控的缩放与移动
<span style="white-space:pre">	</span> Matrix matrix=new Matrix();
<span style="white-space:pre">	</span> Matrix savedMatrix=new Matrix();
<span style="white-space:pre">	</span> 
<span style="white-space:pre">	</span> PointF start=new PointF();
<span style="white-space:pre">	</span> PointF mid=new PointF();
<span style="white-space:pre">	</span> float oldDist;
<span style="white-space:pre">	</span> //模式
<span style="white-space:pre">	</span> static final int NONE=0;
<span style="white-space:pre">	</span> static final int DRAG=1;
<span style="white-space:pre">	</span> static final int ZOOM=2;
<span style="white-space:pre">	</span> int mode=NONE;
<span style="white-space:pre">	</span>ImageView image ;
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
ImageView myImageView=(ImageView) arg0;
switch(arg1.getAction()&MotionEvent.ACTION_MASK){
//设置拖拉模式
case MotionEvent.ACTION_DOWN:
matrix.set(myImageView.getImageMatrix());
savedMatrix.set(matrix);
start.set(arg1.getX(),arg1.getY());
mode=DRAG;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;

//设置多点触摸模式
case MotionEvent.ACTION_POINTER_DOWN:
oldDist=spacing(arg1);
if(oldDist>10f){
savedMatrix.set(matrix);
midPoint(mid, arg1);
mode=ZOOM;
}
break;
//若为DRAG模式,则点击移动图片
case MotionEvent.ACTION_MOVE:
if(mode==DRAG){
matrix.set(savedMatrix);
matrix.postTranslate(arg1.getX()-start.x,arg1.getY()-start.y);
}
//若为ZOOM模式,则点击触摸缩放
else if(mode==ZOOM){
float newDist=spacing(arg1);
if(newDist>10f){
matrix.set(savedMatrix);
float scale=newDist/oldDist;
//设置硕放比例和图片的中点位置
matrix.postScale(scale,scale, mid.x,mid.y);
}
}
break;
}
myImageView.setImageMatrix(matrix);

return true;
}
//计算移动距离
private float spacing(MotionEvent event){
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
return FloatMath.sqrt(x*x+y*y);
}
//计算中点位置
private void midPoint(PointF point,MotionEvent event){
float x=event.getX(0)+event.getX(1);
float y=event.getY(0)+event.getY(1);
point.set(x/2,y/2);

}
要在xml中将imageview设置为android:scaleType="matrix"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 图片