Blog | Photography | Highlights | Contact | About | Atom & RSS Feeds
Basic Editing of Photo Metadata Using Windows Imaging Component
  • Blog
  • Basic Editing of Photo Metadata Using Windows Imaging Component

In my previous posts I’ve provided examples on using Windows Imaging Component to Read & Write jpg metadata. In this post I’ll explain how to use ContainsQuery, GetQuery, SetQuery and RemoveQuery. As an added bonus I’m going to use the IPTC address fields as my example. Whilst BitmapMetadata does provide some standard properties like Subject and Title, it is far from comprehensive. In order to get at the other data you have to provide the right query. For me this has been one of the most frustrating challenges because these queries are not what you’d call logical. I’m going use a few basic queries in this post but I will be posting all the queries I use in a later post. These four queries give you access to the Country, Region, City and SubLocation IPTC tags.
// Queries for the IPTC Address fields
// Note: Region is normally the State or County
string iptcCountry = @"/app13/irb/8bimiptc/iptc/Country\/Primary Location Name";
string iptcRegion = @"/app13/irb/8bimiptc/iptc/Province\/State";
string iptcCity = @"/app13/irb/8bimiptc/iptc/City";
string iptcSubLocation = @"/app13/irb/8bimiptc/iptc/Sub-location";
Now let’s start with ContainsQuery and GetQuery which form the basics of your use of the BitmapMetadata class. In this example we query the BitmapMetadata object for the IPTC City. First we read the file, then check the file contains data for the IPTC City and if it does write it to the debug console:
// Grab copy of BitmapMetadata
BitmapMetadata bitmapMetadata = StandaloneWpfReader.ReadMetadata(inputFile);
// Check there's city data
if (bitmapMetadata.ContainsQuery(iptcCity))
{
    // Dump it to the console
    Debug.WriteLine(bitmapMetadata.GetQuery(iptcCity));
}
That code provides the core of manipulating the file. Now lets deal with SetQuery:
// Grab copy of BitmapMetadata and add Padding
BitmapMetadata bitmapMetadata = this.ReadMetadata("TestInput.jpg");
StandaloneWpfReader.AddMetadataPadding(bitmapMetadata, 5012);
// Use SetQuery to store the IPTC Address fields
bitmapMetadata.SetQuery(iptcCity, "IPTC City");
bitmapMetadata.SetQuery(iptcCountry, "IPTC Country");
bitmapMetadata.SetQuery(iptcRegion, "IPTC Region");
bitmapMetadata.SetQuery(iptcSubLocation, "IPTC SubLocation");
// Save the new file
this.WriteMetadata("TestInput.jpg", "TestOutput.jpg", bitmapMetadata);
And finally, the pretty obvious RemoveQuery, were we’ll remove the data we’ve just added:
// Remove IPTC Address fields
bitmapMetadata.RemoveQuery(iptcCity);
bitmapMetadata.RemoveQuery(iptcCountry);
bitmapMetadata.RemoveQuery(iptcRegion);
bitmapMetadata.RemoveQuery(iptcSubLocation);
That’s it for the basic manipulation, in future blogs I’ll build on this to explain how to work with more complicated metadata.

This website, all photography & other content is Copyright © Ben Vincent. Unauthorised use of images is strictly prohibited.
Last Updated: Wed, 14 Dec 2011, 16:30:58    |    Website Version v4.0.4138.41239    |    Content v7.002