avi*_*ara 2 java android jpeg metadata
在我正在编写的 Android 应用程序中,我有一个文档图像 ( jpeg ),该图像正在上传到识别该文档并向我发送回相关详细信息的服务器。虽然一切都很好,但服务器中的代码希望我设置“图像 DPI”元信息,如 mac 中所示,

上面的屏幕截图中显示的“图像 DPI”并不完全是它的值。我写了一个计算 dpi 值的方法。如何将如此计算的 dpi 值设置为jpeg的元信息?我已经能够在应用程序的 iOS 版本中设置这个特定的元信息,但在 Android 中,两天的不懈尝试让我的任务徒劳无功。
我确实知道ExifInterface,但我很不幸地使用了它的setAttribute(String key,String value)方法。(键应该是什么?值应该是什么?如何设置单位?我应该设置单位吗?)。
我还看到了与 Java 相关的解决方案,建议使用javax.imageio.*Android 根本不可用的包。
有人遇到过这样的问题吗?我该如何继续讨论这个问题?
要编辑该值,您需要首先创建一个byte[]用于存储Bitmap.compress(). 这是我的代码的一部分,我就是这样做的(输入是源位图)。
ByteArrayOutputStream uploadImageByteArray = new ByteArrayOutputStream();
input.compress(Bitmap.CompressFormat.JPEG, 100, uploadImageByteArray);
byte[] uploadImageData = uploadImageByteArray.toByteArray();
Run Code Online (Sandbox Code Playgroud)
基于JFIF结构,您需要编辑字节数组中的第13、14、15、16和17号索引。第 13 个指定密度类型,第 14 和 15 个指定 X 分辨率,第 16 和 17 个指定 Y 分辨率。我使用以下方法获取 dpi:
private long getDPIinFloat(int width, int height) {
return (long) Math.sqrt(width * width + height * height) / 4;
}
Run Code Online (Sandbox Code Playgroud)
获得 DPI 后,我必须进行一些位操作,如下所示:
long firstPart = dpiInFloat >> 8;
if (GlobalState.debugModeOn) {
Log.d(TAG, "First Part: " + firstPart);
}
long lastPart = dpiInFloat & 0xff;
if (GlobalState.debugModeOn) {
Log.d(TAG, "Last Part: " + lastPart);
}
Run Code Online (Sandbox Code Playgroud)
然后,像这样操作字节信息:
uploadImageData[13] = 1;
uploadImageData[14] = (byte) firstPart;
uploadImageData[15] = (byte) lastPart;
uploadImageData[16] = (byte) firstPart;
uploadImageData[17] = (byte) lastPart;
//Upload Image data to the server
Run Code Online (Sandbox Code Playgroud)
这样,我就可以在元数据上设置 dpi 信息。
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |