Job Runner ImageUsage Tracker Image
TransparentPadder

Share On FacebookShare On Facebook
 
Ben's Blog (57)Ben's Blog (57)
Development (13)Development (13)
Lisa's Blog (4)Lisa's Blog (4)
 
Show All (75)Show All (75)
 
Jan 2010 (3)Jan 2010 (3)
Nov 2009 (8)Nov 2009 (8)
Oct 2009 (4)Oct 2009 (4)
Sep 2009 (4)Sep 2009 (4)
Jul 2009 (6)Jul 2009 (6)
Jun 2009 (5)Jun 2009 (5)
May 2009 (7)May 2009 (7)
Mar 2009 (1)Mar 2009 (1)
Feb 2009 (5)Feb 2009 (5)
Jan 2009 (7)Jan 2009 (7)
Dec 2008 (6)Dec 2008 (6)
Oct 2008 (3)Oct 2008 (3)
Sep 2008 (3)Sep 2008 (3)
Aug 2008 (9)Aug 2008 (9)
Jul 2008 (3)Jul 2008 (3)
Jun 2008 (1)Jun 2008 (1)
 
Show All (75)Show All (75)
 
RSS & Atom FeedsRSS & Atom Feeds




TransparentPadder
Home  |  Shopping Cart (0)Blog  |  Highlights  |  Albums  |  Search  |  Contact  Atom & RSS Feeds

Reading Photo Metadata Using Windows Imaging Component by Ben Vincent

I still see a lot of questions on the Internet and at work on how to read (& write) metadata in Photos. There are plenty of examples out there but they all appear to have some pitfalls. To be quite honest, the code I’ve been using for a number of years now is mature enough that it solves almost all the problems I’ve seen.

This blog is the first in a series that document how to read (this blog), write and manipulate photo metadata. You can find all my blogs on Windows Imaging Component here.

All this code is based on Windows Presentation Foundation (so you’ll need a reference to PresentationCore) which includes the Windows Imaging Component. These classes provide some very solid tools for reading and manipulating images. In particular the BitmapMetadata object provides access to data stored in Exif, XMP or IPTC in a file.

The following method takes a jpg photo filename as the parameter and returns a BitmapMetadata object.

public static BitmapMetadata ReadMetadata(string sourceFile)
{
    BitmapMetadata sourceMetadata = null;
    BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat
                                                             | BitmapCreateOptions.IgnoreColorProfile;

    // Open the File
    using (Stream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read))
    {
        // Decode the file and cache the content onload (BitmapCacheOption.OnLoad)
        // If you don't do this sourceMetadata won't be fully loaded
        BitmapDecoder sourceDecoder = BitmapDecoder.Create(sourceStream,
                                                             createOptions,
                                                             BitmapCacheOption.OnLoad);

        // Check source has valid frames
        if (sourceDecoder.Frames[0] != null && sourceDecoder.Frames[0].Metadata != null)
        {
            // Clone the metadata so we can throw away the reference to the underlying file
            sourceMetadata = sourceDecoder.Frames[0].Metadata.Clone() as BitmapMetadata;
        }
        else
        {
            throw new Exception("Unable to read Metadata from File");
        }
    }

    return sourceMetadata;
}

It’s a static method so you get an in-memory copy of all the metadata. If you plan to change the return type to a specific property, then you can change BitmapCacheOption to None. This is faster, because the everything is loaded on the demand but it means BitmapMetadata is only valid whilst the sourceStream is in scope.

In my next blog I’ll talk about how to save changes made to the BitmapMetadata object we’ve retrieved.


Posted: Tue, 3 Nov 2009, 07:37:33 GMT (Updated:  Wed, 4 Nov 2009, 05:42:15 GMT) by  Ben Vincent  |  0 Comments
Category: Development
Tags: Windows Imaging Component, XMP, Exif, IPTC, FotoFly

 

 
TransparentPadderTransparentPadderTransparentPadder
TransparentPadder

Facebook Status  Ben Email decimated, unfortunately more like the Roman definition than the modern one.

(Updated: Wed, 3 Feb 2010, 00:22:01)
TransparentPadder
Alcatraz . American Express . Australia . Bing . Blue Angels . bmi . Breathe Magazine . British Food . Camping . Canada . Christmas . Christmas Tree . Cleaner Shrimp . CodePlex . Cooking . Coral Sea . Cycling . Diving . DragonLance . Engagement . Exif . Expedia . Facebook . Fire Shrimp . Firemen . Fish Tank . Fleet Week . Flying . Foie Gras . Food . FotoFly . GeoTagging . Giving Campaign . Golden Gate National Recreation Area . Google . Goose Fat . Gordon Ramsay . Hollywood . Hotmail . IPTC . Michelin Star . Microsoft . Monterey Bay Aquarium . Mountain Biking . Photography . San Francisco . Search Engine Optimzation . SEO . Silverlight . Tassography.com . TransRockies . United . Usage . Windows 7 . Windows Imaging Component . Windows Live . Windows Live Calendar . Windows Live Photo Gallery . Wineries . XMP

Sunday, January 24, 2010
- 2010-01-23 Lisa's Birthday

Sunday, January 17, 2010
- 2010-01-18 Things We Collect
- 2010-01-17 Weekend in Half Moon Bay

Saturday, January 16, 2010
- 2009-12-31 Holiday in Beaver Creek

Sunday, October 18, 2009
- 2009-10-10 San Francisco Fleet Week 2009

Sunday, October 04, 2009
- 2009-10-04 Biking Around The Bay

Sunday, August 30, 2009
- 2009-08-26 Caltrain
- 2009-08-22 Biking And Fracturing a Rib in Mammoth Lakes

Tuesday, August 11, 2009
- 2009-08-09 Biking on Pine Mountain

Wednesday, August 05, 2009
- 2009-08-01 Lisa's Mum and Sister Visit