Embedding an ICC profile into a TIFF file
The R2009b release of MATLAB contains a new Tiff class. The primary purpose of this class is to provide lower-level access to creating and modifying image data and metadata in an existing TIFF file.
Several customers have asked for the ability to embed an ICC profile into a TIFF file. The Image Processing Toolbox function iccread can read a profile embedded in a TIFF file, but iccwrite can only write a stand-alone profile file.
Here is code using the new Tiff class to embed a profile in an existing TIFF file. Let's start by rewriting one of the Image Processing Toolbox sample PNG image files as a TIFF file.
rgb = imread('peppers.png'); imwrite(rgb, 'peppers.tif'); s = dir('peppers.tif')
s = name: 'peppers.tif' date: '20-Oct-2009 09:14:29' bytes: 593880 isdir: 0 datenum: 7.3407e+005
Now let's embed the sample profile sRGB.icm into the TIFF file we just made.
Step 1. Read in the raw bytes of the profile file.
fid = fopen('sRGB.icm'); raw_profile_bytes = fread(fid, Inf, 'uint8=>uint8'); fclose(fid);
Step 2. Initialize a Tiff object using 'r+' mode (read and modify).
tif = Tiff('peppers.tif', 'r+')
tif = TIFF File: 'peppers.tif' Mode: 'r+' Current Image Directory: 1 Number Of Strips: 77 SubFileType: Tiff.SubFileType.Default Photometric: Tiff.Photometric.RGB ImageLength: 384 ImageWidth: 512 RowsPerStrip: 5 BitsPerSample: 8 Compression: Tiff.Compression.PackBits SampleFormat: Tiff.SampleFormat.UInt SamplesPerPixel: 3 PlanarConfiguration: Tiff.PlanarConfiguration.Chunky Orientation: Tiff.Orientation.TopLeft
Step 3. Embed the profile bytes as a TIFF tag.
tif.setTag('ICCProfile', raw_profile_bytes);
Step 4. Tell the Tiff object to update the image metadata in the file.
tif.rewriteDirectory();
Step 5. Close the Tiff object.
tif.close();
Now the TIFF file contains the profile. Notice the file size has changed.
s = dir('peppers.tif')
s = name: 'peppers.tif' date: '20-Oct-2009 09:14:30' bytes: 597828 isdir: 0 datenum: 7.3407e+005
And we can read in the profile using iccread.
p = iccread('peppers.tif')
p = Header: [1x1 struct] TagTable: {17x3 cell} Copyright: 'Copyright (c) 1999 Hewlett-Packard Company' Description: [1x1 struct] MediaWhitePoint: [0.9505 1 1.0891] MediaBlackPoint: [0 0 0] DeviceMfgDesc: [1x1 struct] DeviceModelDesc: [1x1 struct] ViewingCondDesc: [1x1 struct] ViewingConditions: [1x1 struct] Luminance: [76.0365 80 87.1246] Measurement: [1x1 struct] Technology: 'Cathode Ray Tube Display' MatTRC: [1x1 struct] PrivateTags: {} Filename: 'peppers.tif'
It would be logical to enhance iccwrite to make this easier for you. We'll look into that, although I'm not sure when that might happen.
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.