本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

Tiff

LibTIFF 库例程的 MATLAB 入口

说明

Tiff 对象表示与带标记的图像文件格式 (TIFF) 文件的连接,并提供对 LibTIFF 库的许多函数的访问。Tiff 提供的功能比 imreadimwrite 函数更多,例如读取子图像、写入图像数据的图块和条带以及修改单个 TIFF 标记。

在大多数情况下,Tiff 对象函数的语法与对应的 LibTIFF 库函数的语法类似。要充分了解 Tiff 对象的功能,请参阅 LibTIFF API 以及 TIFF 规范和技术说明。要查看此文档,请访问 LibTIFF - TIFF Library and Utilities

MATLAB® 支持 LibTIFF 版本 4.0.10。有关 LibTIFF 库的版权信息,请参阅 libtiffcopyright.txt 文件。

创建对象

说明

示例

obj = Tiff(filename) 创建一个 Tiff 对象,用于对 TIFF 文件 filename 进行读取访问。

示例

obj = Tiff(filename,mode) 创建一个 Tiff 对象,其中 mode 指定该对象对 TIFF 文件的访问类型。

输入参数

全部展开

文件的名称,指定为字符向量或字符串标量。

示例: 'myfile.tif'

文件访问类型,指定为下列值之一。

参数说明
'r'打开文件以便读取(默认值)。
'w'打开文件以便写入;放弃现有内容。
'w8'打开文件以便写入 BigTIFF 文件;放弃现有内容。
'a'打开或创建文件以便写入;将数据追加到文件末尾。
'r+'打开(而非创建)文件以便读写。

当您打开 TIFF 文件进行写入或追加时,Tiff 对象会自动在文件中创建一个 IFD 以写入后续数据。该 IFD 带有 TIFF 修订版 6.0 中指定的所有默认值。

属性

全部展开

TIFF 文件由包含图像数据和关联标记的图像文件目录 (IFD) 组成。标记包含图像相关信息,例如图像宽度、图像高度和样本数量。每个 TIFF 属性都是为标记提供值的结构体。使用 setTag 函数设置标记值。例如,创建一个文件并指定 JPEG 压缩。

t = Tiff('myfile.tif','w');
setTag(t,'Compression',Tiff.Compression.JPEG);

创建文件时,在将数据写入文件之前,必须先设置以下标记:

ImageWidthCompression
ImageLengthPlanarConfiguration
BitsPerSamplePhotometric
SamplesPerPixel 

根据图像的布局,您必须设置以下额外标记:

  • 条状布局 - 设置 RowsPerStrip 标记。

  • 分块布局 - 设置 TileWidthTileHeight 标记。

图像数据压缩方案,存储在具有下列字段的结构体中。

字段名称
None
CCITTRLE (Read-only)
CCITTFax3
CCITTFax4
LZW
OJPEG
JPEG
AdobeDeflate
...

要查看 MATLAB 所支持的有关 Compression 标记的值的完整列表,请在命令行窗口中键入 Tiff.Compression

示例: setTag(t,'Compression',Tiff.Compression.JPEG);

额外通道说明,存储在具有下列字段的结构体中。

字段名称说明
Unspecified未指定的数据
AssociatedAlpha关联的 alpha(预乘)
UnassociatedAlpha未关联的 alpha 数据

如果除了通常的比色通道外还存在额外通道,则需要 ExtraSamples 标记。有关示例用法,请参阅用颜色和 alpha 通道数据编写 Tiff 图像

示例: setTag(t,'ExtraSamples',Tiff.ExtraSamples.AssociatedAlpha)

Group 3 传真压缩选项,存储在具有下列字段的结构体中。

字段名称说明
Encoding2D

第 0 位为 1。

此值指定二维编码。如果指定了多个条带,每个条带都必须以一个一维编码行开头。也就是说,RowsPerStrip 必须是参数 K 的倍数,如 CCITT 规范中所述。

Uncompressed

第 1 位为 1。

此值指定编码时的未压缩模式。

FillBits

第 2 位为 1。

根据需要在 EOL 代码之前添加填充位,以使 EOL 始终在字节边界上结束。这将确保半字节零在 EOL 序列之前 1 个字节。例如,xxxx-0000 0000-0001

此属性也称为 Fax3T4Options。该属性的值是由前 3 个位控制的一个位掩码。

示例: setTag(t,'Group3Options',Tiff.Group3Options.Uncompressed);

分色图像油墨组,存储在具有下列字段的结构体中。

字段名称说明
CMYK分量顺序:青蓝色、品红色、黄色、黑色。通常,值为 0 表示该分量的油墨覆盖率是 0%,值为 255 表示该分量的油墨覆盖率是 100%,但是请查阅 DotRange 的 TIFF 规范。指定 CMYK 时,请不要设置 InkNames 标记。
MultiInkCMYK 以外的任何顺序。有关所使用的油墨说明,请查阅 InkNames 字段的 TIFF 规范。

就该属性而言,分色是光学意义上的,而非平面分层。

示例: setTag(t,'InkSet',Tiff.InkSet.CMYK);

