【问题标题】:How to attach EXIF metadata to a serialized Bitmap in Android?如何将 EXIF 元数据附加到 Android 中的序列化位图?
【发布时间】:2011-06-15 13:46:46
【问题描述】:

在 Android 中,当从手机上的照片中解码位图时,原始中的 EXIF 数据会丢失。我正在通过套接字将此Bitmap 发送到我的服务器,并希望将丢失的 EXIF 数据重新附加到正在发送的数据中。

我有一些代码从MediaStore 加载Bitmap 对象并将其压缩为字节数组以准备通过套接字发送:

Bitmap bitmap = ...
ByteArrayOutputStream stream = new ByteArrayOutputStream(bitmap);
bitmap.compress(CompressFormat.JPEG, 70, stream);
byte[] input = stream.toByteArray();

我想使用ExifInterface 来获取 SD 卡上原始 jpeg 中的 EXIF 元数据,并以某种方式将其添加到传出字节数组中,以便我能够提取包含所有在服务器端正确的 EXIF(希望不在服务器上这样做)。到目前为止,我设法使用ExifInterface 读取所有 EXIF 数据:

String path = ... //bitmap file path
ExifInterface exif = new ExifInterface(path);
... = exif.getAttribute(...)

编辑:最理想的情况是,我想找到一个不使用库的解决方案。如果我可以获取包含 EXIF 的原始 jpeg 字节数组的索引,并将这些字节添加/附加到bitmap.compress(...) 生成的字节数组中,那将是最好的。

【问题讨论】:

  • 向字节数组添加exif信息成功了吗?

标签: android exif


【解决方案1】:

感谢@Nick CampionSanselan

工作代码:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 100, bos); //Bitmap object is your image
byte[] data = bos.toByteArray();

TiffOutputSet outputSet = null;

IImageMetadata metadata = Sanselan.getMetadata(new File(filepath)); // filepath is the path to your image file stored in SD card (which contains exif info)
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
if (null != jpegMetadata)
{
    TiffImageMetadata exif = jpegMetadata.getExif();
    if (null != exif)
    {
        outputSet = exif.getOutputSet();
    }
}
if (null != outputSet)
{
    bos.flush();
    bos.close();
    bos = new ByteArrayOutputStream();
    ExifRewriter ER = new ExifRewriter();
    ER.updateExifMetadataLossless(data, bos, outputSet);
    data = bos.toByteArray(); //Update you Byte array, Now it contains exif information!
}

【讨论】:

  • 上面的代码在 Sanselan Android 上经常不能正常工作。特别是,如果您调整图像大小,上面的代码不仅会复制 EXIF 元数据,还会覆盖您的图像数据,从而撤消调整大小。似乎是其他人遇到的 Sanselan 问题:mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/…。我在这里写了一个解决这个问题的方法:bricolsoftconsulting.com/2012/12/08/…
  • 它适用于我。但是Sanselan 应该指向commons.apache.org/proper/commons-imaging 并且Sanselan.getMetadata 变成Imaging.getMetadata
  • 通过代码我看到保存的格式是 jpeg。或者你的意思是即使 BMP 也支持 exif ?甚至是 PNG 和 JPEG 以外的任何其他格式?
猜你喜欢
  • 2010-12-12
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多