在我正在编写的 Android 应用程序中,我有一个文档图像 (jpeg),该图像正在上传到识别该文档并向我发送回相关详细信息的服务器。虽然一切都很好,但服务器中的代码希望我设置“图像 DPI”元信息,如 mac 中所示,
上面屏幕截图中显示的“图像 DPI”并不完全是其值。我写了一个计算 dpi 值的方法。如何将如此计算出的 dpi 值设置为我的 jpeg 文档的元信息?我已经能够在应用程序的 iOS 版本中设置这个特定的元信息,但在 Android 中,两天的不懈尝试让我的任务徒劳无功。
我确实了解ExifInterface
,但我很不幸地使用了它的setAttribute(String key,String value)
方法。 (键应该是什么?值应该是什么?如何设置单位?我应该设置单位吗?)。
我还看到了与 Java 相关的解决方案,建议使用 javax.imageio.*
包,该包在 Android 上根本不可用。
有人遇到过这样的问题吗?我该如何继续讨论这个问题?
最佳答案
要编辑该值,您需要首先创建一个用于存储 Bitmap.compress()
的 byte[]
数组。这是我的代码的一部分,我就是这样做的(输入是源位图)。
ByteArrayOutputStream uploadImageByteArray = new ByteArrayOutputStream();
input.compress(Bitmap.CompressFormat.JPEG, 100, uploadImageByteArray);
byte[] uploadImageData = uploadImageByteArray.toByteArray();
基于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;
}
获得 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);
}
然后,像这样操作字节信息:
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
这样,我就能够在元数据上设置 dpi 信息。
关于java - 在 Android 中设置 jpeg 文件的 DPI 元信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24927283/