Windows Platform Design Notes

Designing Hardware for the MicrosoftÒ WindowsÒ Family of Operating Systems

Supporting MetaData in Image Files through GDI+

Abstract:  Microsoft is encouraging industry groups and vendors who define image file formats to specify and support a baseline set of metadata to help promote widespread use of specific metadata by the industry and consumers. This article discusses how Microsoft is supporting metadata with GDI+ and recommends enhancements for metadata support in the industry.

Version 1.1 — April 12, 2000

Contents

 

Introduction........................................................................................................ 3

Guidelines for Industry Metadata Support.............................................................. 4

Metadata Support in GDI+.................................................................................... 5

GDI+ Image Property APIs.................................................................................. 6

GetPropertyCount........................................................................................... 6

GetPropertyIdList........................................................................................... 6

GetPropertyItemSize...................................................................................... 7

GetPropertyItem............................................................................................. 7

SetPropertyItem............................................................................................. 8

RemovePropertyItem...................................................................................... 9

GetPropertySize............................................................................................. 9

GetAllPropertyItems...................................................................................... 10

PropertyItem Structure.................................................................................. 11

Image Property IDs....................................................................................... 11

Call to Action for Supporting Metadata in Image Files........................................... 14

 

Disclaimer: The information contained in this document represents the current view of Microsoft Corporation on the issues discussed as of the date of publication. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information presented. This document is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS DOCUMENT.

Microsoft Corporation may have patents or pending patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. The furnishing of this document does not give you any license to the patents, trademarks, copyrights, or other intellectual property rights except as expressly provided in any written license agreement from Microsoft Corporation.

Microsoft does not make any representation or warranty regarding specifications in this document or any product or item developed based on these specifications. Microsoft disclaims all express and implied warranties, including but not limited to the implied warranties or merchantability, fitness for a particular purpose and freedom from infringement. Without limiting the generality of the foregoing, Microsoft does not make any warranty of any kind that any item developed based on these specifications, or any portion of a specification, will not infringe any copyright, patent, trade secret or other intellectual property right of any person or entity in any country. It is your responsibility to seek licenses for such intellectual property rights where appropriate. Microsoft shall not be liable for any damages arising out of or in connection with the use of these specifications, including liability for lost profit, business interruption, or any other damages whatsoever. Some states do not allow the exclusion or limitation of liability or consequential or incidental damages; the above limitation may not apply to you.

Microsoft, Win32, Windows, and Windows NT are trademarks or registered trademarks of Microsoft Corporation in the United States and/or other countries. Other product and company names mentioned herein may be the trademarks of their respective owners.

© 2000 Microsoft Corporation. All rights reserved.


Introduction

Integration of relevant metadata in images provides an opportunity for participating industries to take imaging to the next level.  Image metadata is essentially non-picture information that is bundled with picture information in a file. Metadata can include information such as the date and time the picture was taken, whether a flash was used, which camera model was used, and even audio annotations.

Metadata is a key supporting technology for content management. The content management services built in to the Microsoft® Windows® Millennium Edition (Windows Me) and later Windows operating systems uses metadata extensively.

Metadata provides benefits to users, application developers, and hardware vendors:

§         Metadata helps users organize digital images. As digital cameras and scanners become more widely available, users are faced with managing hundreds or thousands of images.

Using the content management capabilities of the Windows operating systems, users can sort and search their images on metadata items such as date and time, camera make and model, or location, for example.

§         Metadata helps devices render digital images with higher quality. Currently, devices render images as best they can, based on average settings for the average image. Improving the quality of a given rendering requires the user to make manual adjustments.

Vendors can use metadata such as brightness and exposure bias to refine device algorithms for rendering images to produce higher-quality images automatically, with less need for user intervention.

§         Metadata helps vendors manage image files in workflows. Currently, it is difficult to obtain simple information such as when and where a picture was taken with a digital camera or what camera model was used so that the printer vendor can compensate appropriately.

Vendors can use metadata to enhance image reproduction. For example, suppose a vendor produces both digital cameras and printers. Having metadata available to the printer driver allows the vendor to enhance the end-to-end quality of the image reproduction system.

·         Metadata enables users to better use their images. Users can also take advantage of metadata such as organizing pictures by the date they were taken or the digital camera used, or annotating pictures for sharing or storage.

