当前位置: 首页 > 知识库问答 >
问题:

在Java中读取/编辑/写入jpg IPTC元数据

齐胜涝
2023-03-14

我正在使用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);
    }
}

还有我的例外

运行:线程“main”java中出现异常。lang.NoClassDefFoundError:org/slf4j/LoggerFactory位于com。icafe4j。形象元。元数据。(未知来源)在vectorcleaner。元数据1。vectorcleaner上的PopulateXif(Metadata1.java:41)。元数据1。main(Metadata1.java:127)由:java引起。lang.ClassNotFoundException:org。slf4j。爪哇的伐木工厂。网URLClassLoader。java上的findClass(URLClassLoader.java:381)。lang.ClassLoader。sun上的loadClass(ClassLoader.java:424)。杂项。Launcher$AppClassLoader。java上的loadClass(Launcher.java:349)。lang.ClassLoader。loadClass(ClassLoader.java:357)。。。3更多C:\Users\rajab\AppData\Local\NetBeans\Cache\8.2\executor snippets\run。xml:53:Java返回:1生成失败(总时间:0秒)

共有1个答案

沈冠宇
2023-03-14

不知道你到底想要什么,但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;
        }
    }

上面的示例使用元数据。插入而不是元数据。插入元数据,因为我们还需要一个布尔参数。如果设置为true,它将保留现有的IPTC数据,并且只更新我们想要的数据。一些IPTC条目允许多个值。在这种情况下,我们只添加新的。对于其他独特的条目,它们将被新条目替换。

看起来你想添加关键词和标题。在你的问题中,你已经展示了插入关键词的代码,为了插入标题,使用OBJECT_NAME可以在上面的例子中找到。

注意:你也可以添加多个关键词。有些软件只能处理一条关键字记录。在这种情况下,可以将所有关键字放在一个记录中,用分号分隔,而不是插入多个条目。

 类似资料:
  • 我理解读-获取(在它之后不进行后续读/写操作的重新排序)和写-释放(在它之前不进行读/写操作的重新排序)。我的q是:- 在读获取的情况下,它前面的写操作会被刷新吗 另外,在Java中,读获取和volatile读相同,写释放和volatile写相同吗? 为什么这很重要,让我们以写发布为例... 在这一点上,x是2还是1?这里,考虑准备好成为挥发性的。我知道挥发性之前的所有商店都将首先可见...然后只

  • 连接数据源后,Tableau会捕获源的元数据详细信息,例如列和列的数据类型。这用于创建视图中使用的度量,维度和计算字段。您可以浏览元数据并更改其属性以满足某些特定要求。 1. 检查元数据 连接数据源后,所有可能的表和列都将显示在数据源中。示例:用于检查元数据的源‘Sample Coffee Chain’。 单击“Data”菜单,然后选择与数据源连接。浏览名称为“Sample Coffee chai

  • 我试图使用VS Code,但我有一个问题,打开与其他编辑器编写的代码,VS Code不能阅读韩语Unicode?UTF-8?我们在代码中称其他语言为什么? 我用vim编辑器编写了代码,其中一些注释是用韩语编写的,任何其他编辑器都可以阅读韩语,但VS代码如下所示。 我怎样才能解决这个问题?

  • 我正在使用以下代码: 我正在从SQL数据库中检索数据,但每当我尝试插入数据时,都会在运行时出错: Java语言sql。SQLException:[Microsoft][ODBC SQL Server驱动程序][SQL Server]关键字“check”附近的语法不正确。在太阳。jdbc。odbc。JdbcOdbc。在sun上创建SQLException(未知源)。jdbc。odbc。JdbcOdb

  • 我正在尝试将数据写入我的Arduino Uno,并从中接收日期。 我在Windows 8.1上使用NetBeans,为了做到这一点,库“RXTXcomm.jar”。 我的代码是这样的,我的Arduino在COM3上,它在第25行和第80行抛出一个错误: 错误 java.lang.UnsatisfiedLinkError:java.library中没有rxtxSerial。加载gnu.io时抛出的路

  • 问题内容: 我有一个数据结构,我希望能够在关闭程序之前写入文件,然后在下次应用程序启动时从文件中读取数据以重新填充该结构。 我的结构是。对象很简单;对于成员变量,它具有一个String和两个布尔类型的小型本机数组。这是一个真正简单的应用程序,我希望一次不会超过10-15 对。 我一直在尝试(不成功)对象输入/输出流。我需要使对象类可序列化吗? 您能给我一些最好的建议吗?我只需要向正确的方向推进即可