Adobe® applications (Adobe® Photoshop® and the others) store metadata in special format called Adobe® image resource blocks. This metadata format is used to store non-pixel data associated with an image, such as image resolution, color management settings, clipping path and so on. Graphics Mill for .NET supports manipulation with Adobe image resource blocks for TIFF and JPEG image formats.
The metadata format consists of independable pieces of structured data, each of them corresponds to information type defined in specification. Each piece of data (image resource block) consisits of the following fields:
Format in which resource data is stored depends on type of image resource block. All supported types of image resource blocks and their formats are listed in Adobe Photoshop File Format Specification.
Graphics Mill for .NET has two classes which deals with Adobe image resource blocks: AdobeResourceBlock and AdobeResourceDictionary. AdobeResourceBlock stores information about particular Image resource block: name, resource data and its size. Graphics Mill for .NET does not include tools for resource data manipulation. This class just stores it as a binary buffer and users should parse and construct it by themselves. AdobeResourceDictionary class represents collection of AdobeResourceBlock instances. This class is constructed as hash-table, which stores instances of AdobeResourceBlock and provides access to them by unique identifiers. These identifiers correspond to image resource block types and defined in specification.
No validation of the resource data internal structure is performed during encoding so user is responsible for providing correctly filled AdobeResourceBlock instances. Files which have been saved with incorrect Adobe® image resource blocks can produce errors during opening or processing in Adobe® applications.
As mentoined above, Graphics Mill for .NET supports Adobe Image Resource Blocks metadata for TIFF and JPEG file formats. To extract the metadata you need to get AdobeResources property value of TiffReader or JpegReader instance. If an image on which the reader is opened contains Adobe Image Resource Blocks the property returns AdobeResourceDictionary collection storing image resource blocks, otherwise the property returns null. The code sample below demonstrates how to use these classes to extract metadata from image files.
To write Adobe Image Resource Blocks metadata along with TIFF or JPEG image you need to prepare AdobeResourceDictionary collection filled in blocks needed to save. Then you just pass this collection to the AdobeResources property of opened TiffWriter or JpegWriter instance. The second way is to put Adobe® image resource blocks into TiffEncoderOptions or JpegEncoderOptions, and pass it to the Bitmap.Save method.
The following code sample demonstrates how to remove thumbnail from Adobe® image resource blocks and mark the image as copyrighted. Thumbnail block ID is 0x0409 and copyright flag ID is 0x040A.
Dim srcFileName As String = "c:/mountain.jpg" Dim dstFileName As String = "c:/mountain2.jpg" ' Open reader on the file you need to modify metadata for Dim reader As New Aurigma.GraphicsMill.Codecs.JpegReader(srcFileName) Dim adobeResources As Aurigma.GraphicsMill.Codecs.AdobeResourceDictionary = reader.AdobeResources If adobeResources Is Nothing Then adobeResources = New Aurigma.GraphicsMill.Codecs.AdobeResourceDictionary End If ' Create new adobe image resource block with the required metadata Dim arBlock As New Aurigma.GraphicsMill.Codecs.AdobeResourceBlock("Copyright", New Byte() {1}) ' Set this block to the item with 0x040A ID (copyright flag) adobeResources.Item(&H40A) = arBlock ' Remove a block with 0x0409 (thumbnail data) adobeResources.Remove(&H409) ' Write new bitmap and metadata Dim writer As New Aurigma.GraphicsMill.Codecs.JpegWriter() writer.Open(dstFileName) writer.AdobeResources = adobeResources writer.AddFrame(reader.LoadFrame(0)) writer.Close() reader.Close()
string srcFileName = @"c:/mountain.jpg"; string dstFileName = @"c:/mountain2.jpg"; using (Aurigma.GraphicsMill.Codecs.JpegReader reader = new Aurigma.GraphicsMill.Codecs.JpegReader()) { // Open reader on the file you need to modify metadata for reader.Open(srcFileName); Aurigma.GraphicsMill.Codecs.AdobeResourceDictionary adobeResources = reader.AdobeResources; if (adobeResources == null) { adobeResources = new Aurigma.GraphicsMill.Codecs.AdobeResourceDictionary(); } // Create new adobe image resource block with the required metadata Aurigma.GraphicsMill.Codecs.AdobeResourceBlock arBlock = new Aurigma.GraphicsMill.Codecs.AdobeResourceBlock("Copyright", new byte[] { 1 }); // Set this block to the item with 0x040A ID (copyright flag) adobeResources[0x040A] = arBlock; // Remove a block with 0x0409 (thumbnail data) adobeResources.Remove(0x0409); // Write new bitmap and metadata using (Aurigma.GraphicsMill.Codecs.JpegWriter writer = new Aurigma.GraphicsMill.Codecs.JpegWriter()) { writer.Open(dstFileName); writer.AdobeResources = adobeResources; writer.AddFrame(reader.LoadFrame(0)); } }