欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

解决android有的手机拍照后上传图片被旋转的问题

程序员文章站 2024-03-05 22:31:01
需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,...

需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器
遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重。

解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法,可以获取图片的属性,读取图片的旋转角度。

第一种方式代码:

在onactivityresult里面处理跳转

<span style="font-size:18px;">   intent intent = new intent(sendmicoblog.this, rotaingactivity.class); 
    myapp myapp = (myapp)getapplication(); 
    myapp.setname(bitmap);//修改之后的名称 
    myapp.setphoto(isphoto); 
    startactivityforresult(intent, 1);</span> 

在rotaingactivity里面就可以作相应的旋转处理了

<span style="font-size:18px;">   //获取bitmap 
    myapp myapp = (myapp)getapplication(); 
    bitmap = myapp.getname(); 
    system.out.println("rotaingactivity w = " + bitmap.getwidth() + "h = " + bitmap.getheight()); 
    mybitmap = bitmap; 
    mywidth = bitmap.getwidth(); 
    myheight = bitmap.getheight(); 
     
    // 创建操作图片用的matrix对象 
    matrix = new matrix(); 
    drawable drawable = imagedispose.bitmaptodrawable(bitmap); 
    imageview.setbackgrounddrawable(drawable); 
     
     
    btncancel.setonclicklistener(new onclicklistener() { 
       
      @override 
      public void onclick(view v) { 
         
        rotaingactivity.this.finish(); 
      } 
    }); 
     
    btnrightrotaing.setonclicklistener(new onclicklistener() { 
       
      @override 
      public void onclick(view v) { 
        mybitmap = rotaingimageview(-90); 
      } 
    }); 
     
    btnleftrotaing.setonclicklistener(new onclicklistener() { 
       
      @override 
      public void onclick(view v) { 
        mybitmap = rotaingimageview(+90); 
      } 
    }); 
     
    btnok.setonclicklistener(new onclicklistener() { 
       
      @override 
      public void onclick(view v) { 
        myapp myapp = (myapp)getapplication(); 
        myapp.setname(mybitmap);//修改之后 
        system.out.println("ok resultcoder"); 
        intent intent = new intent(rotaingactivity.this, sendmicoblog.class); 
        setresult(6, intent); 
        rotaingactivity.this.finish(); 
      } 
    }); 
  } 
  private bitmap rotaingimageview(int angle2) { 
    //旋转图片 动作 
    matrix.postrotate(angle2); 
    system.out.println("angle2=" + angle2); 
    // 创建新的图片 
    bitmap resizedbitmap = bitmap.createbitmap(bitmap, 0, 0, 
        mywidth, myheight, matrix, true); 
    drawable drawable = imagedispose.bitmaptodrawable(resizedbitmap); 
    imageview.setbackgrounddrawable(drawable);    
    return resizedbitmap; 
  }</span> 

第二种方式:就简单多了,直接自己出偷着把照片给处理了,不需要用户的操作,这样体验会更好一点。

在onactivityresult里面处理

bitmapfactory.options bitmapoptions = new bitmapfactory.options(); 
bitmapoptions.insamplesize = 8; 
file file = new file(sd_card_temp_dir); 
/** 
 * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转 
 */ 
int degree = imagedispose.readpicturedegree(file.getabsolutepath()); 
<span style="font-size:18px;">bitmap camerabitmap = bitmapfactory.decodefile(sd_card_temp_dir, bitmapoptions); 
bitmap = camerabitmap; 
/** 
 * 把图片旋转为正的方向 
 */ 
bitmap = imagedispose.rotaingimageview(degree, bitmap); 
upload(bitmap);</span> 

<span style="font-size:18px;"> /** 
   * 旋转图片 
   * @param angle 
   * @param bitmap 
   * @return bitmap 
   */ 
  public static bitmap rotaingimageview(int angle , bitmap bitmap) { 
    //旋转图片 动作 
    matrix matrix = new matrix();; 
    matrix.postrotate(angle); 
    system.out.println("angle2=" + angle); 
    // 创建新的图片 
    bitmap resizedbitmap = bitmap.createbitmap(bitmap, 0, 0, 
        bitmap.getwidth(), bitmap.getheight(), matrix, true); 
    return resizedbitmap; 
  }</span> 

/** 
 * 读取图片属性:旋转的角度 
 * @param path 图片绝对路径 
 * @return degree旋转的角度 
 */ 
  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; 
  } 

 

这样就搞定了,此时你上传的照片就是正的了。

第一种方式的图片

解决android有的手机拍照后上传图片被旋转的问题

以上就是对解决android有的手机拍照后上传图片被旋转的问题,谢谢大家对本站的支持!