For example, a user might take pictures at a vacation resort, download them to a PC, and annotate them using an application based on GDI+ before sending the pictures to friends and relatives, who might further annotate the pictures before forwarding or storing them.

 

Microsoft is supporting metadata in image files through GDI+, the next-generation graphics engine for 2D vector graphics, imaging, and typography for Windows-based and Web-based applications. GDI+ supports a number of native still image file formats, including BMP, JPEG, TIFF, PNG, GIF, WMF, and EMF. In turn, GDI+ provides core services for managing files in these formats to Microsoft Windows platforms. Vendors can use GDI+ to read and modify metadata in image files. Vendors can also use GDI+ to implement image codecs for proprietary file formats that would enable any GDI+ application to seamlessly open files in those formats.

GDI+ makes more extensive use of metadata in image files than earlier versions of Windows operating systems, and more image metadata is exposed to users. Vendors who generate image files are encouraged to store valid and presentable information in all possible metadata items.

Application developers are also encouraged to use Windows Image Acquisition (WIA) to set device properties that generate metadata if the camera supports this behavior. For example, an application might recognize that the date and time of an image is missing and communicate with the device through WIA to set this value so that subsequent images will contain date and time metadata. Microsoft recommends that vendors of cameras and other devices that generate still images and image metadata take advantage of WIA to communicate with the PC, rather than simply representing their devices as disk drives. For information, see
http://www.microsoft.com/hwdev/wia/

A GDI+ developer beta is currently planned for 3Q2000. For information, contact Microsoft at gdiphw@microsoft.com.

This paper presents guidelines for standard support of metadata by the industry. It recommends a baseline set of metadata that future file formats should support, to promote interoperability. This paper suggests enhancements to facilitate organizing and searching files by metadata values, to take advantage of content management services provided by the operating system. It also discusses how GDI+ supports metadata in current file formats and provides reference information for the currently planned GDI+ APIs for managing metadata in image files.

Guidelines for Industry Metadata Support

Currently, each independent body that controls a file format drafts a completely independent set of metadata and structures to support the metadata in that file format.

Microsoft recommends that all file formats specify and support a baseline set of required metadata, including a search key metadata item that can contain a list of search keywords.

Recommendations for a baseline set of metadata.  A common baseline set of metadata promotes widespread use of specific metadata by the industry and consumers. It also makes it possible to provide developers with simple and consistent interfaces for accessing metadata in their applications.

A baseline set of metadata should follow these guidelines:

§         Be consistent with current de facto industry standards such as JEIDA’s EXIF set of metadata.

The set of metadata supported by GDI+ is based on EXIF. See “Image Property IDs” later in this paper.

§         Include a standard minimal set of metadata intended for use by end users.

§         Be easily transferable across file formats.

For example, it should be possible to capture an image with a digital camera in a JPEG file containing EXIF metadata and convert it to a PNG file for posting on a web site, preserving almost all of the common metadata from the JPEG file with little or no additional work. This should be transparent to the user.

§         Contain appropriate mechanisms to provide an audit trail of file updates. This will enhance the ability of applications to add value using this file format.

For example, suppose a user captures an image with a digital camera from Vendor A, uses an image-editing application from Vendor B to change colors in the image, and then prints the image on a printer from Vendor A. If Vendor A can detect that the user made color changes with Vendor B’s software, it should preserve those changes in the rendering; otherwise, it is free to enhance the color of the image based on internal knowledge of its camera and printer devices.

 

Search-keyword metadata item.  Image files should include a metadata item that can contain a list of search keywords, separated by a comma or semicolon. A search-keyword metadata item adds significant value to image files:

§         The operating system can use search keyword information transparently to sort and manage image files within the system.

§         Windows-based applications can expose keywords to users in a standard way, similar to keywords in Microsoft Word documents, which are displayed in the Document Properties dialog box.

§         Consumers can organize images in personally meaningful categories, such as the names of friends and relatives pictured, or an important event such as a family reunion.

§         Users who manage large volumes of images can extend the baseline set of metadata with their own criteria, which can significantly improve productivity of enterprise imaging workflows such as insurance, inventory, and real estate.

§         Users can perform complex searches to find image files that meet multiple criteria.

 

Metadata Support in GDI+

