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

Java 在Android中设置jpeg文件的DPI元信息,java,android,metadata,jpeg,Java,Android,Metadata,Jpeg,在我正在编写的一个Android应用程序中,我有一个文档图像(jpeg),它被上传到一个服务器上,该服务器可以识别文档并将相关细节发回给我。虽然一切都很好,但服务器中的代码希望我设置mac中的“图像DPI”元信息,就像这样 上面截图中显示的“图像DPI”并不完全是它的值。我编写了一个计算dpi值的方法。如何将计算出的dpi值设置为jpeg文档的元信息?我已经能够在应用程序的iOS对应程序中设置这个特定的元信息,但在Android中,两天的不懈尝试使我的差事徒劳无功 我确实知道ExifInter

在我正在编写的一个Android应用程序中,我有一个文档图像(jpeg),它被上传到一个服务器上,该服务器可以识别文档并将相关细节发回给我。虽然一切都很好,但服务器中的代码希望我设置mac中的“图像DPI”元信息,就像这样

上面截图中显示的“图像DPI”并不完全是它的值。我编写了一个计算dpi值的方法。如何将计算出的dpi值设置为jpeg文档的元信息?我已经能够在应用程序的iOS对应程序中设置这个特定的元信息,但在Android中,两天的不懈尝试使我的差事徒劳无功

我确实知道
ExifInterface
,而且我在使用它的
setAttribute(字符串键、字符串值)
方法时运气不好。(键应该是什么?值应该是什么?我如何设置单位?我应该设置单位吗?)

我还看到了与Java相关的解决方案,建议使用Android无法使用的
javax.imageio.*


有人遇到过这样的问题吗?我该如何处理这个问题

要编辑该值,首先需要创建一个
字节[]
数组,该数组将存储
位图.compress()
。这是我的代码的一部分,我就是这样做的(输入是源位图)

根据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
然后,像这样操作字节信息:

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信息

你有什么结论吗?是的,我找到了解决办法。解决方案马上就出来。大卫,这是答案。谢谢,我已经实现了代码,我得到了456 dpi的图像。我相信私有的long getDPIinFloat(int-width,int-height)是图像的宽度和高度,我还尝试返回float DP=200,您知道需要在何处插入值以获得200 dpi吗?x dpi由字节数组的14和15位置表示。您需要将dpi信息转换为由代码中的
firstPart
secondPart
变量参与的位。