Android:Byte[]或位图对象的Exif

Android:Byte[]或位图对象的Exif,android,caching,exif,Android,Caching,Exif,是否可以读取字节[]或位图对象的Exif头而不将其写入磁盘? 我只找到了一个构造函数,而且似乎不可能做到这一点。你能确认一下吗 否则,如何将该位图保存在缓存目录中并将其取回以读取Exif头?位图没有Exif头。您可以将位图另存为.png,但exif不适用于.png。可以将位图另存为.jpg文件。但届时它将没有进出口信息。但我希望你可以用ExiFinInterface添加它 如果一个字节数组包含一个带有exif头的.jpg文件就可以了。但是Exifinterface无法真正阅读到它。您可以使用我的

是否可以读取字节[]或位图对象的Exif头而不将其写入磁盘? 我只找到了一个构造函数,而且似乎不可能做到这一点。你能确认一下吗


否则,如何将该位图保存在缓存目录中并将其取回以读取Exif头?

位图没有Exif头。您可以将位图另存为.png,但exif不适用于.png。可以将位图另存为.jpg文件。但届时它将没有进出口信息。但我希望你可以用ExiFinInterface添加它

如果一个字节数组包含一个带有exif头的.jpg文件就可以了。但是Exifinterface无法真正阅读到它。

您可以使用我的库。它的类将从
字节[]
解码Exif(和其他格式)、流、文件

像这样的方法应该会奏效:

Metadata metadata = new Metadata();
new ImageMetadataReader().extract(new ByteArrayReader(bytes), metadata);
现在可以检查
元数据
对象


该库可通过Maven获得。

我无法使用@Drew Noakes的示例代码,读取jpg byte[]数据时出错:

GrallocMapperPassthrough: buffer descriptor with invalid usage bits 0x2080000
System.err: com.drew.imaging.tiff.TiffProcessingException: Unclear distinction between Motorola/Intel byte ordering: -40
System.err:     at com.drew.imaging.tiff.TiffReader.processTiff(TiffReader.java:60)
然后我改为下面的代码,它的工作

try {
    Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(data), data.length, FileType.Jpeg);
    for (Directory directory : metadata.getDirectories()) {
        for (Tag tag : directory.getTags()) {
            Log.d(TAG, tag.toString());
        }
    }
} catch (IOException e) {
    e.printStackTrace();
} catch (ImageProcessingException e) {
    e.printStackTrace();
}

是的,它是一个jpg文件。我拍了一张照片并保存在服务器上。问题是,当它返回时,图片的方向发生了变化。这就是为什么我需要读取Exif元数据才能正确显示它的原因。你知道这一点吗Denis?我也在为同样的事情挣扎。如果你上传一个jpg文件到服务器上,exif的方向不会改变。或者如果你下载一个。在这两者之间,你做错了什么。在1-10的难度范围内,解压JPEG图像可能是8,而解析EXIF信息则接近2。在JPEG标记列表中查找包含EXIF头的APP1,然后处理伪TIFF文件以查找方向标记并不困难。如果不困难,请显示一些代码@BitBank。您的示例不适用于我,读取jpg byte[]数据时出现错误“com.drew.imaging.tiff.TiffProcessingException:摩托罗拉/英特尔字节顺序之间的区别不清楚:-40”。然后我改为下面的代码,它的工作!!Metadata Metadata=ImageMetadataReader.readMetadata(新的ByteArrayInputStream(数据),data.length,FileType.Jpeg)@fantouch谢谢,如果您有完整的图像文件数据,您可以使用
ImageMetadataReader
。如果出于某种原因您只有Exif段,请使用
ExifReader
。如果您有完整图像的数据,请使用
ImageMetadataReader
。如果您以某种方式从某处提取了Exif数据,请使用
ExifReader
。我更新了我的答案,因为用户更有可能拥有完整的图像数据。