TIF图像文件结构详解

TIF图像文件结构详解

报告时间:2022年06月24日

报告人:赵进

报告摘要:本文主要针对TIF格式图像文件结构进行详解,并且根据TIF文件结构,应用C++语言实现tif波纹板深度图像的读写。

应用软件:VS2019          

1TIF图像说明

TIFF是最复杂的一种位图文件格式。TIFF是基于标记的文件格式,它广泛地应用于对图像质量要求较高的图像的存储与转换。由于它的结构灵活和包容性大,它已成为图像文件格式的一种标准,绝大多数图像系统都支持这种格式。

 
下面创建了一个5*3像素的tif文件。详细分析一下:

3.1 分析IFH

1IFH共占用8个字节,根据上图可知为:49 49 2a 00 3a 00 00 00。字节顺序标志位(49 49),49转换为10进制为73,对应字母为I,即标志位位II,也就是小字节在前。

2TIFF标志位(2a 00),表示42

3IFD偏移量(3a 00 00 00),所以我们直接跳到3a查询第一个IFD,也就是第4(00000030),a列,所得数值为0f

3.2 IFD

根据第四行,第a列确定的数值为0fDE个数(0f 00),说明有15DE

3.3 DE

DE组成,分为TAG(2字节)、数据类型(2字节)、数量(4字节)、数值或指针(4字节)

说明:

1)这里需要说明的是字节是要按照从右向左方向读取。

2)例如:有两个字节(00 10),那么应该编译成01 00

3.3.1 第一个DE(起始3c)

TAG(fe 00)

通过查阅上表为NewSubfileType

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(00 00 00 00)

数值为0,具体含义参见上表或者链接地址说明。

3.3.2 第二个DE(起始48)

TAG(00 01)

通过查阅上表代码(0100)ImageWidth

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(00 00 00 05)

数值为5,印证了上面说的这个tif宽为5个像素。

3.3.3 第三个DE(起始54)

TAG(01 01)

通过查阅上表代码(0101)ImageLength

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(00 00 00 03)

数值为3,印证了上面说的这个tif高为3个像素。

3.3.4 第四个DE(起始60)

TAG(02 01)

通过查阅上表代码(0102)BitsPerSample

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(03 00 00 00)

所以数量为3

数值(f4 00 00 00)

数值为f4

3.3.5 第五个DE(起始6c)

TAG(03 01)

通过查阅上表代码(0103)Compression

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(05 00 00 00)

数值为55 = LZW

3.3.6 第六个DE(起始78)

TAG(06 01)

通过查阅上表代码(0106)PhotometricInterpretation

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(02 00 00 00)

数值为22 = RGB. 正常RGB图像,存储顺序为RGB.

3.3.7 第七个DE(起始84)

TAG(11 01)

通过查阅上表代码(0111)StripOffsets//起止代码

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(08 00 00 00)

数值为8.

3.3.8 第八个DE(起始90)

TAG(15 01)

通过查阅上表代码(0115)SamplesPerPixel

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(03 00 00 00)

数值为3,也就是RGB三个通道。

3.3.9 第九个DE(起始9c)

TAG(16 01)

通过查阅上表代码(0116)RowsPerStrip

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(03 00 00 00)

数值为3,这里的3指的高为3个像素。

3.3.10 第十个DE(起始a8)

TAG(17 01)

通过查阅上表代码(0117)StripByteCounts

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(32 00 00 00)

数值为50

3.3.11 第十一个DE(起始b4)

TAG(1a 01)

通过查阅上表代码(011a)XResolution

数据类型(05 00)

通过查询数据类型表格可知,数据类型为5 = RATIONAL Two LONGs: the first represents the numerator

数量(01 00 00 00)

所以数量为1

数值(fa 00 00 00)

数值为fa

3.3.12 第十二个DE(起始c0)

TAG(1b 01)

通过查阅上表代码(011b)YResolution

数据类型(05 00)

通过查询数据类型表格可知,数据类型为5 = RATIONAL Two LONGs: the first represents the numerator

数量(01 00 00 00)

所以数量为1

数值(02 01 00 00)

数值为102

3.3.13 第十三个DE(起始cc)

TAG(1c 01)

