2014-07-03 66 views
1

我想獲得一個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?元數據提取java沒有提取exif或iptc

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); 
     } 

回答

1

ImageIO.write()不寫元數據的Exif *(APP1/EXIF)。它僅存儲APP0段中的JFIF(有關Exif/JFIF的更多信息,請參閱WikiPedia上的JPEG)。正因爲如此,代碼中永遠不會有APP1段。

您正在編寫的BufferedImageRenderedImage中也沒有可用的Exif元數據,因爲這些類型的對象只包含像素數據。

如果要提取Exif元數據,則需要從中讀取原始文件的引用並從中讀取圖像(imagine)。

*)ImageIO和標準JPEGImageWriter可以寫的Exif元數據,但只有當你傳遞的Exif元數據寫入器,使用IIOMetadata API。但我認爲這與您的使用案例無關。