سؤال

النظام الذي أعمل فيه لديه ميزة لاستخراج البيانات الوصفية من ملفات JPEG باستخدام com.drew.metadata صفقة. http://www.drewnoakes.com/code/exif/ ومع ذلك، يقتصر على ملفات JPEG، والآن طلب العميل عن استخراج IPTC من TIF، وربما تنسيقات الصور الأخرى.

هل يعرف أي شخص عن واجهات برمجة التطبيقات المماثلة لوجه واحد، يمكن أن يستخرج IPTC من TIF؟

من الناحية المثالية سيكون هذا نهج جافا نقي مثل com.drew.metadata واحد.

هل كانت مفيدة؟

المحلول

هذا سؤال قديم. في الوقت الحاضر بلدي metadata-extractor تدعم المكتبة ملفات TIFF، بالإضافة إلى JPEG و WebP و PSD و PNG و GIF و BMP و ICO و PCX والعديد من التنسيقات الخام الكاميرا.

انتقل المشروع مؤخرا إلى جيثب:

https://github.com/drewnoakes/metadata-extor.

وهو متاح عبر Maven:

http://search.maven.org/# search٪7CGA٪7C1٪7CDREWNOKEAKES.

نصائح أخرى

قضيت بعض الوقت مؤخرا ترميز جزء التعامل مع البيانات الوصفية ICAFE. مكتبة الصور Java وجعلها قادرة على إدراج واستخراج أنواع البيانات الوصفية مثل EXIF، IPTC، Photoshop، ICC_Profile، Thumbnail وما إلى ذلك. بعض الوظائف أفضل من غيرها، ولكن كلها تعمل بشكل جيد نسبيا. هناك واجهة شائعة لجميع قراءة البيانات الوصفية الموضحة أدناه:

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.TIF" من "الصور" دليل المشروع كوسيطة، سنحصل على المعلومات التالية:

Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 6
Dataset value: Bayern
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 11
Dataset value: Deckelstein
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 7
Dataset value: Germany
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 10
Dataset value: Nittendorf

يعمل الرمز أعلاه ل JPEG و TIFF على حد سواء. يكتشف تلقائيا نوع الصورة والفوضي من التعليمات البرمجية المقابلة للقيام بالعمل.

ملاحظة: قد يكون هناك أكثر من أماكن واحدة في ملف TIFF يحتوي على بيانات IPTC. واحد هو علامة richtiffiptc، والآخر مدفون داخل علامة فوتوشوب. حاليا، يحتفظ ICAFE فقط ببيانات IPTC واحدة. إذا كانت كلا من العلامة فوتوشوب مع بيانات IPTC وعلامة richtiffiptc موجودة، فسوف تبقي بيانات richtiffiptc. خلاف ذلك، أيا كان العلامة الموجودة، وسوف تبقي بيانات IPTC من هذه العلامة. لا توجد مشكلة في حفظ البيانات من كلا المكانين. التنفيذ الحالي باستخدام خريطة خريطة البيانات الوصفية نوع الوصف التعريفي. لذلك فقط يحتفظ فقط مثيل البيانات الوصفية الفريدة.

تحديث: ICAFE. يمكن الآن دمج بيانات IPTC من كل من Richtiffiptc و Photoshop IRB وإزالة التكرارات.

تحديث 2: تنفذ الفئة الأساسية لجميع أنواع البيانات الوصفية في ICAFE - البيانات الوصفية الآن واجهة قابلة للتوجيه، بحيث يمكن للمستخدم التكرار الآن من خلال مجموعة من العبث. يتم إنشاء MetadataEnentry نفسها باستخدام نمط مركب حتى يتمكن ATATATAENTRYETRORE على مجموعة من العباءة المختلطة الأخرى. يحتوي كل metadataentry على مفتاح وقيمة زوج. يسمح هذا التصميم بإجراء هيكل شجرة إدخالات البيانات الوصفية.

هناك مثال جيد هنا باستخدام imageio ليب للوصول إلى IPTC هنا

http://www.barregren.se/blog/how-read-exif-and-iptc-java-image-io-api.

لسوء الحظ، ما زال عليك التعامل مع بعض العمل بنفسك.

إذا لم تتمكن من العثور على تطبيق Java النقي، فيمكنك التفكير في استخدام ربطات Java في ImageMagick (jmagick). من شأنها أن تسمح لعدد كبير من تنسيقات الإخراج المختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top