Image metadata in GDI+ is indirectly related to any standard file format, because GDI+ provides an interface between different standard file formats and their metadata. As part of its core graphics technology, GDI+ supports metadata in the following ways:

§         It abstracts the metadata interface, so applications can write to a simple and consistent interface for accessing metadata independent of file format.

§         It provides the infrastructure necessary to support content management, a strategic feature for Windows-based imaging applications, so developers are not required to implement content management separately in their applications.

 

Content management plus a consistent set of metadata makes it possible for users to organize and search stored images by metadata values, such as the time a picture was taken or its location. GDI+ supports a number of image file formats—BMP, JPEG, TIFF, PNG, GIF, WMF, and EMF—and can map standard metadata items between them.

When converting a file from one format to another, GDI+ preserves all possible metadata items in the destination file format.

GDI+ also persists metadata across image-altering operations whenever possible. For example, developers can take advantage of a GDI+ function to perform lossless 90-degree rotations in JPEG. GDI+ updates standard metadata items, such as thumbnail, width, height, and orientation, to reflect the rotated image.

Note: GDI+ preserves standard metadata items, but some operations might cause private metadata to be lost. For example, it is not possible to determine whether a private width and height would still be relevant to a rotated image. Such private metadata is discarded to prevent users from experiencing inconsistent behavior by the image after the operation.

GDI+ will support search keyword metadata in much the same way as the File Properties keyword option in Microsoft Office documents. As with Microsoft Office documents, the keywords should be comma separated. Although the EXIF specification indicates that either user comments or keywords can be supported in the user comments metadata, Microsoft has found there is a distinct need for two separate metadata fields for these two types of metadata. The specifics of the implementation are identical to the EXIF implementation of user comments. Exact specifics such as EXIF ID will be requested from JEIDA, owner of the EXIF specification.

GDI+ Image Property APIs

Important: The information provided in this section reflects the current design of GDI+. Developers should be aware that this design is still under development and may change.

This section provides reference information for the following GDI+ imaging functions:

§         GetPropertyCount

§         GetPropertyIdList

§         GetPropertyItemSize

§         GetPropertyItem

§         SetPropertyItem

§         RemovePropertyItem

§         GetPropertySize

§         GetAllPropertyItems

 

GetPropertyCount

GpStatus Image::GetPropertyCount(
    OUT UINT* numOfProperty )

 

Returns the total number of property items stored in the image. The caller can allocate a memory buffer based on this value and call GetPropertyItemList to get a list of IDs for all the property items stored in the image.

numOfProperty        The total number of property items stored in the image. If no property items are stored in the image, the number will be zero.

Upon success, this function returns OK. Otherwise, it returns an error code.

GetPropertyIdList

GpStatus Image::GetPropertyIdList(
    IN UINT numOfProperty,
    IN/OUT PROPID* list )

 

Returns a list of IDs for all the property items stored in the image.

numOfProperty        This input value tells the function how many property items the caller is expecting from the image.

list                          A memory buffer that the caller provided for storing the ID list. The buffer must be at least (numOfProperty * sizeof(PROPID)). The caller is responsible for allocating and freeing this buffer.

                              For a list of currently defined property ID values, see “Image Property IDs” later in this paper.

Upon success, this function returns OK. If numOfProperty doesn’t match the total number of property items stored in the image, the function returns InvalidParameter. Otherwise, it returns an error code.

Example

Image myImage(myFile.jpg);

UINT  numOfProperty;

If (  (MyImage.GetPropertyCount(&numOfProperty) == OK)

       &&( numOfProperty != 0) )

{

    PROPID* pPROPIDList = malloc(numOfProperty *

    sizeof(PROPID));

    If (pPROPIDList != NULL)

    {

       if (MyImage.GetPropertyIdList(numOfProperty, pPROPIDList) == OK)

       {

           // Display all the IDs in this list

           for ( int i=0; i < numOfProperty; ++i )

           {

               printf(“ID is %ld\n”, pPROPIDList[i]);

           }

       }

    }

}

 

GetPropertyItemSize

GpStatus Image::GetPropertyItemSize(
    IN PROPID propid,
    OUT UINT* size)

 

Returns the size, in bytes, of the property item specified by the ID. The caller can allocate a memory buffer based on this number and call GetPropertyItem to get this property item.