通过查阅上表代码(011c)PlanarConfiguration

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(01 00 00 00)

数值为1

3.3.14 第十四个DE(起始d8)

TAG(28 01)

通过查阅上表代码(0128)ResolutionUnit

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(02 00 00 00)

数值为2

3.3.15 第十五个DE(起始e4)

TAG(3d 01)

通过查阅上表代码(013d)****

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(02 00 00 00)

数值为2

补充说明:

TIFF文件中的三个关键词是:图像文件头Image File Header(IFH) 图像文件目录Image File Directory(IFD)和目录项Directory Entry(DE)。每一幅图像是以8字节的IFH开始的,这个IFH指向了第一个IFDIFD包含了图像的各种信息, 同时也包含了一个指向实际图像数据的指针。

IFH的构成:

Byte 0-1: 字节顺序标志位, 值为II或者MM。II表示小字节在前, 又称为little-endian。MM表示大字节在前,又成为big-endian。

Byte 2-3: TIFF的标志位,一般都是42

Byte 4-7: 第一个IFD的偏移量。可以在任意位置, 但必须是在一个字的边界,也就是说必须是2的整数倍。

IFD的构成(0代表此IFD的起始位置)

Byte 0-1: 表示此IFD包含了多少个DE,假设数目为n

Byt

TIF图像文件结构详解

报告时间:2022年06月24日

报告人:赵进

报告摘要:本文主要针对TIF格式图像文件结构进行详解,并且根据TIF文件结构,应用C++语言实现tif波纹板深度图像的读写。

应用软件:VS2019          

1TIF图像说明

TIFF是最复杂的一种位图文件格式。TIFF是基于标记的文件格式,它广泛地应用于对图像质量要求较高的图像的存储与转换。由于它的结构灵活和包容性大,它已成为图像文件格式的一种标准,绝大多数图像系统都支持这种格式。

TIFF 是一个灵活适应性强的文件格式,通过在文件头中包含标签它能够在一个文件中处理多幅图像和数据。标签能够标明图像的如图像大小这样的基本几何尺寸或者定义图像数据是如何排列的并且是否使用了各种各样的图像压缩选项。例如,TIFF可以包含JPEG行程长度编码压缩的图像。TIFF文件也可以包含基于矢量的裁剪区域(剪切或者构成主体图像的轮廓)。使用无损格式存储图像的能力使TIFF文件成为图像存档的有效方法。与JPEG不同,TIFF文件可以编辑然后重新存储而不会有压缩损失。其它的一些TIFF文件选项包括多层或者多页。

  TIFF有一个使用LZW压缩的选项,这是一种减小文件大小的无损技术,但是这项技术在不同的司法权限内为几个专利所涵盖。到了2005年,除了一个之外这些专利都已经到期,其中包括Unisys所拥有的广为人知又有很多争议的专利。另外一个著名的专利是IBM拥有的将在2006年8月11日到期的专利,IBM也没有要加强它的意思(who has shown no interest to date in enforcing it)。

  每个TIFF文件都是从指示字节顺序的两个字节开始的。“II”表示小字节在先、“MM”表示大字节在先字节顺序。后面的两个字节表示数字42。数字42是“为了其深刻的哲学意义"而选择的。 42的读法取决于头两个字节所表示的字节顺序。整个文件根据所指出的字节顺序进行读取(大小端的顺序)。

2TIF图像文件构成

2.1TIF文件概述

TIFF文件以.tif为扩展名。TIFF文件结构,这里不得不要提出三个关键词:IFH(图像文件头)IFD(图像文件目录)DE(目录项)。其中,IFH包含三项功能,分别是字节顺序标志位、TIFF标志位和第一个IFD偏移量。最后一个功能负责指向IFD的开端。当然,从IFH到第一个IFD还有一段字节,对于IFDDE,他们是包含的关系。一个TIFF文件可以有多个IFD。而每个IFD有记录了DE的个数以及DE的详细内容,最后还记录了下一个IFD的偏移量。而不是直接下一个IFD。如下图1就是一个tif文件的详细结构。

 
                                                                            1.tif详细结构

2.2IFH(图像文件头)

