5

写真の回転の問題コードにexifInterfaceを使用しています。以下のとおりです。カメラからキャプチャされた画像の向きの問題に直面しています。

  • ファイルからビットマップを作成します
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などのすべてのデバイスでこの問題を修正する方法。

みなさん、ありがとうございました。助けてください。

4

1 に答える 1

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;
}
于 2012-09-06T12:35:51.177 に答える