comparison src/exiv2.cc @ 449:115db540bd0c

read color profiles from jpeg also with Exiv2
author nadvornik
date Sun, 20 Apr 2008 21:35:03 +0000
parents 49c1cbe058ae
children 0a69a779395a
comparison
equal deleted inserted replaced
448:a73cc0fa14d0 449:115db540bd0c
55 #if EXIV2_TEST_VERSION(0,16,0) 55 #if EXIV2_TEST_VERSION(0,16,0)
56 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */ 56 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */
57 #endif 57 #endif
58 bool have_sidecar; 58 bool have_sidecar;
59 59
60 60 /* the icc profile in jpeg is not technically exif - store it here */
61 _ExifData(gchar *path, gchar *sidecar_path, gint parse_color_profile) 61 unsigned char *cp_data;
62 guint cp_length;
63
64 _ExifData(gchar *path, gchar *sidecar_path)
62 { 65 {
63 have_sidecar = false; 66 have_sidecar = false;
67 cp_data = NULL;
68 cp_length = 0;
64 image = Exiv2::ImageFactory::open(path); 69 image = Exiv2::ImageFactory::open(path);
65 // g_assert (image.get() != 0); 70 // g_assert (image.get() != 0);
66 image->readMetadata(); 71 image->readMetadata();
67 72
68 #if EXIV2_TEST_VERSION(0,16,0) 73 #if EXIV2_TEST_VERSION(0,16,0)
72 sidecar = Exiv2::ImageFactory::open(sidecar_path); 77 sidecar = Exiv2::ImageFactory::open(sidecar_path);
73 sidecar->readMetadata(); 78 sidecar->readMetadata();
74 have_sidecar = sidecar->good(); 79 have_sidecar = sidecar->good();
75 if (debug >= 2) printf("sidecar xmp count %li\n", sidecar->xmpData().count()); 80 if (debug >= 2) printf("sidecar xmp count %li\n", sidecar->xmpData().count());
76 } 81 }
82
83 if (image->mimeType() == std::string("image/jpeg"))
84 {
85 /* try to get jpeg color profile */
86 Exiv2::BasicIo &io = image->io();
87 gint open = io.isopen();
88 if (!open) io.open();
89 unsigned char *mapped = (unsigned char*)io.mmap();
90 if (mapped) exif_jpeg_parse_color(this, mapped, io.size());
91 io.munmap();
92 if (!open) io.close();
93 }
77 94
78 #endif 95
96 #endif
97 }
98
99 ~_ExifData()
100 {
101 if (cp_data) g_free(cp_data);
79 } 102 }
80 103
81 void writeMetadata() 104 void writeMetadata()
82 { 105 {
83 if (have_sidecar) sidecar->writeMetadata(); 106 if (have_sidecar) sidecar->writeMetadata();
103 126
104 }; 127 };
105 128
106 extern "C" { 129 extern "C" {
107 130
108 ExifData *exif_read(gchar *path, gchar *sidecar_path, gint parse_color_profile) 131 ExifData *exif_read(gchar *path, gchar *sidecar_path)
109 { 132 {
110 if (debug) printf("exif read %s, sidecar: %s\n", path, sidecar_path ? sidecar_path : "-"); 133 if (debug) printf("exif read %s, sidecar: %s\n", path, sidecar_path ? sidecar_path : "-");
111 try { 134 try {
112 return new ExifData(path, sidecar_path, parse_color_profile); 135 return new ExifData(path, sidecar_path);
113 } 136 }
114 catch (Exiv2::AnyError& e) { 137 catch (Exiv2::AnyError& e) {
115 std::cout << "Caught Exiv2 exception '" << e << "'\n"; 138 std::cout << "Caught Exiv2 exception '" << e << "'\n";
116 return NULL; 139 return NULL;
117 } 140 }
524 catch (Exiv2::AnyError& e) { 547 catch (Exiv2::AnyError& e) {
525 return 0; 548 return 0;
526 } 549 }
527 } 550 }
528 551
552 void exif_add_jpeg_color_profile(ExifData *exif, unsigned char *cp_data, guint cp_length)
553 {
554 if (exif->cp_data) g_free(exif->cp_data);
555 exif->cp_data = cp_data;
556 exif->cp_length =cp_length;
557 }
558
559 unsigned char *exif_get_color_profile(ExifData *exif, guint *data_len)
560 {
561 if (exif->cp_data)
562 {
563 if (data_len) *data_len = exif->cp_length;
564 return (unsigned char *) g_memdup(exif->cp_data, exif->cp_length);
565 }
566 ExifItem *prof_item = exif_get_item(exif, "Exif.Image.InterColorProfile");
567 if (prof_item && exif_item_get_format_id(prof_item) == EXIF_FORMAT_UNDEFINED)
568 return (unsigned char *) exif_item_get_data(prof_item, data_len);
569 return NULL;
570 }
571
529 572
530 573
531 } 574 }
532 575
533 /* This is a dirty hack to support raw file preview, bassed on 576 /* This is a dirty hack to support raw file preview, bassed on