当前位置: 首页 > 面试题库 >

图像方向-Android

宋高扬
2023-03-14
问题内容

在过去一个月左右的时间里,我一直在努力地解决这个错误。每当我认为我已修复它时,它似乎都会以某种形式返回。

这是旧的Android“图像旋转90度”错误。我在这里(StackOverFlow)上阅读了无数篇文章,还尝试了许多方法,但似乎无法修复它。

我仍然收到旋转不正确的图像。

在我的应用程序中,用户选择他/她的个人资料图片,然后将其设置为ImageView。该图像是从“电话图库”中选择的

两天前,我实现了以下代码,该代码适用于在手机上测试过的所有图像。但是,当我的Beta测试人员中的一位尝试该操作时,他的图像又被旋转了。他将图像发送给我进行测试,但这些图像在我的手机上显示正常。因此,为什么我越来越沮丧。

这是我用来获取图像方向的方法:

// Gets an Images Orientation
public static int getOrientationEXIF(Context context, Uri uri) {

    int orientation = 0;

    try {

        ExifInterface exif = new ExifInterface(uri.getPath());

        orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        switch (orientation) {

            case ExifInterface.ORIENTATION_ROTATE_90:
                orientation = 90;
                return orientation;

            case ExifInterface.ORIENTATION_ROTATE_180:
                orientation = 180;
                return orientation;

        }

    } catch (IOException e) {
        e.printStackTrace();
    }

    return 0;
}

然后,我使用以下方法获得旋转的位图:

// Rotate a Bitmap
public static Bitmap rotate(float rotationValue, String filePath) {
    Bitmap original= BitmapFactory.decodeFile(filePath);

    int width = original.getWidth();

    int height = original.getHeight();

    Matrix matrix = new Matrix();

    matrix.postRotate(rotationValue);

    Bitmap rotated = Bitmap.createBitmap(original, 0, 0, width, height, matrix, true);

    return rotated;
}

我只是不确定该怎么办了。

如果有人可以帮助我解决问题,我真的很喜欢

先感谢您

更新

实现建议的方法后,我在日志中看到了以下代码行:

JHEAD can't open 'file:/external/images/media/3885'

我不确定这是什么意思

更新#2

我想我可能已经解决了这个问题,我得到了文件的正确图像路径。


问题答案:

您需要考虑所有方向,而不仅仅是90或180。我正在使用

    File curFile = new File("path-to-file"); // ... This is an image file from my device.
    Bitmap rotatedBitmap;

            try {
                ExifInterface exif = new ExifInterface(curFile.getPath());
                int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
                int rotationInDegrees = exifToDegrees(rotation);
                Matrix matrix = new Matrix();
                if (rotation != 0f) {matrix.preRotate(rotationInDegrees);}
                rotatedBitmap = Bitmap.createBitmap(bitmap,0,0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);


            }catch(IOException ex){
                Log.e(TAG, "Failed to get Exif data", ex);
            }

和:

 /**
 * Gets the Amount of Degress of rotation using the exif integer to determine how much
 * we should rotate the image.
 * @param exifOrientation - the Exif data for Image Orientation
 * @return - how much to rotate in degress
 */
private static int exifToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; }
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {  return 180; }
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {  return 270; }
    return 0;
}


 类似资料:
  • 我正在写一个定制的肖像相机,我在图像方向上有一些问题。具体而言,我需要始终将相机设置为纵向,并使用清单配置: Android:屏幕方向="肖像" 我在应用程序中设置: 这是有效的,因为当我旋转设备(90,180,270度)时,我可以看到(从相机预览)正确的图像。 我不在乎设备方向何时被锁定(禁用),但当它启用时,我似乎没有得到任何方向更改。我总是使用代码获得0度: 从技术上讲,我需要写入拍摄的照片

  • 我是新的Android和工作在一个项目中,我必须使用自定义相机与覆盖图像捕获图像。 我可以用叠加(组合图像)捕获图像,但问题是叠加图像方向在保存新的组合图像后发生变化,即叠加图像主要设置在纵向模式,但在保存后显示在横向模式。 我已经搜索了很多关于如何改变可绘制图像的方向,但所有方向的改变都是针对位图图像的。若我将可绘制图像更改为位图并更改旋转,它不会显示任何覆盖图像。我不知道代码出了什么问题。我的

  • 本文向大家介绍Python OpenCV处理图像之图像直方图和反向投影,包括了Python OpenCV处理图像之图像直方图和反向投影的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python OpenCV图像直方图和反向投影的具体代码,供大家参考,具体内容如下 当我们想比较两张图片相似度的时候,可以使用这一节提到的技术 直方图对比 反向投影 关于这两种技术的原理可以参考我上面贴的

  • 我知道如何检测和更改图像的方向,这是使用从设备捕获的。现在我在想,我该如何检测来自URL而非设备的图像方向? 例如,我有一个ImageLoader类,该类具有DisplayImage函数,可以将位图从URL设置为ImageView: 保存图像类 在活动中调用的DisplayFunction,用于从URL在ImageView中显示图像: 这就是我迄今为止所尝试的: 在DisplayImage方法内的

  • 在我的应用程序中,我添加了图像上传功能,它可以很好地处理除相机图像之外的所有图像,每当我从画廊浏览相机图像时,肖像图像旋转90度。下面是我的代码片段。有人能帮我吗?我遵循了很多教程,但它们在kikat中都很好。但当同一教程不适用于ics、jellybean等时。。

  • 我在Wordpress中创建了自定义图像大小,用于Wordpress默认安装的响应图像插件。我添加的图像大小为: 然后,我使用metabox.io插件从PHP构建图像,并将加载的图像设置为显示为纵向案例研究lg。然后,我使用metabox.io中的函数加载srcset,并创建了我想要更改图像的自定义大小。 结果如下所示: 我的问题是,它现在正在加载宽度和高度为768x512的风景图像,而不是加载5