颜色模式,存储在具有下列字段的结构体中。

字段名称说明
Raw(默认值)将输入作为单独的 Y、Cb 和 Cr 矩阵保留。
RGB将 RGB 输入转换为 YCbCr。

不要使用此属性将 YCbCr 图像读取为 RGB,而应使用 readRGBAImagereadRGBAStripreadRGBATile 函数提供的 RGBA 接口。

有关示例,请参阅 根据 RGB 数据创建 YCbCr/JPEG 图像

示例: setTag(t,'JPEGColorMode',Tiff.JPEGColorMode.RGB);

图像数据的视觉方向,存储在具有下列字段的结构体中。

字段名称
TopLeft
TopRight
BottomRight
BottomLeft
LeftTop
RightTop
RightBottom
LeftBottom

Orientation 属性描述相对于行和列的图像方位。例如,当 Orientation 设置为 TopLeft 时,第一行表示图像的顶部,第一列表示左侧。Orientation 中指定的值仅供参考,它不会影响 MATLAB 读取或写入图像数据的方式。

示例: setTag(t,'Orientation',Tiff.Orientation.TopLeft);

图像数据的颜色空间,存储在具有下列字段的结构体中。

字段名称
MinIsWhite
MinIsBlack
RGB
Palette
Mask
Separated (CMYK)
YCbCr
CIELab
ICCLab
ITULab
LogL
LogLUV
CFA
LinearRaw

示例: setTag(t,'Photometric',Tiff.Photometric.RGB);

图像分量值的存储配置,存储在具有下列字段的结构体中。

字段名称说明
Chunky连续存储每个像素的分量值。例如,对于 RGB 数据,文件中的前三个像素存储为 RGBRGBRGB。几乎所有 TIFF 图像都具有连续的平面配置。
Separate分开存储每个像素的分量值。例如,对于 RGB 数据,红色分量将与绿色分量和蓝色分量分开存储在文件中。

示例: setTag(t,'PlanarConfiguration',Tiff.PlanarConfiguration.Chunky);

用来解释 XResolutionYResolution 标记中包含的值的分辨率单位,存储在具有下列字段的结构体中。

字段名称说明
None默认值。
InchXResolutionYResolution 标记包含的值分配单位英寸。
CentimeterXResolutionYResolution 标记包含的值分配单位厘米。

例如,以下代码将 XY 方向上的图像分辨率值设置为每英寸 300 个像素:

setTag(t,'ResolutionUnit',Tiff.ResolutionUnit.Inch);
setTag(t,'XResolution',300);
setTag(t,'YResolution',300);

示例: setTag(t,'ResolutionUnit',Tiff.ResolutionUnit.Inch);

像素样本格式,存储在具有下列字段的结构体中。

字段名称说明
UInt(默认值)无符号整数数据
Int2 的补码有符号整数数据
IEEEFPIEEE 浮点数据

MATLAB 不支持 VoidComplexIntComplexIEEEFP 格式。

示例: setTag(t,'SampleFormat',Tiff.SampleFormat.IEEEFP);

SGIL 编解码器数据格式,存储在具有下列字段的结构体中。

字段名称说明
Float单精度样本。
Bits8uint8 样本(只读)。

SGILogDataFmt 设置为 FloatBits8 表示对于 LogLuv 图像来说 SamplesPerPixel 值为 3,对于 LogL 图像来说值为 1

对于 LogL/LogLuv TIFF 图像对象的每个实例,您只能设置一次 SGILogDataFmt 标记。

使用以下代码创建一个 Tiff 对象,设置 SGIL 数据格式,然后读取图像数据。

tiffobj = Tiff('example.tif','r');
setDirectory(tiffobj,3); % image three is a LogLuv image
setTag(tiffobj,'SGILogDataFmt',Tiff.SGILogDataFmt.Float);
imdata = read(tiffobj);

示例: setTag(t,'SGILogDataFmt',Tiff.SGILogDataFmt.Float);

图像的类型,存储在具有下列字段的结构体中。

字段名称说明
Default单个图像文件或第一个图像的默认值。
ReducedImage图像是多图像(或多页)文件的单个图像。
Page未关联的 alpha 数据。
Mask图像是文件中其他图像的透明度掩码。光度解释值必须是 Photometric.Mask

示例: setTag(t,'SubFileType',Tiff.SubFileType.Mask);

MATLAB 支持的 TIFF 标记 ID,存储在具有下列字段的结构体中。

字段名称
SubFileType254
ImageWidth256
ImageLength257
BitsPerSample258
Compression259
Photometric262
Thresholding263
FillOrder266
......

有关标记名称及其对应标记 ID 的完整列表,请在命令行窗口中键入 Tiff.TagID

当您使用 setTag 函数时,可使用此属性指定标记。例如,Tiff.TagID.ImageWidth 返回 ImageWidth 标记的 ID。要获得所有支持的标记的列表,请使用 Tiff.getTagNames 函数。

示例: setTag(t,Tiff.TagID.ImageWidth,300);

阈值方法,存储在具有下列字段的结构体中。

