如何在Android中将EXIF元数据附加到序列化的位图?

18

在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的jpeg图像(希望不必在服务器上执行此操作)。到目前为止,我成功地使用ExifInterface读取了所有EXIF数据:

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

编辑:最理想的情况是找到不使用任何库的解决方案。如果我能够获得原始jpeg字节数组中包含EXIF的索引,并将这些字节前缀/后缀到由bitmap.compress(...)生成的字节数组中,那将是最好的。


你是否成功将Exif信息添加到字节数组中? - Vikas
1个回答

7

感谢 @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问题:http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%3C1299887792.2107.26.camel@jonah-desktop%3E。我在这里写了一个解决此问题的方法:http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/。 - Theo
它在我这里运行良好。但是Sanselan应该指向https://commons.apache.org/proper/commons-imaging/,而`Sanselan.getMetadata`变成了`Imaging.getMetadata`。 - Leon
通过代码我看到保存的格式是jpeg。你是说BMP也支持exif吗?还是除了PNG和JPEG之外还有其他格式? - kAmol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接