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

标签 java android metadata jpeg

在我正在编写的 Android 应用程序中,我有一个文档图像 (jpeg),该图像正在上传到识别该文档并向我发送回相关详细信息的服务器。虽然一切都很好,但服务器中的代码希望我设置“图像 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 上根本不可用。

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

最佳答案

要编辑该值,您需要首先创建一个用于存储 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/

相关文章:

java - 使用 Java 的 Selenium WebDriver 多线程和浏览器隐藏

java - 尽管存在绑定(bind)依赖性,但无法加载 StaticLoggerBinder

java - 如何在使用 JUnit、Spring Boot 和 TestContainers 的集成测试中防止数据冲突?

我的应用程序的 android:hardwareAccelerated 状态

iphone - 如何在 iOS 4+ 上正确使用 CGImageProperties.h

java - 将数据库类型映射到具体的 Java 类

java - Python 相当于 Java 的 getClass().getFields()

java - 安卓 : getting an item from a textview to another textview?

java - 接收byte[]并显示在ImageView android上

windows-runtime - 写入文件元数据 Windows 应用商店应用程序