Метаданные экстрактор Java не извлекает EXIF или Iptc
Я пытаюсь получить EXIF изображения JPEG, но это не работает. Сначала я читаю свое изображение с помощью BufferedImage и преобразовываю его в файл, а затем применяю тот же код, что и здесь: https://code.google.com/p/metadata-extractor/source/browse/Samples/com/drew/metadata/SampleUsage.java?name=2.5.1. Что я делаю неправильно? Почему JpegSegmentReader.SEGMENT_APP1 возвращает ноль?
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). Он хранит только JFIF (для получения дополнительной информации о Exif/JFIF, см. JPEG на WikiPedia) в сегменте APP0. Из-за этого в вашем коде никогда не будет сегмента APP1.
Также нет метаданных Exif в BufferedImage
или же RenderedImage
что вы пишете, так как объекты этих типов содержат только данные пикселей.
Если вы хотите извлечь метаданные Exif, вам нужно найти ссылку на исходный файл, который вы прочитали изображение (imagine
) и прочитайте оттуда.
*) ImageIO
и стандарт JPEGImageWriter
может записывать метаданные Exif, но только если вы передаете метаданные Exif разработчику, используя IIOMetadata
API. Но я не думаю, что это актуально для вашего варианта использования.