propid                     The ID of the property item the caller wants to get.

                              For a list of currently defined property ID values, see “Image Property IDs” later in this paper.

size                         The size, in bytes, of the value of this property item. If there is no such property item stored in the image, size will be zero.

Upon success, this function returns OK. Otherwise, it returns an error code.

GetPropertyItem

GpStatus Image::GetPropertyItem(
    IN PROPID propid,
    IN UINT propSize,
    IN/OUT PropertyItem* buffer)

 

Puts the property item specified by propid into the input buffer provided by the caller at buffer.

propid                     The ID of the property item to retrieve.

                              For a list of currently defined property ID values, see “Image Property IDs” later in this paper.

propSize                  Size of this property item, in bytes.

buffer                     Buffer for storing this property item. The buffer must be at least propSize bytes in size. The caller is responsible for allocating the buffer and for freeing it after the function returns.

On output, buffer contains a filled-in PropertyItem structure that contains the property item data. See “PropertyItem Structure” later in this paper.

Upon success, this function returns OK. If the property item specified by propid doesn’t exist in the image, or if propSize doesn’t match the size of the specified property item, the function returns InvalidParameter. Otherwise, it returns an error code.

Example

Image myImage(myFile.jpg);

UINT  propertySize;

If (  MyImage.GetPropertyItemSize(PropertyTagExifUserComment,  &propertySize) == OK)

{

    PROPID* pPropBuffer = malloc(propertySize);

    If (pPropBuffer != NULL)

    {

       if (MyImage.GetPropertyItem(PropertyTagExifUserComment,

           propertySize, pPropBuffer) == OK)

       {

           // Display the annotation

           printf(“annotation is %s\n”, *pPropBuffer);

       }

    }

}

 

SetPropertyItem

GpStatus Image::SetPropertyItem(
    IN PropertyItem item )

 

Sets a property item in the image. If the property item already exists, the new property value replaces it. Otherwise, the property item is added to the image.

item                        An initialized PropertyItem structure that contains data for the property item to be set. See “PropertyItem Structure” later in this paper.

Upon success, this function returns OK. If the property item specified by item.id doesn’t exist in the image, the function returns InvalidParameter. Otherwise, it returns an error code.

Example

Image myImage(myFile.jpg);

PropertyItem item;

char propValue[] = ‘GDI+ test”;

 

item.id = PropertyTagExifUserComment;

item.value = propValue;

 

If (  MyImage.SetPropertyItem(item) == OK )

{

    printf(“Annotation set\n”);

}

else

{

    printf(“Set annotation failed\n”);

}

 

RemovePropertyItem

GpStatus Image::RemovePropertyItem(IN PROPID propId)

 

Removes the property item specified by propId from the image.

propId                     The ID of the property item to remove.

                              For a list of currently defined property ID values, see “Image Property IDs” later in this paper.

Upon success, this function returns OK. If the property item specified by propId doesn’t exist in the image, the function returns InvalidParameter. Otherwise, it returns an error code.

Example

Image myImage(myFile.jpg);

If ( MyImage.RemovePropertyItem(PropertyTagExifUserComment) == OK )

{

    printf(“Annotation removed\n”);

}

else

{

    printf(“Removing annotation failed\n”);

}

 

GetPropertySize

Gpstatus   Image::GetPropertySize(
    OUT UINT*
totalBufferSize,
    OUT UINT* numProperties)

 

Returns the size, in bytes, of all the property items stored in the image. The caller can allocate a memory buffer based on this number and call GetAllPropertyItems to get this property item.

totalBufferSize         The size, in bytes, for all the property items stored in the image.

numProperties          Total number of property items stored in the image.

Upon success, this function returns OK. If no property items are stored in the image, both totalBufferSize and numProperties will be zero. Otherwise, the function returns an error code.

GetAllPropertyItems

Gpstatus  Image::GetAllPropertyItems(
    IN UINT totalBufferSize,
    IN UINT numProperties,
    IN/OUT PropertyItem* allItems)

 

Returns all of the property items stored in the image.

totalBufferSize         The size, in bytes, of the buffer allocated by the caller for storing the result.

numProperties          Number of property items stored in the image.

allItems                   Points to a buffer to receive the property items. The buffer must be equal to totalBufferSize. The caller is responsible for allocating the memory and freeing it after the function returns. On output, the buffer is filled with an array of PropertyItem structures, one for each property item stored in the image.

