- About Graphics Mill
- What's New?
- Breaking Changes in Graphics Mill 12
- Breaking Changes in Graphics Mill 11
- Features
- Supported File Formats
- System Requirements
- Getting Started
- Working with Image Formats
- Transforming Images (Resize, Rotate, Crop)
- Working with Metadata
- Color Management and Color Reduction
- Drawing Text and Graphics
- Color Keying (Green Screen Removal)
- Channels and Pixel Data
- Color and Tone Correction
- Working with Photoshop (PSD) Files
- Image Filters
- Processing Large Images
- Basics of Image Processing
- Troubleshooting
- Class Library Reference
- Licensing
- End User License Agreement
- Copyright Notices
Preserving Metadata while Processing Images
When you process JPEG or TIFF images, you may wonder what happens to EXIF and IPTC metadata. It is especially important when you use some specific software to handle the resulting images, for example printing them at a photo lab or categorizing them based on metadata.
Fortunately, Graphics Mill provides an elegant way to preserve metadata. The idea is quite simple: use an image reader to get not only the bitmap but also metadata from a source image, and when the image is processed put the modified bitmap and the metadata in a resulting file via an image writer.
The code snippet below demonstrates how to implement this approach. The code does the following:
- Loads an image and associated EXIF, IPTC, XMP fields, and Adobe® image resource blocks.
- Resizes the image.
- Updates metadata.
- Saves the new image and metadata to a file.
C#
using (var jpegReader = new JpegReader(@"Images\in.jpg"))
using (var resizer = new Resize(jpegReader.Width / 2, 0))
using (var jpegWriter = new JpegWriter(@"Images\out.jpg"))
{
//Read EXIF
var exif = jpegReader.Exif;
//Check if loaded image contains EXIF metadata
if (exif == null)
{
exif = new ExifDictionary();
}
exif[ExifDictionary.Software] = "Aurigma Graphics Mill";
//Read IPTC
var iptc = jpegReader.Iptc;
//Check if loaded image contains IPTC metadata
if (iptc == null)
{
iptc = new IptcDictionary();
}
iptc[IptcDictionary.Keyword] = "mountain";
//Read Adobe resource blocks
var adobeResources = jpegReader.AdobeResources;
//Check if loaded image contains Adobe image resource blocks
if (adobeResources == null)
{
adobeResources = new AdobeResourceDictionary();
}
//Create new adobe image resource block containing copyright metadata
var arBlock = new AdobeResourceBlock("Copyright", new byte[] { 1 });
//Set this block to the item with 0x040A ID (copyright flag)
adobeResources[0x040A] = arBlock;
//Read XMP
var xmp = new XmpData();
//Check if loaded image contains XMP metadata
if (jpegReader.Xmp != null)
{
xmp.Load(jpegReader.Xmp);
}
//Create a node containing dc:creator metadata
var node = new XmpValueNode(XmpNodeType.SimpleProperty, "John Wood", XmpTagNames.DCCreator);
xmp.AddNode(node);
//Write metadata
jpegWriter.Exif = exif;
jpegWriter.Iptc = iptc;
jpegWriter.AdobeResources = adobeResources;
jpegWriter.Xmp = xmp.Save();
Pipeline.Run(jpegReader + resizer + jpegWriter);
}