【问题标题】:Android Camera2 JPG to Base64 is rotated 90 degrees counter clockwiseAndroid Camera2 JPG to Base64 逆时针旋转90度
【发布时间】:2019-06-27 15:48:47
【问题描述】:

我正在研究一种使用 Camera2 API 拍照的方法。我首先克隆了 Google 的示例应用程序存储库。

sample app 有效;当通过设备上的文件浏览器查看时,以及在我的 Windows 机器上查看时,它会保存图像并正确定向。

但是,当我尝试用将图像转换为 Base64 的代码替换将图像保存到文件系统的代码时,该字符串(解码时)出现逆时针旋转 90 度。我见过类似的问题,声称图像本身是旋转的,但在这种情况下,它只是 base64 表示。这是我对示例应用所做的代码更改:

@Override
public void onImageAvailable(ImageReader reader) {
    Image image = reader.acquireLatestImage();
    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
    byte[] bytes = new byte[buffer.capacity()];
    buffer.get(bytes);

    byte[] encodedBytes = Base64.encode(bytes,Base64.NO_WRAP);
    String encodedString = new String(encodedBytes);

    Log.wtf(TAG, "Base64 JPG: " + encodedString);
}

我在日志行上放置了一个断点,这样我就可以提取出编码字符串的整个值。我使用了几个在线工具,例如this one,由于某种原因,它看起来向左旋转了 90 度。

这是将 Base64 转换为 JPG 的错误方式吗?我是否错误地解析了字节?

【问题讨论】:

  • 我不认为 Base64 编码有什么问题。许多设备的相机都有 90 度方向。当您以横向模式拍摄照片时,它可能会发生变化。这也会根据原始设备制造商而改变。例如。三星有时有不同的方向。您可以从相机配置中获取方向。
  • 我通过将 mSensorOrientation 调整为不同的值(如 0、270 等)以编程方式更改了传感器方向。这导致保存到文件系统的图像被旋转,但 base64 字符串仍在解码相同的方向。非常混乱。
  • 保存文件时,它具有包含方向的 EXIF 元数据,图库应用程序使用它来显示正确的方向。
  • @Froyo 谢谢。请随时将此作为答案,以便我接受。

标签: android base64 android-camera2


【解决方案1】:

编码没有问题。不同的硬件具有不同的传感器方向,它们通常具有 90 度的图像和视频方向。所以如果你直接将一个帧转换为字节,你会得到旋转后的图像。

相机按原样保存图像,但添加有关方向的 EXIF 元数据。图库应用程序将读取此方向元数据并以正确的方向加载位图。

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多