Android - ImageView Orientation根据设备而变化

时间:2013-11-29 12:08:09

标签: android android-camera android-imageview exif android-bitmap

我制作了自定义相机应用程序,我想在ImageView上显示图片。我在3种不同的手机上推出了我的程序(HTC Desire Z,Galaxy S4和Galaxy S2)。 在HTC上,图像的方向在ImageView中受到尊重,但与Galaxys无关。

我的程序是这样的:

- >我用自定义相机应用程序拍照

- >我根据手机方向设置了图片的EXIF标志(OrientationEventListener):

switch(getOrientation(rot)){
                        case VERTICAL_ENDROIT : params.setRotation(90); break;
                        case HORIZONTAL_ENDROIT : params.setRotation(0); break;
                        case VERTICAL_ENVERS : params.setRotation(270); break;
                        case HORIZONTAL_ENVERS : params.setRotation(180); break;
                    }
camera.setParameters(params); 

此功能在所有手机上运行良好,它们都被检测到并指定正确的方向。

- >我将其保存为JPG格式

- >我将图片发送到ImageView

Bitmap bm2 = BitmapFactory.decodeFile(photoItem.getPathPhoto(),options);
imageView.setImageBitmap(bm2);

使用Galaxy,ImageView上的Orientation始终相同,对应于params.setRotation(0)。没问题HTC。

所以我试着在将图片发送到ImageView之前查看图片的exif标志:

int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);

奇怪的是,使用HTC时,方向始终为0值,而三星方向获得正确的值(1 3 6 8)。

结论: 使用Galaxy Phones EXIF方向值可以,但ImageView上的方向不好。

使用HTC手机EXIF方向值为false,但方向正常。 (wtf?)

感谢您的回答:)

PS:我不想使用Matrix或图像处理的东西,因为我的CPU /内存资源非常低

3 个答案:

答案 0 :(得分:0)

try {
        final File f = new File(directory, name);

        ExifInterface ei = new ExifInterface(f.getAbsolutePath());
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);

        try {
            switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                b = RotateBitmap(b, 90);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                b = RotateBitmap(b, 180);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                b = RotateBitmap(b, 270);
                break;
            // etc.
            }
        } catch (OutOfMemoryError err) {

        } catch (Exception e) {

        }

        return b;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

public static Bitmap RotateBitmap(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    source = Bitmap.createBitmap(source, 0, 0, source.getWidth(),
            source.getHeight(), matrix, true);
    if (source != null) {
        b = null;
    }
    return source;
}

此代码将执行您所需的功能。

答案 1 :(得分:0)

尝试以下代码

 try {
    File f = new File(imagePath);
    ExifInterface exif = new ExifInterface(f.getPath());
    int orientation = exif.getAttributeInt(
            ExifInterface.TAG_ORIENTATION,
            ExifInterface.ORIENTATION_NORMAL);
    int angle = 0;

    if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
        angle = 90;
    } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
        angle = 180;
    } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
        angle = 270;
    }

    Matrix mat = new Matrix();
    mat.postRotate(angle);
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 2;

    Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f),
            null, options);
    bitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(),
            bmp.getHeight(), mat, true);
    ByteArrayOutputStream outstudentstreamOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100,
            outstudentstreamOutputStream);
    imageView.setImageBitmap(bitmap);

} catch (IOException e) {
    Log.w("TAG", "-- Error in setting image");
} catch (OutOfMemoryError oom) {
    Log.w("TAG", "-- OOM Error in setting image");
}

答案 2 :(得分:0)

好吧,我发现为什么方向与Galaxy和HTC不一样。 HTC不使用EXIF标志来定位图片。图片以正确的方向原生保存。