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

//获取图片方向
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"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值