我正在尝试获取jpeg图像的exif,但它不起作用。首先,我使用BufferedImage读取我的图像,然后将其转换为文件,然后应用与此处相同的代码:https://code.google.com/p/metadata-extractor/source/browse/Samples/com/drew/metadata/SampleUsage.java?name=2.5.1。我究竟做错了什么?为什么JpegSegmentReader.SEGMENT_APP1返回null?
File outfile = new File("image.jpg");
ImageIO.write(imagine, "jpg", outfile);
try{
JpegSegmentReader segmentReader = new JpegSegmentReader(outfile);
byte[] exifSegment = segmentReader.readSegment(JpegSegmentReader.SEGMENT_APP1);
System.out.println(Arrays.toString(segmentReader.readSegment(JpegSegmentReader.SEGMENT_APP1)));
byte[] iptcSegment = segmentReader.readSegment(JpegSegmentReader.SEGMENT_APPD);
Metadata metadata = new Metadata();
if (exifSegment != null)
new ExifReader().extract(new ByteArrayReader(exifSegment), metadata);
if (iptcSegment != null)
new IptcReader().extract(new ByteArrayReader(iptcSegment), metadata);
printImageTags(metadata);
}catch (JpegProcessingException e) {
System.err.println("error 3a: " + e);
}
答案 0 :(得分:1)
ImageIO.write()
没有编写Exif元数据*(APP1 / Exif)。它仅在APP0段中存储JFIF(有关Exif / JFIF的更多信息,请参阅WikiPedia上的JPEG)。因此,您的代码中永远不会有APP1段。
您正在编写的BufferedImage
或RenderedImage
中也没有可用的Exif元数据,因为这些类型的对象只包含像素数据。
如果要提取Exif元数据,您需要找到对原始文件的引用,并从中读取图像(imagine
)。
*)ImageIO
和标准JPEGImageWriter
可以编写Exif元数据,但前提是您使用IIOMetadata
API将Exif元数据传递给编写者。但我认为这与您的用例无关。