我正在研究使用Camera2 API拍照的方法。我首先克隆了Google的示例应用程序存储库。
sample app有效;通过设备上的文件浏览器以及在Windows计算机上查看图像时,它可以保存图像并正确定向。
但是,当我尝试将将图像保存到文件系统的代码替换为将图像转换为Base64的代码时,该String(解码时)看起来会逆时针旋转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的错误方法吗?我解析字节不正确吗?
答案 0 :(得分:1)
编码没有问题。不同的硬件具有不同的传感器方向,并且它们通常对图像和视频具有90度的方向。因此,如果直接将帧转换为字节,则会得到旋转的图像。
相机会按原样保存图像,但会添加有关方向的EXIF元数据。 Gallery应用程序将读取此方向元数据,并以正确的方向加载位图。