Upon success, this function returns OK. If totalBufferSize doesn’t match the total size of all the property items stored in the image or numProperties doesn’t match total number of property items stored in the image, the function returns Invalidparameter. Otherwise, it returns an error code.

Example

Image myImage(myFile.jpg);

UINT  propertySize;

UINT  numProperties;

 

If (  MyImage.GetPropertySize(&propertySize, &numProperties) == OK)

{

    PropertyItem * pPropBuffer = (PropertyItem *)malloc(propertySize);

    If (pPropBuffer != NULL)

    {

       if (MyImage.GetAllPropertyItems (propertySize, numProperties,

           pPropBuffer) == OK)

       {

       // Display all the properties

           for ( int i = 0; i < numProperties; ++i )

           {

               switch ( pPropBuffer[i]->id )

               {

               case ID_ANNOTATION:

                   printf(“Annotation is %s\n”, pPropBuffer[i]->value);

            break;

 

               case ID_CREATOR:

                   printf(“Image creator is %s\n”, pPropBuffer[i]->value);

                   break;

               ...

               }

           }

       }

    }

}

 

PropertyItem Structure

This structure contains the data for an individual image property.

typedef struct tagPropertyItem

{

    PROPID id;     // ID of this property

    ULONG length;  // Length of the property

    WORD type;     // Type of the value, as a ValueTypeXxx

    VOID* value;   // property value

} PropertyItem;

 

The type member can be one of the following ValueTypeXxx values:

ValueTypeByte

An 8-bit unsigned integer.

ValueTypeASCII

An 8-bit byte containing one 7-bit ASCII code, NULL-terminated.

ValueTypeShort

A 16-bit unsigned integer.

ValueTypeLong

A 32-bit unsigned integer.

ValueTypeRational

Two LONGs. The first LONG is the numerator and the second LONG is the denominator.

ValueTypeUndefined

An 8-bit byte that can take any value depending on field definition.

 

Image Property IDs

Metadata in GDI+ are implemented as image properties, which are stored and accessed by property ID. This section lists the property IDs currently defined in GDI+.

// Image property tags

PropertyTagExifIFD            

PropertyTagGpsIFD            

 

PropertyTagImageWidth     

PropertyTagImageHeight    

PropertyTagBitsPerSample 

PropertyTagCompression   

PropertyTagPhotometricInterp 

PropertyTagImageDescription  

PropertyTagEquipMake        

PropertyTagEquipModel       

PropertyTagStripOffsets       

PropertyTagOrientation        

PropertyTagSamplesPerPixel

PropertyTagRowsPerStrip     

PropertyTagStripBytesCount  

PropertyTagXResolution        

PropertyTagYResolution        

PropertyTagPlanarConfig       

PropertyTagResolutionUnit    

PropertyTagTransferFuncition

PropertyTagSoftwareUsed     

PropertyTagDateTime           

PropertyTagArtist             

PropertyTagWhitePoint         

PropertyTagPrimaryChromatics  

 

PropertyTagJPEGInterFormat   

PropertyTagJPEGInterLength    

PropertyTagYCbCrCoefficients  

PropertyTagYCbCrSubsampling

PropertyTagYCbCrPositioning   

PropertyTagREFBlackWhite      

 

PropertyTagICCProfile       

PropertyTagGamma           

 

PropertyTagImageTitle       

PropertyTagCopyright        

 

// Extra tags (For example, Adobe Image Information tags)

PropertyTagResolutionXUnit          

PropertyTagResolutionYUnit          

PropertyTagResolutionXLengthUnit    

PropertyTagResolutionYLengthUnit    

PropertyTagPrintFlags               

PropertyTagPrintFlagsVersion        

PropertyTagPrintFlagsCrop           

PropertyTagPrintFlagsBleedWidth     

PropertyTagPrintFlagsBleedWidthScale

PropertyTagHalftoneLPI              

PropertyTagHalftoneLPIUnit          

PropertyTagHalftoneDegree           

PropertyTagHalftoneShape            

PropertyTagHalftoneMisc             

PropertyTagHalftoneScreen           

PropertyTagJPEGQuality              

PropertyTagGridSize                 

PropertyTagThumbnailFormat          

PropertyTagThumbnailWidth           

PropertyTagThumbnailHeight          

