4

私の問題

正しい方向にロードしたい一連のビットマップがあります。

画像を保存するとき、私は入って、を使用して方向属性を設定しますExifInterface

            ExifInterface exif = new ExifInterface(EXTERNAL_IMAGE_PATH+File.separator+this._currentPhotoName+JPEG_FILE_SUFFIX);
            int rotation = CCDataUtils.exifToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL));
            Log.v("PhotoManager", "Rotation:"+rotation);
            if (rotation > 0) {
                exif.setAttribute(ExifInterface.TAG_ORIENTATION,String.valueOf(0));

これは正常に機能し、この画像をデバイスから引き出すと、正しい向きになります。しかし、後でビットマップをデコードすると、画像がポートレートで撮影された場合でも、カメラのデフォルトの左水平方向のままになりますか?

私の質問

ビットマップをデコードして、そのEXIF情報を考慮に入れるにはどうすればよいですか?

別のビットマップを作成する必要があるため、毎回デコードした後に画像を回転させる必要はありません。これは、私が持っていないメモリです。

前もって感謝します。

4

1 に答える 1

1

これにも固執していて、複数のビットマップを操作するときにoomの問題が発生する場合は、ここが私の解決策です。

質問で最初に考えたようにexifデータを変更しないでください-これは後で必要になります。

表示する画像をデコードする場合、フルサイズの画像をデコードする代わりに、必要なサイズに縮小された画像をデコードするだけです。次のコード例には、ビットマップのデバイス画面サイズへのデコードと、ビットマップの回転の両方が含まれています。

public static Bitmap decodeFileForDisplay(File f){

    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);
        DisplayMetrics metrics = MyApplication.getAppContext().getResources().getDisplayMetrics();

        //The new size we want to scale to  
        //final int REQUIRED_SIZE=180;

        int scaleW =  o.outWidth / metrics.widthPixels;
        int scaleH =  o.outHeight / metrics.heightPixels;
        int scale = Math.max(scaleW,scaleH);
        //Log.d("CCBitmapUtils", "Scale Factor:"+scale);
        //Find the correct scale value. It should be the power of 2.

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        Bitmap scaledPhoto = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        try {
            ExifInterface exif = new ExifInterface(f.getAbsolutePath());
            int rotation = CCDataUtils.exifToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL));
            if (rotation > 0)
                scaledPhoto = CCBitmapUtils.convertBitmapToCorrectOrientation(scaledPhoto, rotation);

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return scaledPhoto;

    } catch (FileNotFoundException e) {}
    return null;
    }

public static Bitmap convertBitmapToCorrectOrientation(Bitmap photo,int rotation) {
    int width = photo.getWidth();
    int height = photo.getHeight();


    Matrix matrix = new Matrix();
    matrix.preRotate(rotation);

    return Bitmap.createBitmap(photo, 0, 0, width, height, matrix, false);

}

したがって、呼び出し後に返される画像ビットマップdecodeFileForDisplay(File f);は、画面の正しい向きと正しいサイズであり、メモリの問題を大幅に節約します。

私はそれが誰かを助けることを願っています

于 2012-10-23T15:21:34.147 に答える