jpeg文件数据结构以及将位图保存为jpg的代码.docx
- 文档编号:8215226
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:7
- 大小:22.63KB
jpeg文件数据结构以及将位图保存为jpg的代码.docx
《jpeg文件数据结构以及将位图保存为jpg的代码.docx》由会员分享,可在线阅读,更多相关《jpeg文件数据结构以及将位图保存为jpg的代码.docx(7页珍藏版)》请在冰豆网上搜索。
jpeg文件数据结构以及将位图保存为jpg的代码
jpeg文件数据结构以及将位图保存为jpg的代码
JPEG文件数据结构以及将位图保存为JPG的代码一、简述
JPEG是一个压缩标准,又可分为标准JPEG、渐进式JPEG及JPEG2000三种:
①标准JPEG:
以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有损耗的。
此类型图片在网页下载时只能由上而下依序显示图片,直到图片资料全部下载完毕,才能看到全貌。
②渐进式JPEG:
渐进式JPG为标准JPG的改良格式,支持交错,可以在网页下载时,先呈现出图片的粗略外观后,再慢慢地呈现出完整的内容,渐进式JPG的文件比标准JPG的文件要来得小。
③JPEG2000:
新一代的影像压缩法,压缩品质更好,其压缩率比标准JPEG高约30%左右,同时支持有损和无损压缩。
一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,让图像由朦胧到清晰显示。
以一幅24位彩色图像为例,JPEG的压缩分为四个步骤:
①颜色转换:
在将彩色图像进行压缩之前,必须先对颜色模式进行数据转换。
转换完成之后还需要进行数据采样。
②DCT变换:
是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程,然后再对图像的高频部分(即图像细节)进行压缩。
首先以象素为单位将图像划分为多个8×8的矩阵,然后对每一个矩阵作DCT变换。
把8×8的象素矩阵变成8×8的频率系数矩阵(所谓频率就是颜色改变的速度),频率系数都是浮点数。
③量化:
由于下面第四步编码过程中使用的码本都是整数,因此要对频率系数进行量化,将之转换为整数。
数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。
这一过程中,质量因子的选取至为重要。
值选得大,可以大幅度提高压缩比,但是图像质量就比较差,质量因子越小图像重建质量越好,但是压缩比越低。
④编码:
编码是基于统计特性的方法。
四个步骤都完成后的JPEG文件,其基本数据结构为两大类型:
“段”和经过压缩编码的图像数据。
二、数据结构 1.段的一般结构如下表所示:
表1:
段的一般结构
-----------------------------------------------------------------
名称字节数数据说明
-----------------------------------------------------------------
段标识1FF每个新段的开始标识
段类型1类型编码(称作“标记码”)
段长度2包括段内容和段长度本身,不包括段标识和段类型
段内容≤65533字节
-----------------------------------------------------------------
说明:
①JPG文件中所有关于宽度高度长度间隔这一类数据,凡是>1字节的,均采用Motorola格式,即:
高位在前,低位在后。
②有些段没有长度描述也没有内容,只有段标识和段类型。
文件头和文件尾均属于这种段。
③段与段之间无论有多少FF都是合法的,这些FF称为“填充字节”,必须被忽略掉。
2.段类型有30种,但只有10种是必须被所有程序识别的,其它的类型都可以忽略。
所以下面只列出这10种类型。
表2:
段类型
---------------------------------------
名称标记码说明
---------------------------------------
SOID8文件头
EOID9文件尾
SOF0C0帧开始(标准JPEG)
SOF1C1同上
DHTC4定义Huffman表(霍夫曼表)
SOSDA扫描行开始
DQTDB定义量化表
DRIDD定义重新开始间隔
APP0E0定义交换格式和图像识别信息
COMFE注释
-----------------------------------------------------------
说明:
有的文章也将DNL段(标记码=DC,定义扫描行数)列为必须段。
3.以下按一般JPEG文件的段排列顺序详细介绍各种段的结构:
表3:
SOI(文件头)
-----------------
名称字节数值
-----------------
段标识1FF
段类型1D8
-----------------
说明:
这两个字节构成了JPEG文件头。
表4:
APP0(图像识别信息)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1E0
段长度20010如果有RGB缩略图就=16+3n
(以下为段内容)
交换格式54A46494600“JFIF”的ASCII码
主版本号1
次版本号1
密度单位10=无单位;1=点数/英寸;2=点数/厘米
X像素密度2水平方向的密度
Y像素密度2垂直方向的密度
缩略图X像素1缩略图水平像素数目
缩略图Y像素1缩略图垂直像素数目
(如果“缩略图X像素”和“缩略图Y像素”的值均>0,那么才有下面的数据)
RGB缩略图3×nn=缩略图像素总数=缩略图X像素×缩略图Y像素
--------------------------------------------------------------------------
说明:
①JFIF是JPEGFileInterchangeFormat的缩写,即JPEG文件交换格式,另外还有TIFF等格式,很少用
②“如果有RGB缩略图就=16+3n”是什么意思呢?
比如说“缩略图X像素”和“缩略图Y像素”的值均为48,就表示有一个48×48像素的缩略图(n=48×48),缩略图是24位真彩位图,用3个字节来表示一个像素,所以共占用3n个字节。
但大多数JPG文件都没有这个“鸡肋”缩略图。
表5:
COM(注释)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1FE
段长度2其值=注释字符的字节数+2
段内容注释字符
--------------------------------------------------------------------------
说明:
有的JPEG文件没有这个段。
表6:
DQT(定义量化表)--------------------------------------------------------------------------名称字节数值说明--------------------------------------------------------------------------段标识1FF段类型1DB段长度243其值=3+n(当只有一个QT时) (以下为段内容)QT信息10-3位:
QT号4-7位:
QT精度(0=8bit,1字节;否则=16bit,2字节)QTnn=64×QT精度的字节数-------------------------------------------------------------------------- 说明:
①JPEG文件一般有2个DQT段,为Y值(亮度)定义1个,为C值(色度)定义1个。
②一个DQT段可以包含多个QT,每个都有自己的信息字节表7:
SOF0(图像基本信息)--------------------------------------------------------------------------名称字节数值说明--------------------------------------------------------------------------段标识1FF段类型1C0段长度2其值=8+组件数量×3 (以下为段内容)样本精度18每个样本位数(大多数软件不支持12和16)图片高度2图片宽度2组件数量131=灰度图,3=YCbCr/YIQ彩色图,4=CMYK彩色图 (以下每个组件占用3字节)组件ID11=Y,2=Cb,3=Cr,4=I,5=Q采样系数10-3位:
垂直采样系数4-7位:
水平采样系数量化表号1--------------------------------------------------------------------------- 说明:
①JPEG大都采用yCrCb色彩模型(y表示亮度,Cr红色分量,Cb表示蓝色分量),所以组件数量一般=3②样本就是单个像素的颜色分量,也可理解为一个样本就是一个组件③采样系数是实际采样方式与最高采样系数之比,而最高采样系数一般=0.5(分数表示为1/2)。
比如说,垂直采样系数=2,那么2×0.5=1,表示实际采样方式是每个点采一个样,也就是逐点采样;如果垂直采样系数=1,那么:
1×0.5=0.5(分数表示为1/2),表示每2个点采一个样表8:
DHT(定义Huffman表)--------------------------------------------------------------------------名称字节数值说明--------------------------------------------------------------------------段标识1FF段类型1C4段长度2其值=19+n(当只有一个HT表时) (以下为段内容)HT信息10-3位:
HT号4位:
HT类型,0=DC表,1=AC表 5-7位:
必须=0HT位表16这16个数的和应该≤256HT值表nn=表头16个数的和-------------------------------------------------------------------------- 说明:
①JPEG文件里有2类Haffman表:
一类用于DC(直流量),一类用于AC(交流量)。
一般有4个表:
亮度的DC和AC,色度的DC和AC。
最多可有6个。
②一个DHT段可以包含多个HT表,每个都有自己的信息字节③HT表是一个按递增次序代码长度排列的符号表。
表9:
DRI(定义重新开始间隔)--------------------------------------------------------------------------名称字节数值说明--------------------------------------------------------------------------段标识1FF段类型1DD段长度24 (以下为段内容)开始间隔2n 复位标记的间隔距离--------------------------------------------------------------------------- 说明:
①开始间隔表示在压缩数据流中,每隔n个MCU块就有一个RST标记,RST标记将Huffman的解码数据流复位,DC也重新从0开始,因此,RST标记是一种复位标记②RST标记是一种特殊的段,它只具有段标识和段类型(长度=2字节),但它不是独立的段,只能穿插在数据流中(文件头和文件尾段也只有段标识和段类型,却都是独立的段)。
③RST标记共有8个(RST0-RST7),从RST0起开始使用,然后是RST1....直至RST7,再从RST0重复。
④RST标记的标识码是FFD0-FFD7,对应RST0-RST7⑤笔者查看了许多自己电脑上的JPG文件的数据,未发现DRI段和RST标记,所以无法进行详尽的考察表10:
SOS(扫描行开始)--------------------------------------------------------------------------名称字节数值说明--------------------------------------------------------------------------段标识1FF段类型1DA段长度2000C其值=6+2×扫描行内组件数量 (以下为段内容)扫描行内组件数量13必须≥1,≤4(否则错误),通常=3 (以下每个组件占用2字节)组件ID11=Y,2=Cb,3=Cr,4=I,5=QHuffman表号10-3位:
AC表号(其值=0...3)4-7位:
DC表号(其值=0...3)3最后3个字节用途不明,忽略-------------------------------------------------------------------------- 说明:
紧接SOS段后的是压缩的图像数据(一个个扫描行),数据存放顺序是从左到右、从上到下。
表11:
EOI(文件尾)------------------名称字节数值------------------段标识1FF段类型1D9------------------ 说明:
这两个字节构成了JPEG文件尾。
三、实例分析 用系统自带的画图程序画一个32×24的红色方块,另存为JPG文件,这个文件的全部数据如下:
0000:
FFD8FFE000104A4649460001010100600010:
00600000FFDB004300080606070605080020:
0707070909080A0C140D0C0B0B0C19120030:
130F141D1A1F1E1D1A1C1C20242E27200040:
222C231C1C2837292C30313434341F270050:
393D38323C2E333432FFDB00430109090060:
090C0B0C180D0D1832211C21323232320070:
323232323232323232323232323232320080:
323232323232323232323232323232320090:
3232323232323232323232323232FFC000A0:
0011080018002003012200021101031100B0:
01FFC4001F000001050101010101010000C0:
0000000000000001020304050607080900D0:
0A0BFFC400B51000020103030204030500E0:
0504040000017D01020300041105122100F0:
31410613516107227114328191A108230100:
42B1C11552D1F02433627282090A16170110:
18191A25262728292A3435363738393A0120:
434445464748494A535455565758595A0130:
636465666768696A737475767778797A0140:
838485868788898A92939495969798990150:
9AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B70160:
B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D50170:
D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF10180:
F2F3F4F5F6F7F8F9FAFFC4001F0100030190:
0101010101010101010000000000000101A0:
02030405060708090A0BFFC400B5110001B0:
0201020404030407050404000102770001C0:
0102031104052131061241510761711301D0:
22328108144291A1B1C109233352F01501E0:
6272D10A162434E125F11718191A262701F0:
28292A35363738393A434445464748490200:
4A535455565758595A636465666768690210:
6A737475767778797A828384858687880220:
898A92939495969798999AA2A3A4A5A60230:
A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C40240:
C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE20250:
E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F90260:
FAFFDA000C03010002110311003F00E20270:
E8A28AF993F710A28A2800A28A2800A20280:
8A2803FFD9分析:
0000-0001:
FFD8(文件头)0002-0013:
APP0段,其中:
0002-0003:
FFE0(段标记) 0004-0005:
0010(段长度=16字节) 0006-000A:
4A46494600(“JFIF”的ASCII码) 000B-000C:
0101(主次版本号=1.01) 000D:
01(密度单位为点数/英寸) 000E-0011:
00600060(水平和垂直的密度均为每英寸96像素) 0012-0013:
0000(没有缩略图)0014-0058:
DQT段,其中:
0014-0015:
FFDB(段标记) 0016-0017:
0043(段长度=67字节) 0018:
00(QT号=0,QT精度=8bit) 0019-0058:
QT0059-009D:
DQT段,其中:
0059-005A:
FFDB(段标记) 005B-005C:
0043(段长度=67字节) 005D:
01(QT号=1,QT精度=8bit) 005E-009D:
QT009E-00B0:
SOF0段,其中:
009E-009F:
FFC0(段标记) 00A0-00A1:
0011(段长度=17字节) 00A2:
08(样本精度=8bit) 00A3-00A6:
00180020(图像高=24,图像宽=32) 00A7:
03(组件数量=3,YCbCr彩色图) 00A8:
01(ID号=1,这是亮度Y组件) 00A9:
22(化为二进制=00100010,表明垂直和水平采样系数均=2) 00AA:
00(使用QT号=0的量化表) 00AB:
02(ID号=2,这是色度Cb组件) 00AC:
11(化为二进制=00010001,表明垂直和水平采样系数均=1) 00AD:
01(使用QT号=1的量化表) 00AE:
03(ID号=3,这是色度Cr组件) 00AF:
11(化为二进制=00010001,表明垂直和水平采样系数均=1) 00B0:
01(使用QT号=1的量化表)00B1-00D1:
DHT段,其中:
00B1-00B2:
FFC4(段标记) 00B3-00B4:
001F(段长度=31字节) 00B5:
00(HT号=0,DC表) 00B6-00C5:
这16个数字之和=12,说明下面的HT值表的长度=12字节) 00C6-00D1:
HT值表00D2-0188:
DHT段,这是HT号=0的AC表,参照上面分析0189-01A9:
DHT段,这是HT号=1的DC表,参照上面分析01AA-0260:
DHT段,这是HT号=1的AC表,参照上面分析0261-026E:
SOS段,其中:
0261-0262:
FFDA(段标记) 0263-0264:
000C(段长度=12字节) 0265:
03(组件数量=3) 0266-0267:
0100(组件ID=1,Y组件,使用HT表号=0的AC表) 0268-0269:
0211(组件ID=2,Cb组件,使用HT表号=1的DC表) 026A-026B:
0311(组件ID=3,Cr组件,使用HT表号=1的DC表) 026C-026E:
003F00(几乎每个JPG文件中这3个字节的值都相同,但用途不明)026F-0282:
图像压缩数据0283-0284:
FFD9(文件尾)
四、计算jpg图片尺寸的代码:
PrivateSubCommand1_Click()OnErrorGoTo100DimfLenAsSingle,kAsLongDimH1AsByte,H2AsByte,W1AsByte,W2AsByteDimOpenNameAsStringDimwAsLong,hAsLongOpenName="J:
\一江秋水的文档\图片收藏\风筝西施.jpg"'这里是全路径jpg图片文件名fLen=FileLen(OpenName)'获取文件长度OpenOpenNameForBinaryAs#1Get#1,1,H1Get#1,,H2IfH1=255AndH2=216Then'jpg:
FFD8k=3DoGet#1,k,H1Get#1,,H2Get#1,,W1Get#1,,W2k=k+2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- jpeg 文件 数据结构 以及 位图 保存 jpg 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)