字段名称
BiLevel
HalfTone
ErrorDiffuse

使用此标记指定将像素从灰度转换为黑白时使用的算法。

示例: setTag(t,'Thresholding',Tiff.Thresholding.HalfTone);

色度样本相对于亮度样本的位置,存储在具有下列字段的结构体中。

字段名称说明
Centered指定此值以与行业标准(如 PostScript® Level 2)兼容。
Cosited指定此值以与大多数数字视频标准(如 CCIR Recommendation 601-1)兼容。

示例: setTag(t,'YCbCrPositioning',Tiff.YCbCrPositioning.Centered);

对象函数

TIFF 文件由一个或多个图像文件目录 (IFD) 组成。IFD 包含图像数据及其关联的元数据。IFD 可以包含子 IFD,后者也包含图像数据和元数据。当您打开 TIFF 文件进行读取时,Tiff 对象将使文件中的第一个 IFD 成为当前 IFD。Tiff 对象函数作用于当前 IFD。

全部展开

read读取整个 TIFF 图像
readEncodedStrip从指定条带读取数据
readEncodedTile从指定图块读取数据
readRGBAImage使用 RGBA 接口读取图像
readRGBAStrip使用 RGBA 接口读取条带数据
readRGBATile使用 RGBA 接口读取图块数据
close关闭 Tiff 对象
write写整个图像
writeEncodedStrip将数据写入到指定的条带
writeEncodedTile将数据写入到指定的图块
close关闭 Tiff 对象
getTag指定标记的值
setTag设置标记的值
Tiff.getTagNames识别的 TIFF 标记的列表
currentDirectory返回当前 IFD 的索引
lastDirectory确定当前 IFD 是否为文件中的最后一个目录
nextDirectory使下一个 IFD 成为当前 IFD
setDirectory使指定的 IFD 成为当前 IFD
setSubDirectory使 subIFD 成为当前 IFD
rewriteDirectory将修改后的元数据写入现有 IFD
writeDirectory创建新的 IFD 并将其设置为当前 IFD
isTiled确定图像是否为分块布局
computeTile包含指定坐标的图块的编号
numberOfTiles图像中的图块总数
computeStrip包含指定坐标的条带的索引编号
numberOfStrips图像中的条带总数
getVersionLibTIFF 库版本

示例

全部折叠

创建一个名为 myfile.tif 的新文件。要运行此示例,您必须具有该文件夹的写访问权限。

t = Tiff('myfile.tif','w');

关闭 Tiff 对象。

close(t);

对于包含颜色和 alpha 通道的数据集,请设置 Tiff 标记,然后将数据写入文件。

创建一个包含颜色通道和 alpha 通道的数据数组 data

rgb = imread('example.tif');
numrows = size(rgb,1);
numcols = size(rgb,2);
alpha = 255*ones([numrows numcols], 'uint8');
data = cat(3,rgb,alpha);

创建一个 Tiff 对象。

t = Tiff('myfile.tif','w');

设置 Tiff 标记并指定 ExtraSamples 标记的值,因为除颜色通道外,数据还包含 alpha 通道。

setTag(t,'Photometric',Tiff.Photometric.RGB);
setTag(t,'Compression',Tiff.Compression.None);
setTag(t,'BitsPerSample',8);
setTag(t,'SamplesPerPixel',4);
setTag(t,'SampleFormat',Tiff.SampleFormat.UInt);
setTag(t,'ExtraSamples',Tiff.ExtraSamples.Unspecified);
setTag(t,'ImageLength',numrows);
setTag(t,'ImageWidth',numcols);
setTag(t,'TileLength',32);
setTag(t,'TileWidth',32);
setTag(t,'PlanarConfiguration',Tiff.PlanarConfiguration.Chunky);

将数据写入 TIFF 文件并关闭 Tiff 对象。

write(t,data);
close(t);

将 RGB 图像数据作为 YCbCr/JPEG 图像写入 TIFF 文件。

获取 RGB 数据。

rgb = imread('example.tif');

创建 Tiff 对象 t,并设置标记。使用 JPEGColorMode 标记指定输入数据为 RGB。

t = Tiff('myfile.tif','w');
setTag(t,'Photometric',Tiff.Photometric.YCbCr);
setTag(t,'Compression',Tiff.Compression.JPEG);
setTag(t,'YCbCrSubSampling',[2 2]);
setTag(t,'BitsPerSample',8);
setTag(t,'SamplesPerPixel',3);
setTag(t,'SampleFormat',Tiff.SampleFormat.UInt);
setTag(t,'ImageLength',size(rgb,1));
setTag(t,'ImageWidth',size(rgb,2));
setTag(t,'TileLength',32);
setTag(t,'TileWidth',32);
setTag(t,'PlanarConfiguration',Tiff.PlanarConfiguration.Chunky);
setTag(t,'JPEGColorMode',Tiff.JPEGColorMode.RGB);
setTag(t,'JPEGQuality',75);

将数据写入 TIFF 文件并关闭 Tiff 对象。

write(t,rgb);
close(t);
在 R2009b 中推出