Androidにある携帯の写真を撮って写真をアップロードして回転される問題を解決します。


需要:新浪のミニブログを模仿するプロジェクトをして、写真をアップロードすることができます。二つのプロジェクトは携帯で画像を撮影することができます。この二つはいずれも画像をサーバーにアップロードしなければなりません。
問題が発生しました。一部の携帯電話で撮影した写真は90度回転しています。180度回転しています。ある携帯電話は正常で、サーバーが要求しているのは正しいです。このように問題が来ました。ユーザーが写真を送ることができません。ミニブログで見たのは回転されたものです。他のプロジェクトで回転した写真は直接マッチングして問題が発生します。これはもっと深刻です。
始めの時はネットでいい解決方法が見つけられませんでした。GoogleのBaiduの検索は一つの解決方法を思いつきました。携帯電話の写真撮影が終わったら、結果処理の中ですぐに新しいページにジャンプして、新しいページでユーザー自身でマニュアルで画像を回転させて、クリックして確定します。サーバーが持っている写真にアップロードできます。第二の解決方法は、フォーラムで発見された方法であり、画像の属性を取得し、画像の回転角度を読み取ることができる。
第一の方式コード:
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> 

第二の方法:簡単で多くなりました。直接自分で盗撮して写真を処理しました。
onActivityResoultで処理します。

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にある携帯電話の写真を撮ってから写真をアップロードして回転される問題を解決しました。ありがとうございます。