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.


评论
要发表评论,请点击 此处 登录到您的 MathWorks 帐户或创建一个新帐户。