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 回答