GBytes* gexiv2_metadata_get_iptc_tag_raw (GExiv2Metadata *self, const gchar* tag) { g_return_val_if_fail(GEXIV2_IS_METADATA (self), NULL); g_return_val_if_fail(tag != NULL, NULL); g_return_val_if_fail(self->priv->image.get() != NULL, NULL); Exiv2::IptcData& iptc_data = self->priv->image->iptcData(); try { Exiv2::IptcData::iterator it = iptc_data.findKey(Exiv2::IptcKey(tag)); while (it != iptc_data.end() && it->count() == 0) it++; if (it != iptc_data.end()) { long size = it->size(); if( size > 0 ) { gpointer data = g_malloc(size); it->copy((Exiv2::byte*)data, Exiv2::invalidByteOrder); return g_bytes_new_take(data, size); } } } catch (Exiv2::Error& e) { LOG_ERROR(e); } return NULL; }
gboolean gexiv2_metadata_has_iptc_tag(GExiv2Metadata *self, const gchar* tag) { g_return_val_if_fail(GEXIV2_IS_METADATA(self), FALSE); g_return_val_if_fail(tag != NULL, FALSE); g_return_val_if_fail(self->priv->image.get() != NULL, FALSE); Exiv2::IptcData &iptc_data = self->priv->image->iptcData(); for (Exiv2::IptcData::iterator it = iptc_data.begin(); it != iptc_data.end(); ++it) { if (it->count() > 0 && g_ascii_strcasecmp(tag, it->key().c_str()) == 0) return TRUE; } return FALSE; }
gchar* gexiv2_metadata_get_iptc_tag_string (GExiv2Metadata *self, const gchar* tag) { g_return_val_if_fail(GEXIV2_IS_METADATA (self), NULL); g_return_val_if_fail(tag != NULL, NULL); g_return_val_if_fail(self->priv->image.get() != NULL, NULL); Exiv2::IptcData& iptc_data = self->priv->image->iptcData(); try { Exiv2::IptcData::iterator it = iptc_data.findKey(Exiv2::IptcKey(tag)); while (it != iptc_data.end() && it->count() == 0) it++; if (it != iptc_data.end()) return g_strdup (it->toString ().c_str ()); } catch (Exiv2::Error& e) { LOG_ERROR(e); } return NULL; }
gboolean gexiv2_metadata_clear_iptc_tag(GExiv2Metadata *self, const gchar* tag) { g_return_val_if_fail(GEXIV2_IS_METADATA(self), FALSE); g_return_val_if_fail(tag != NULL, FALSE); g_return_val_if_fail(self->priv->image.get() != NULL, FALSE); Exiv2::IptcData &iptc_data = self->priv->image->iptcData(); gboolean erased = FALSE; Exiv2::IptcData::iterator it = iptc_data.begin(); while (it != iptc_data.end()) { if (it->count() > 0 && g_ascii_strcasecmp(tag, it->key().c_str()) == 0) { it = iptc_data.erase(it); erased = TRUE; } else { it++; } } return erased; }
int main(int argc, char* const argv[]) try { if (argc != 2) { std::cout << "Usage: " << argv[0] << " file\n"; return 1; } Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(argv[1]); assert (image.get() != 0); image->readMetadata(); Exiv2::IptcData &iptcData = image->iptcData(); if (iptcData.empty()) { std::string error(argv[1]); error += ": No IPTC data found in the file"; throw Exiv2::Error(1, error); } Exiv2::IptcData::iterator end = iptcData.end(); for (Exiv2::IptcData::iterator md = iptcData.begin(); md != end; ++md) { std::cout << std::setw(44) << std::setfill(' ') << std::left << md->key() << " " << "0x" << std::setw(4) << std::setfill('0') << std::right << std::hex << md->tag() << " " << std::setw(9) << std::setfill(' ') << std::left << md->typeName() << " " << std::dec << std::setw(3) << std::setfill(' ') << std::right << md->count() << " " << std::dec << md->value() << std::endl; } return 0; } catch (Exiv2::AnyError& e) { std::cout << "Caught Exiv2 exception '" << e << "'\n"; return -1; }