在Android中为jpeg文件设置DPI元信息

时间:2014-07-24 07:13:52

标签: java android metadata jpeg

在我正在编写的Android应用程序中,我有一个文档图像( jpeg ),正在上传到识别该文档的服务器并向我发回相关详细信息。虽然一切都很好,服务器中的代码希望我设置" Image DPI"如mac所见的元信息,

Screen-shot of the meta-information of an image

"图像DPI"在上面的屏幕截图中显示的并不完全是它的值。我写了一个计算dpi值的方法。如何将如此计算的dpi值设置为 jpeg 文档的元信息?我已经能够在应用程序的iOS版本中设置这个特定的元信息,但在Android中,两天的不懈努力让我的差事徒劳无功。

我确实知道ExifInterface,我不幸使用其setAttribute(String key,String value)方法。 (键应该是什么?值应该是什么?如何设置单位?我应该设置单位吗?)。

我还看到了与Java相关的解决方案,建议使用javax.imageio.*包,这对Android来说根本不可用。

有没有人遇到这样的问题?我如何继续讨论这个问题?

1 个答案:

答案 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信息。