1

我正在尝试获取 jpeg 图像的 exif,但它不起作用。首先,我使用 BufferedImage 读取图像并将其转换为文件,然后应用与此处相同的代码:https ://code.google.com/p/metadata-extractor/source/browse/Samples/com/drew/元数据/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);
        }
4

1 回答 1

1

ImageIO.write()不写入 Exif 元数据* (APP1/Exif)。它仅在 APP0 段中存储 JFIF(有关 Exif/JFIF 的更多信息,请参阅WikiPedia 上的JPEG )。因此,您的代码中永远不会有 APP1 段。

BufferedImage您正在编写的或中也没有可用的 Exif 元数据RenderedImage,因为这些类型的对象仅包含像素数据。

如果要提取 Exif 元数据,则需要找到对从中读取图像 ( imagine) 的原始文件的引用,然后从那里读取。

*)ImageIO并且标准JPEGImageWriter 可以写入 Exif 元数据,但前提是您使用IIOMetadataAPI 将 Exif 元数据传递给编写器。但我认为这与您的用例无关。

于 2014-07-03T12:38:27.680 回答