Доступ к тегам jpeg с помощью java commons-imaging - PullRequest
0 голосов
/ 07 мая 2018

Как я могу получить доступ (чтение / запись) к тегам изображений jpeg, используя common-imaging или sanselan в Java, эта ссылка содержит некоторые пояснения оtopic.

enter image description here

Я пробовал следующий код, используя упомянутую библиотеку, пока sanselan, но без привязок.

public static void addImageHistoryTag(File file) {
    File dst = null;
    IImageMetadata metadata = null;
    JpegImageMetadata jpegMetadata = null;
    TiffImageMetadata exif = null;
    OutputStream os = null;
    TiffOutputSet outputSet = new TiffOutputSet();

    // establish metadata
    try {
        metadata = Sanselan.getMetadata(file);
    } catch (ImageReadException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // establish jpegMedatadata
    if (metadata != null) {
        jpegMetadata = (JpegImageMetadata) metadata;
    }

    // establish exif
    if (jpegMetadata != null) {
        exif = jpegMetadata.getExif();
    }

    // establish outputSet
    if (exif != null) {
        try {
            outputSet = exif.getOutputSet();
        } catch (ImageWriteException e) {
            e.printStackTrace();
        }
    }

    if (outputSet != null) {
        // check if field already EXISTS - if so remove
        TiffOutputField imageHistoryPre = outputSet
                .findField(TiffConstants.EXIF_TAG_XPCOMMENT);
        if (imageHistoryPre != null) {
            System.out.println("REMOVE");
            outputSet.removeField(TiffConstants.EXIF_TAG_XPCOMMENT);
        }
        // add field
        try {
            String fieldData = "Hallo";
            TiffOutputField imageHistory = new TiffOutputField(
                    TiffConstants.EXIF_TAG_XPTITLE,
                    TiffFieldTypeConstants.FIELD_TYPE_BYTE,
                    fieldData.length(),
                    fieldData.getBytes());

            TiffOutputDirectory exifDirectory = outputSet.getOrCreateExifDirectory();
            exifDirectory.removeField(TiffConstants.EXIF_TAG_XPTITLE);
            exifDirectory.add(imageHistory);

        } catch (ImageWriteException e) {

            e.printStackTrace();
        }
    }

    try {
        dst = new File("D:\\aa\\111.jpeg");
        os = new FileOutputStream(dst);
        os = new BufferedOutputStream(os);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // write/update EXIF metadata to output stream
    try {
        new ExifRewriter().updateExifMetadataLossless(file,
                os, outputSet);
    } catch (ImageReadException e) {
        e.printStackTrace();
    } catch (ImageWriteException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
            }
        }
    }
}

Этот код не влияет на теги сведений об изображении, поэтому я ищу правильную константу, которую можно использовать для доступа к «полю тегов»

1 Ответ

0 голосов
/ 07 мая 2018

Если вы используете обыкновенную визуализацию, не используйте Sanselan.getMetadata(file), используйте Imaging.getMetadata(file), чтобы быть последовательными. Насколько я знаю, Санселану не рекомендовалось делать снимки общего достояния.

Кроме того, вы можете попробовать установить MicrosoftTagConstants , в частности, EXIF_TAG_XPKEYWORDS. Для этого вам нужно использовать этот ответ .

...