jpeg文件数据结构以及将位图保存为jpg的代码.docx

上传人:b****6 文档编号:8215226 上传时间:2023-01-29 格式:DOCX 页数:7 大小:22.63KB
下载 相关 举报
jpeg文件数据结构以及将位图保存为jpg的代码.docx_第1页
第1页 / 共7页
jpeg文件数据结构以及将位图保存为jpg的代码.docx_第2页
第2页 / 共7页
jpeg文件数据结构以及将位图保存为jpg的代码.docx_第3页
第3页 / 共7页
jpeg文件数据结构以及将位图保存为jpg的代码.docx_第4页
第4页 / 共7页
jpeg文件数据结构以及将位图保存为jpg的代码.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

jpeg文件数据结构以及将位图保存为jpg的代码.docx

《jpeg文件数据结构以及将位图保存为jpg的代码.docx》由会员分享,可在线阅读,更多相关《jpeg文件数据结构以及将位图保存为jpg的代码.docx(7页珍藏版)》请在冰豆网上搜索。

jpeg文件数据结构以及将位图保存为jpg的代码.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1