下图2可知IFH包括三部分组成,详细介绍如下:在每一个TIFF文件中第一个数据结构称为图像文件头或IFH,它是图像文件体系结构的最高层。这个结构在一个TIFF文件中是惟一的,有固定的位置。它位于文件的开始部分,包含了正确解释TIFF文件的其他部分所需的必要信息。

 
IFH数据结构包含3个成员共计8个字节,Byte order成员可能是“MM”(0x4d4d)“II”(0x4949)0x4d4d表示该TIFF图是摩托罗拉整数格式 0x4949表示该图是Intel整数格式;Version成员总是包含十进制42(0x2a),它用于进一步校验该文件是否为TIF格式,42这个数并不是一般人 想象中的那样认为是tif软件的版本,实际上,42这个数大概永远不会变化;第三个成员是IFD

2文件头三部分

2.2.1字节顺序标志位

占用两个字节(byte 0-1),值为II或者MM。II表示小字节在前, 又称为little-endian。MM表示大字节在前,又成为big-endian。

2.2.2 TIFF标志位

占用两个字节(byte 2-3),一般都是42。

2.2.3第一个IFD的偏移量

占用4个字节(byte 4-7),可以在任意位置, 但必须是在一个字的边界,也就是说必须是2的整数倍。需要注意的是,这里是IFD的偏移量。也就是说,从这个位置到第一个IFD中间还有一些字节。

2.3IFD(图像文件目录)

图像文件目录也包括三部分组成。

1.Directory Entry Count:指出在该IFDDE的个数;

2.Directory Entry:共12个字节,需要指出的是,DE的个数是不定的,因为每个DE只标识了图像的一个属性,那么这幅图像有N个属性就会有NDE,用户甚至可添加自定义的标记属性,这就是为什么称TIF格式文件为可扩充标记的文件的原因。

3.Offset to next IFD Or NULL:下一个IFD相对于文件开始处的位置,这是一个链式构成。如果该数字为0,表示已经是最后一个IFD。当然,如果该TIF文件只包含了一幅图像,那么就只有一个IFD,显然这个偏移量也会等于0

2.3.1 DE个数

占用两个字节(byte 0~1),当然这里的0表示的是相对位置,表示此IFD包含多少个DE,假设数据为n个。

2.3.2 DE的详细描述

占用n * 12 个字节,这一部分是DE的详细描述,每个DE占用12个字节(详细后面会说),所以nDE总共占用2~(n*12+1)。这里可以想一下为什么要加1

2.3.3 下一个IFD偏移量

占用4个字节,IFD偏移量,如果没有,则为0

2.4 DE(图像目录项)

IFDTIFF文件中第2个数据结构,它是一个名为标记(tag)的用于区分一个或多个可变长度数据块的表,标记中包含了有关于图像的所有信息。IFD提供了一系列的指针(索引),这些指针告诉我们各种有关的数据字段在文件中的开始位置,并给出每个字段的数据类型及长度。这种方法允许数据字段定位在文件的任何地方,且可以是任意长度,因此文件格式十分灵活。

IFDTIF图中最重要的数据结构,它包含了一个TIF文件中最重要的信息,一个TIF图可能有多个IFD,这说明文件中有多个图像,每个IFD标识1个图像的基本属性。 IFD结构中包含了三类成员,Directory Entry Count指出该结构里面有多少个目录入口;接下来就是N个线性排列的DE序列,数量不定(这就是 为什么称TIF格式文件为可扩充标记的文件,甚至用户可以添加自定义的标记属性),每个DE标识了图像的某一个属性;最后就是一个偏移量, 标识下一个文件目录相对于文件开始处的位置,当然,如果该TIF文件只包含了一幅图像,那么就只有一个IFD,显然,这个偏移量就等于0;如下图3是由DE 
分出来的目录项。

3 DE分出来的目录项。

2.4.1 TAG标识符

TAG:是该属性的标签编号(TagID),在图像文件目录中,它是按照升序排列的(但不一定是连续的)。这些编号在TIF格式官方白皮书中可以查到相应的含义,表格见参考文献(1)所示

2.4.2 数据类型

占字节数(2-3),数据类型。TIF官方指定的有5种数据类型(但是在TIFF6.0中,定义了12种数据类型),官方的数据类型:

