Чтение / редактирование / запись jpg метаданных IPTC в Java - PullRequest
0 голосов
/ 03 июня 2018

Я использую Apache Commons, но мне этого недостаточно, потому что это такая старая технология.Итак, я нашел iCafe , и кажется, что лучше, но у меня ошибка ниже.Любая идея, что я делаю неправильно?

      private static List<IPTCDataSet> createIPTCDataSet() {
          List<IPTCDataSet> iptcs = new ArrayList<IPTCDataSet>();
          iptcs.add(new IPTCDataSet(IPTCApplicationTag.COPYRIGHT_NOTICE, "Copyright 2014-2016, yuwen_66@yahoo.com"));
          iptcs.add(new IPTCDataSet(IPTCApplicationTag.CATEGORY, "ICAFE"));
          iptcs.add(new IPTCDataSet(IPTCApplicationTag.KEY_WORDS, "Welcome 'icafe' user!"));

          return iptcs;
      }

      private static IPTC createIPTC() {
        IPTC iptc = new IPTC();
        iptc.addDataSets(createIPTCDataSet());
        return iptc;
      }

      public static void main(String[] args) throws  IOException {

        FileInputStream fin = new FileInputStream("C:/Users/rajab/Desktop/test/ibo.jpeg");
        FileOutputStream fout = new FileOutputStream("C:/Users/rajab/Desktop/test/ibo/ibo.jpeg");

        List<Metadata> metaList = new ArrayList<Metadata>();
        //metaList.add(populateExif(TiffExif.class));
        metaList.add(createIPTC());
        metaList.add(new Comments(Arrays.asList("Comment1", "Comment2")));

        Metadata.insertMetadata(metaList, fin, fout);
    }
}

и мое ИСКЛЮЧЕНИЕ

run: Исключение в потоке "main" java.lang.NoClassDefFoundError: org/ slf4j / LoggerFactory на com.icafe4j.image.meta.Metadata. (Неизвестный источник) на vectorcleaner.Metadata1.populateExif (Metadata1.java:41) на vectorcleaner.Metadata1.main (Metadata1.java:127). Причина: java.lang.ClassNotFoundException: org.slf4j.Launcher.java:349) в java.lang.ClassLoader.loadClass (ClassLoader.java:357) ... еще 3 C: \ Users \ rajab \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml: 53: Java вернул: 1 BUILD FAILED (общее время: 0 секунд)

1 Ответ

0 голосов
/ 07 июня 2018

Не уверен, что именно вы хотите, но вот что ICAFE может сделать с метаданными IPTC:

  • Считать IPTC из изображения.
  • Вставить IPTC в изображение или обновить IPTC существующего изображения.
  • Удалить IPTC из изображения.

Для чтения IPTC, вот пример:

    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    import java.util.Iterator;

    import com.icafe4j.image.meta.Metadata;
    import com.icafe4j.image.meta.MetadataEntry;
    import com.icafe4j.image.meta.MetadataType;
    import com.icafe4j.image.meta.iptc.IPTC;

    public class ExtractIPTC {

        public static void main(String[] args) throws IOException {
            Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(args[0]);
            IPTC iptc = (IPTC)metadataMap.get(MetadataType.IPTC);

            if(iptc != null) {
                Iterator<MetadataEntry> iterator = iptc.iterator();

                while(iterator.hasNext()) {
                    MetadataEntry item = iterator.next();
                    printMetadata(item, "", "     ");
                }
            }   
        }
        private void printMetadata(MetadataEntry entry, String indent, String increment) {
            logger.info(indent + entry.getKey() (StringUtils.isNullOrEmpty(entry.getValue())? "" : ": " + entry.getValue()));
            if(entry.isMetadataEntryGroup()) {
                 indent += increment;
                 Collection<MetadataEntry> entries = entry.getMetadataEntries();
                 for(MetadataEntry e : entries) {
                    printMetadata(e, indent, increment);
                 }          
            }
        }   
    }

Для вставки / обновления IPTC, вот пример:

    import java.io.IOException;
    import java.util.List;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;

    import com.icafe4j.image.meta.Metadata;
    import com.icafe4j.image.meta.MetadataEntry;
    import com.icafe4j.image.meta.MetadataType;
    import com.icafe4j.image.meta.iptc.IPTCDataSet;
    import com.icafe4j.image.meta.iptc.IPTCApplicationTag;

    public class InsertIPTC {

        public static void main(String[] args) throws IOException {
           FileInputStream fin = new FileInputStream("C:/Users/rajab/Desktop/test/ibo.jpeg");
           FileOutputStream fout = new FileOutputStream("C:/Users/rajab/Desktop/test/ibo/ibo.jpeg");

           Metadata.insertIPTC(fin, fout, createIPTCDataSet(), true);
        }
        private static List<IPTCDataSet> createIPTCDataSet() {
            List<IPTCDataSet> iptcs = new ArrayList<IPTCDataSet>();
            iptcs.add(new IPTCDataSet(IPTCApplicationTag.COPYRIGHT_NOTICE, "Copyright 2014-2016, yuwen_66@yahoo.com"));
            iptcs.add(new IPTCDataSet(IPTCApplicationTag.OBJECT_NAME, "ICAFE"));
            iptcs.add(new IPTCDataSet(IPTCApplicationTag.KEY_WORDS, "Welcome 'icafe' user!"));

            return iptcs;
        }
    }

В приведенном выше примере вместо Metadata.insertMetadata используется Metadata.insertIPTC, потому что нам нужен еще один логический параметр.Если установлено значение true, он сохранит существующие данные IPTC и обновит только те, которые нам нужны.Некоторые из записей IPTC допускают несколько значений.В этом случае мы только добавляем / добавляем новые.Для других уникальных записей они будут заменены новыми.

Похоже, вы хотите добавить ключевые слова и заголовок.В своем вопросе вы уже показали код для вставки ключевых слов, а для вставки заголовка используйте OBJECT_NAME, который можно найти в приведенном выше примере.

Примечание: вы также можете добавить несколько ключевых слов.Некоторые программы могут обрабатывать только одну запись ключевых слов.В этом случае вы можете поместить все ключевые слова в одну запись, разделенные точкой с запятой, вместо вставки нескольких записей.

...