在我正在编写的Android应用程序中,我有一个文档图像( jpeg ),正在上传到识别该文档的服务器并向我发回相关详细信息。虽然一切都很好,服务器中的代码希望我设置" Image DPI"如mac所见的元信息,
"图像DPI"在上面的屏幕截图中显示的并不完全是它的值。我写了一个计算dpi值的方法。如何将如此计算的dpi值设置为 jpeg 文档的元信息?我已经能够在应用程序的iOS版本中设置这个特定的元信息,但在Android中,两天的不懈努力让我的差事徒劳无功。
我确实知道ExifInterface
,我不幸使用其setAttribute(String key,String value)
方法。 (键应该是什么?值应该是什么?如何设置单位?我应该设置单位吗?)。
我还看到了与Java相关的解决方案,建议使用javax.imageio.*
包,这对Android来说根本不可用。
有没有人遇到这样的问题?我如何继续讨论这个问题?
答案 0 :(得分:2)
要编辑值,您需要先创建一个存储byte[]
的{{1}}数组。这是我的代码的一部分,我只是这样做(输入是源Bitmap)。
Bitmap.compress()
基于JFIF结构,您需要编辑字节数组中的第13,14,15,16和17个索引。 13指定密度类型,X分辨率的第14和第15,以及保持Y分辨率的第16和第17。我使用以下方法获得了dpi:
ByteArrayOutputStream uploadImageByteArray = new ByteArrayOutputStream();
input.compress(Bitmap.CompressFormat.JPEG, 100, uploadImageByteArray);
byte[] uploadImageData = uploadImageByteArray.toByteArray();
获得DPI后,我不得不做一些操作:
private long getDPIinFloat(int width, int height) {
return (long) Math.sqrt(width * width + height * height) / 4;
}
然后,像这样操作字节信息:
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);
}
这样,我就能够在元数据上设置dpi信息。