Mercurial > geeqie
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 |