ImageView位图的方向不正确

时间:2014-06-05 10:12:31

标签: android bitmap imageview orientation

我已经看过几个关于这个主题的问题,但没有一个能解决我的问题。

我动态创建ImageViews并允许用户为库存拍摄/添加项目照片。以下代码用于生成Bitmap并填充ImageView:

protected void addPhotosToView(ArrayList<String> uris) {
    for (String uriString : uris) {
        try {
            Uri uri = Uri.parse(uriString);
            File imageFile = new File(uri.getPath());
            int orientation = resolveBitmapOrientation(imageFile);
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
            bitmap = applyOrientation(bitmap, orientation);

            ImageView image = new ImageView(ItemActivity.this);

            int h = 100; // height in pixels
            int w = 100; // width in pixels    
            Bitmap scaled = Bitmap.createScaledBitmap(bitmap, h, w, true);

            image.setImageBitmap(scaled);

            LinearLayout photoLayout = (LinearLayout) findViewById(R.id.itemPhotoLayout);
            photoLayout.addView(image);

            addClickListener(image, uri);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

但是一旦添加或拍摄图像,某些图像会以错误的方向显示。存储在手机中的一些照片以肖像方式显示,而其他照片则显示为横向。风景照片同样是随意的。

这似乎并非在所有设备上发生(我看到的设备是三星S4)

正如您在代码中看到的那样,我尝试使用Exif标记来获取/应用方向更改,但我使用此设备的方向总是为0,并且没有看到任何要求提出问题的答案方向始终为0时的解决方案。

我希望尽快发布此软件并需要某种解决方法或解决方案,因此我愿意接受其他一些从Uris /字符串转到动态,可水平滚动的正确列表的方法如果不能以任何其他方式解决这个问题,可以使用面向图像。

2 个答案:

答案 0 :(得分:1)

你需要解码所有尝试this tutorial的位图,你可以下载源代码。 该应用程序完全符合您的要求,也许它会帮助您,我希望因为它适用于我的应用程序

答案 1 :(得分:-1)

请使用此方法显示/解码您的位图。它取自另一个SO帖子,我无法记住哪个并且被修改以供我使用。如果图像上存在exif方向数据,此方法返回位图:

public Bitmap decodeFile(String path) {// you can provide file path here
    int orientation;
    try {
        if (path == null) {
            return null;
        }
        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;
        // final int REQUIRED_SIZE = 20;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 0;
        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);
        Matrix m = new Matrix();
        if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) {
            m.postRotate(180);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                    bm.getHeight(), m, true);
            photo(bitmap, path);
            return bitmap;
        } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
            m.postRotate(90);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                    bm.getHeight(), m, true);
            photo(bitmap, path);
            return bitmap;
        } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
            m.postRotate(270);
            bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                    bm.getHeight(), m, true);
            photo(bitmap, path);
            return bitmap;
        }
        return bitmap;
    } catch (Exception e) {
        return null;
    }

}