type值          数据类型                 说明

-------------------------------------------------------------------------------------------------------------------------

0001            Byte                           字节型

0002            Ascii                 文本类型,7Ascii码加1位二进制0

0003          Integer                         整型

0004           Long                          长整型(4个字节)

0005       RATIONAL               分数类型,由两个Long组成,第1个是分子,第2个是分母

-------------------------------------------------------------------------------------------------------------------------

                                                           

2.4.3 数量

length上述该种数据类型的数据的个数,而不是某个数据的长度。占用4个字节数(4-7)。通过类型和数量可以确定存储此TAG的数据需要占据的字节数

2.4.4 数值或指针

占用4个字节(8-11) 如果占用的字节数少于4 则数据直接存于此。 如果超过4个,则这里存放的是指向实际数据的指针。valueOffset:是tagID代表的变量值相对文件开始处的偏移量,但如果变量值占用的空间不多于4个字节(例如只有1Integer类型的值),那么该值就直接存放在valueOffset中,没必要再另外指向一个地方了。

3TIF图像实例

 
下面创建了一个5*3像素的tif文件。详细分析一下:

3.1 分析IFH

1IFH共占用8个字节,根据上图可知为:49 49 2a 00 3a 00 00 00。字节顺序标志位(49 49),49转换为10进制为73,对应字母为I,即标志位位II,也就是小字节在前。

2TIFF标志位(2a 00),表示42

3IFD偏移量(3a 00 00 00),所以我们直接跳到3a查询第一个IFD,也就是第4(00000030),a列,所得数值为0f

3.2 IFD

根据第四行,第a列确定的数值为0fDE个数(0f 00),说明有15DE

3.3 DE

DE组成,分为TAG(2字节)、数据类型(2字节)、数量(4字节)、数值或指针(4字节)

说明:

1)这里需要说明的是字节是要按照从右向左方向读取。

2)例如:有两个字节(00 10),那么应该编译成01 00

3.3.1 第一个DE(起始3c)

TAG(fe 00)

通过查阅上表为NewSubfileType

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(00 00 00 00)

数值为0,具体含义参见上表或者链接地址说明。

3.3.2 第二个DE(起始48)

TAG(00 01)

通过查阅上表代码(0100)ImageWidth

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(00 00 00 05)

数值为5,印证了上面说的这个tif宽为5个像素。

3.3.3 第三个DE(起始54)

TAG(01 01)

通过查阅上表代码(0101)ImageLength

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(00 00 00 03)

数值为3,印证了上面说的这个tif高为3个像素。

3.3.4 第四个DE(起始60)

TAG(02 01)

通过查阅上表代码(0102)BitsPerSample

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(03 00 00 00)

所以数量为3

数值(f4 00 00 00)

数值为f4

3.3.5 第五个DE(起始6c)

TAG(03 01)

通过查阅上表代码(0103)Compression

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(05 00 00 00)

数值为55 = LZW

3.3.6 第六个DE(起始78)

TAG(06 01)

通过查阅上表代码(0106)PhotometricInterpretation

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(02 00 00 00)

数值为22 = RGB. 正常RGB图像,存储顺序为RGB.

3.3.7 第七个DE(起始84)

TAG(11 01)

通过查阅上表代码(0111)StripOffsets//起止代码

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(08 00 00 00)

数值为8.

3.3.8 第八个DE(起始90)

TAG(15 01)

通过查阅上表代码(0115)SamplesPerPixel

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(03 00 00 00)

数值为3,也就是RGB三个通道。

3.3.9 第九个DE(起始9c)

TAG(16 01)

通过查阅上表代码(0116)RowsPerStrip

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(03 00 00 00)

数值为3,这里的3指的高为3个像素。

3.3.10 第十个DE(起始a8)

TAG(17 01)

通过查阅上表代码(0117)StripByteCounts

数据类型(04 00)

通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

数量(01 00 00 00)

所以数量为1

数值(32 00 00 00)

数值为50

3.3.11 第十一个DE(起始b4)

TAG(1a 01)

通过查阅上表代码(011a)XResolution

数据类型(05 00)

通过查询数据类型表格可知,数据类型为5 = RATIONAL Two LONGs: the first represents the numerator

