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 アカウントにサインインするか新しい MathWorks アカウントを作成します。