PropertyTagThumbnailColorDepth      

PropertyTagThumbnailPlanes          

PropertyTagThumbnailRawBytes         

PropertyTagThumbnailSize            

PropertyTagThumbnailCompressedSize  

PropertyTagColorTransferFunction    

 

PropertyTagLuminanceTable           

PropertyTagChrominanceTable         

 

PropertyTagFrameDelay               

PropertyTagLoopCount                

 

// EXIF-specific tags

PropertyTagExifExposureTime 

PropertyTagExifFNumber      

 

PropertyTagExifExposureProg 

PropertyTagExifSpectralSense

PropertyTagExifISOSpeed     

PropertyTagExifOECF         

 

PropertyTagExifVer          

PropertyTagExifDTOrig        // Date and time of original

PropertyTagExifDTDigitized   // Date and time of

                              // digital data generation

 

PropertyTagExifCompConfig    

PropertyTagExifCompBPP       

 

PropertyTagExifShutterSpeed  

PropertyTagExifAperature     

PropertyTagExifBrightness    

PropertyTagExifExposureBias  

PropertyTagExifMaxAperature  

PropertyTagExifSubjectDist   

PropertyTagExifMeteringMode  

PropertyTagExifLightSource   

PropertyTagExifFlash         

PropertyTagExifFocalLength   

PropertyTagExifMakerNote     

PropertyTagExifUserComment   

PropertyTagExifDTSubsec        // Date and Time subseconds

PropertyTagExifDTOrigSS        // Date and Time original subseconds

PropertyTagExifDTDigSS         // Date and Time digitized subseconds

 

PropertyTagExifFPXVer        

PropertyTagExifColorSpace    

PropertyTagExifPixXDim       

PropertyTagExifPixYDim       

PropertyTagExifRelatedWav      // Related sound file

PropertyTagExifInterop       

PropertyTagExifFlashEnergy   

PropertyTagExifSpatialFR       // Spatial frequency response

PropertyTagExifFocalXRes       // Focal plane X resolution

PropertyTagExifFocalYRes       // Focal plane Y resolution

PropertyTagExifFocalResUnit    // Focal plane resolution unit

PropertyTagExifSubjectLoc    

PropertyTagExifExposureIndex 

PropertyTagExifSensingMethod 

PropertyTagExifFileSource    

PropertyTagExifSceneType     

PropertyTagExifCfaPattern    

 

PropertyTagGpsVer            

PropertyTagGpsLatitudeRef   

PropertyTagGpsLatitude      

PropertyTagGpsLongitudeRef   

PropertyTagGpsLongitude      

PropertyTagGpsAltitudeRef    

PropertyTagGpsAltitude       

PropertyTagGpsGpsTime        

PropertyTagGpsGpsSatellites  

PropertyTagGpsGpsStatus      

PropertyTagGpsGpsMeasureMode 

PropertyTagGpsGpsDop            // Measurement precision

PropertyTagGpsSpeedRef       

PropertyTagGpsSpeed          

PropertyTagGpsTrackRef       

PropertyTagGpsTrack          

PropertyTagGpsImgDirRef      

PropertyTagGpsImgDir         

PropertyTagGpsMapDatum        

PropertyTagGpsDestLatRef     

PropertyTagGpsDestLat        

PropertyTagGpsDestLongRef    

PropertyTagGpsDestLong       

PropertyTagGpsDestBearRef    

PropertyTagGpsDestBear       

PropertyTagGpsDestDistRef    

PropertyTagGpsDestDist       

 

 

Call to Action for Supporting Metadata in Image Files

§         Store relevant and presentable values in all metadata items defined by current file formats.

§         Prepare to support a standard baseline set of metadata as described in this paper.

§         Support robust searching of metadata using comma- or semicolon-separated strings of keywords.

§         Test metadata search and exposure functionality in Windows Me.

§         Enable imaging devices to allow setting of global properties such as date and time from the PC through Windows Image Acquisition (WIA) For information about WIA, see:
http://www.microsoft.com/hwdev/wia/

§         Obtain the GDI+ developer beta when it becomes available. For information, send email to gdiphw@microsoft.com

§         Read about GDI+ in GDI+: Next-Generation Graphics Device Interface at:
http://www.microsoft.com/hwdev/video/GDInext.htm