数量(01 00 00 00)

所以数量为1

数值(fa 00 00 00)

数值为fa

3.3.12 第十二个DE(起始c0)

TAG(1b 01)

通过查阅上表代码(011b)YResolution

数据类型(05 00)

通过查询数据类型表格可知,数据类型为5 = RATIONAL Two LONGs: the first represents the numerator

数量(01 00 00 00)

所以数量为1

数值(02 01 00 00)

数值为102

3.3.13 第十三个DE(起始cc)

TAG(1c 01)

通过查阅上表代码(011c)PlanarConfiguration

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(01 00 00 00)

数值为1

3.3.14 第十四个DE(起始d8)

TAG(28 01)

通过查阅上表代码(0128)ResolutionUnit

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(02 00 00 00)

数值为2

3.3.15 第十五个DE(起始e4)

TAG(3d 01)

通过查阅上表代码(013d)****

数据类型(03 00)

通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

数量(01 00 00 00)

所以数量为1

数值(02 00 00 00)

数值为2

补充说明:

TIFF文件中的三个关键词是:图像文件头Image File Header(IFH) 图像文件目录Image File Directory(IFD)和目录项Directory Entry(DE)。每一幅图像是以8字节的IFH开始的,这个IFH指向了第一个IFDIFD包含了图像的各种信息, 同时也包含了一个指向实际图像数据的指针。

IFH的构成:

Byte 0-1: 字节顺序标志位, 值为II或者MM。II表示小字节在前, 又称为little-endian。MM表示大字节在前,又成为big-endian。

Byte 2-3: TIFF的标志位,一般都是42

Byte 4-7: 第一个IFD的偏移量。可以在任意位置, 但必须是在一个字的边界,也就是说必须是2的整数倍。

IFD的构成(0代表此IFD的起始位置)

Byte 0-1: 表示此IFD包含了多少个DE,假设数目为n

Byte 2-(n*12+1): n个DE

Byte (n*12+2)-(n*12+5): 下一个IFD的偏移量,如果没有则置为0

DE的构成:

Byte 0-1: 此TAG的唯一标识

Byte 2-3: 数据类型。

Byte 4-7: 数量。通过类型和数量可以确定存储此TAG的数据需要占据的字节数

Byte 8-11: 如果占用的字节数少于4, 则数据直接存于此。 如果超过4个,则这里存放的是指向实际数据的指针

参考文献:

(1)TIFF格式详解https://blog.csdn.net/oYinHeZhiGuang/article/details/121710467

(2)博客园:https://www.cnblogs.com/gywei/p/3393816.html

(3)代码参考:CSDN:https://blog.csdn.net/Terrence_Pai/article/details/124356029

(4)CSDN:https://blog.csdn.net/qq_24003917/article/details/107425216

(5)CSDN:https://blog.csdn.net/weixin_44886683/article/details/119188230                  

(6)https://wenku.baidu.com/view/aeea12c69d3143323968011ca300a6c30c22f19a.html

(7)tif图像研究:https://blog.csdn.net/xiyangxiaoguo/article/details/10011380e 2-(n*12+1): n个DE

Byte (n*12+2)-(n*12+5): 下一个IFD的偏移量,如果没有则置为0

DE的构成:

Byte 0-1: 此TAG的唯一标识

Byte 2-3: 数据类型。

Byte 4-7: 数量。通过类型和数量可以确定存储此TAG的数据需要占据的字节数

Byte 8-11: 如果占用的字节数少于4, 则数据直接存于此。 如果超过4个,则这里存放的是指向实际数据的指针

参考文献:

(1)TIFF格式详解https://blog.csdn.net/oYinHeZhiGuang/article/details/121710467

(2)博客园:https://www.cnblogs.com/gywei/p/3393816.html

(3)代码参考:CSDN:https://blog.csdn.net/Terrence_Pai/article/details/124356029

(4)CSDN:https://blog.csdn.net/qq_24003917/article/details/107425216

(5)CSDN:https://blog.csdn.net/weixin_44886683/article/details/119188230                  

(6)tif格式详解 - 百度文库

(7)tif图像研究:https://blog.csdn.net/xiyangxiaoguo/article/details/10011380

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值