2012-09-06 23 views
5

写真の回転にexifInterfaceを使用しています。以下のコードが問題点です。Androidの携帯電話でカメラキャプチャした画像の向きの問題

Bitmap b = BitmapFactory.decodeFile(imagePath); 
  • が適切なレベルにそれをスケーリングして、ビットマップのサイズを変更したファイルからビットマップを作成
int width = b.getWidth(); 
int height = b.getHeight(); 
int newWidth = 150; 
int newHeight = 150; 
float scaleWidth = ((float) newWidth)/width; 
float scaleHeight = ((float) newHeight)/height; 
Matrix matrix = new Matrix(); 
matrix.postScale(scaleWidth, scaleHeight); 
// Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, width, height, matrix, true); 
// resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, out); 
  • 画像のハンドルの向き
ExifInterface exif = new ExifInterface(imagePath); 
    String orientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 
    if (orientation.equals(ExifInterface.ORIENTATION_NORMAL)) { 
      // Do nothing. The original image is fine. 
    } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_90+"")) { 
      matrix.postRotate(90); 
    } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_180+"")) { 
      matrix.postRotate(180); 
    } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_270+"")) { 
      matrix.postRotate(270); 
} 
  • 保存新しいビットマップ
out = new FileOutputStream(new File("some output file path")); 
    Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, width, height, matrix, true); 
    resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, out); 

このコードは解決回転の問題のために働いていない、私に指針を与えてください。 Lgデバイスでは、exifinterfaceは常に0の方向を返し、Samsungデバイスは6と1を返します。

htc、Motorola、samsung、Sony、LGなどのすべてのデバイスでこの問題を解決する方法。

私はあなたにすべて感謝しています。

答えて

7

この機能を使用して、同じ機能を実行できます。あなたのアクティビティやutilクラスでこの機能を持って、それを呼び出してファイルパスからビットマップを取得してください。

私はこのアプリケーションを自分のアプリケーションで使用していて、私の素手のテストデバイスはLGです。

public static Bitmap decodeFile(String path) { 
    int orientation; 
    try { 
     if (path == null) { 
      return null; 
     } 
     // decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     // Find the correct scale value. It should be the power of 2. 
     final int REQUIRED_SIZE = 70; 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 8; 
     while (true) { 
      if (width_tmp/2 < REQUIRED_SIZE 
        || height_tmp/2 < REQUIRED_SIZE) 
       break; 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale++; 
     } 
     // decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     Bitmap bm = BitmapFactory.decodeFile(path, o2); 
     Bitmap bitmap = bm; 

     ExifInterface exif = new ExifInterface(path); 
     orientation = exif 
       .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
     Log.e("orientation", "" + orientation); 
     Matrix m = new Matrix(); 

     if ((orientation == 3)) { 
      m.postRotate(180); 
      m.postScale((float) bm.getWidth(), (float) bm.getHeight()); 
      // if(m.preRotate(90)){ 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), m, true); 
      return bitmap; 
     } else if (orientation == 6) { 
      m.postRotate(90); 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), m, true); 
      return bitmap; 
     } 
     else if (orientation == 8) { 
      m.postRotate(270); 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), m, true); 
      return bitmap; 
     } 
     return bitmap; 
    } catch (Exception e) { 
    } 
    return null; 
} 
+0

HTCでもテストしましたか? – user991429

+0

はい、HTCエクスプローラでアプリをテストしても、LG Optimus Blackとして正常に動作します。 @ user991429 – MKJParekh

+0

@MKJParekh:素晴らしい仕事、ありがとう:) – Aerrow

関連する問題