- 浏览: 361695 次
文章分类
最新评论
-
lord_is_layuping:
...
PYQT4 + Python2.6 + eric4-4.2.2a的安装全过程 -
597272095:
3Q
Oracle客户端PL/SQL 中文乱码解决 -
lpluck08:
如果不是在git本地版本目录中执行的话,会有问题。到本地版本目 ...
git 中文文件名 乱码 mac -
aiove:
-API
分享到: 阿撒旦发撒旦发速度飞洒发
iOS开发开源项目推荐 -
Wallian_hua:
感谢,楼主的详细分析,对我的启发很大。。我也正在研究这方面的技 ...
[ZT]简单OCR实现原理
微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。正序存放就是高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后。例如,十六进制数为A02B,正序存放就是A02B,逆序存放就是2BA0。摩托罗拉(Motorola)公司的微处理器使用正序存放,而英特尔(Intel)公司的微处理器使用逆序。JPEG文件中的字节是按照正序排列的。
JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到1998年12月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File Interchange Format,JFIF)版本号为1.02。这是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂,因此大多数应用程序都支持JFIF文件交换格式。
JPEG文件使用的颜色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。在这个彩色空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。从RGB转换成YCbCr空间时,使用下面的精确的转换关系:
Y = 256 * E'y
Cb = 256 * [E'Cb] + 128
Cr = 256 * [E'Cr] + 128
其中亮度电平E'y和色差电平E'Cb和E'Cb分别是CCIR 601定义的参数。由于E'y的范围是0~1,E'Cb和E'Cb的范围是-0.5~+0.5,因此Y, Cb和Cr的最大值必须要箝到255。于是RGB和YCbCr之间的转换关系需要按照下面的方法计算。
(1) 从RGB转换成YCbCr
YCbCr(256级)分量可直接从用8位表示的RGB分量计算得到:
Y = 0.299 R + 0.587 G + 0.114 B
Cb = - 0.1687R - 0.3313G + 0.5 B + 128
Cr = 0.5 R - 0.4187G - 0.0813 B + 128
需要注意的是不是所有图像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存储样本数据,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。
(2) 从YCbCr转换成RGB
RGB分量可直接从YCbCr(256级)分量计算得到:
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)
在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中的第一个图像样本是图像左上角的样本。
JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此 JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:
- SOI 0xD8 图像开始
- APP0 0xE0 JFIF应用数据块
- APPn 0xE1 - 0xEF 其他的应用数据块(n, 1~15)
- DQT 0xDB 量化表
- SOF0 0xC0 帧开始
- DHT 0xC4 霍夫曼(Huffman)表
- SOS 0xDA 扫描线开始
- EOI 0xD9 图像结束
为使读者对JPEG定义的标记一目了然,现将JPEG的标记码列于表6-05,并保留英文解释。
表6-05 JPEG定义的标记
Symbol (符号) |
Code Assignment (标记代码) |
Description (说明) |
Start Of Frame markers, non-hierarchical Huffman coding |
||
SOF0 |
0xFFC0 |
Baseline DCT |
SOF1 |
0xFFC1 |
Extended sequential DCT |
SOF2 |
0xFFC2 |
Progressive DCT |
SOF3 |
0xFFC3 |
Spatial (sequential) lossless |
Start Of Frame markers, hierarchical Huffman coding |
||
SOF5 |
0xFFC5 |
Differential sequential DCT |
SOF6 |
0xFFC6 |
Differential progressive DCT |
SOF7 |
0xFFC7 |
Differential spatial lossless |
Start Of Frame markers, non-hierarchical arithmetic coding |
||
JPG |
0xFFC8 |
Reserved for JPEG extensions |
SOF9 |
0xFFC9 |
Extended sequential DCT |
SOF10 |
0xFFCA |
Progressive DCT |
SOF11 |
0xFFCB |
Spatial (sequential) Lossless |
Start Of Frame markers, hierarchical arithmetic coding |
||
SOF13 |
0xFFCD |
Differential sequential DCT |
SOF14 |
0xFFCE |
Differential progressive DCT |
SOF15 |
0xFFCF |
Differential spatial Lossless |
Huffman table specification |
||
DHT |
0xFFC4 |
Define Huffman table(s) |
arithmetic coding conditioning specification |
||
DAC |
0xFFCC |
Define arithmetic conditioning table |
Restart interval termination |
||
RSTm |
0xFFD0~0xFFD7 |
Restart with modulo 8 counter m |
Other marker |
||
SOI |
0xFFD8 |
Start of image |
EOI |
0xFFD9 |
End of image |
SOS |
0xFFDA |
Start of scan |
DQT |
0xFFDB |
Define quantization table(s) |
DNL |
0xFFDC |
Define number of lines |
DRI |
0xFFDD |
Define restart interval |
DHP |
0xFFDE |
Define hierarchical progression |
EXP |
0xFFDF |
Expand reference image(s) |
APPn |
0xFFE0~0xFFEF |
Reserved for application use |
JPGn |
0xFFF0~0xFFFD |
Reserved for JPEG extension |
COM |
0xFFFE |
Comment |
Reserved markers |
||
TEM |
0xFF01 |
For temporary use in arithmetic coding |
RES |
0xFF02~0xFFBF |
Reserved |
JPEG文件由下面的8个部分组成:
(1) 图像开始SOI(Start of Image)标记
(2) APP0标记(Marker)
① APP0长度(length)
② 标识符(identifier)
③ 版本号(version)
④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)
⑤ X方向像素密度(X density)
⑥ Y方向像素密度(Y density)
⑦ 缩略图水平像素数目(thumbnail horizontal pixels)
⑧ 缩略图垂直像素数目(thumbnail vertical pixels)
⑨ 缩略图RGB位图(thumbnail RGB bitmap)
(3) APPn标记(Markers),其中n=1~15(任选)
① APPn长度(length)
② 由于详细信息(application specific information)
(4) 一个或者多个量化表DQT(difine quantization table)
① 量化表长度(quantization table length)
② 量化表数目(quantization table number)
③ 量化表(quantization table)
(5) 帧图像开始SOF0(Start of Frame)
① 帧开始长度(start of frame length)
② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)
③ 图像高度(image height)
④ 图像宽度(image width)
⑤ 颜色分量数(number of color components)
⑥ 对每个颜色分量(for each component)
-
- ID
- 垂直方向的样本因子(vertical sample factor)
- 水平方向的样本因子(horizontal sample factor)
- 量化表号(quantization table#)
(6) 一个或者多个霍夫曼表DHT(Difine Huffman Table)
① 霍夫曼表的长度(Huffman table length)
② 类型、AC或者DC(Type, AC or DC)
③ 索引(Index)
④ 位表(bits table)
⑤ 值表(value table)
(7) 扫描开始SOS(Start of Scan)
① 扫描开始长度(start of scan length)
② 颜色分量数(number of color components)
③ 每个颜色分量
-
- ID
- 交流系数表号(AC table #)
- 直流系数表号(DC table #)
④ 压缩图像数据(compressed image data)
(8) 图像结束EOI(End of Image)
表6-06表示了APP0域的详细结构。有兴趣的读者可通过UltraEdit或者PC TOOLS等工具软件打开一个JPG图像文件,对APP0的结构进行分析和验证。
表6-06 JFIF格式中APP0域的详细结构
偏移 |
长度 |
内容 |
块的名称 |
说明 |
0 |
2 byte |
0xFFD8 |
(Start of Image,SOI) |
图像开始 |
2 |
2 byte |
0xFFE0 |
APP0(JFIF application segment) |
JFIF应用数据块 |
4 |
2 bytes |
length of APP0 block |
APP0块的长度 |
|
6 |
5 bytes |
"JFIF"+"0" |
识别APP0标记 |
|
11 |
1 byte |
<Major version> |
主要版本号(如版本1.02中的1) |
|
12 |
1 byte |
<Minor version> |
次要版本号(如版本1.02中的02) |
|
13 |
1 byte |
<Units for the X |
X和Y的密度单位 units=0:无单位 units=1:点数/英寸 units=2:点数/厘米 |
|
14 |
2 bytes |
<Xdensity> |
水平方向像素密度 |
|
16 |
2 bytes |
<Ydensity> |
垂直方向像素密度 |
|
18 |
1 byte |
<Xthumbnail> |
缩略图水平像素数目 |
|
19 |
1 byte |
<Ythumbnail> |
缩略图垂直像素数目 |
|
3n |
< Thumbnail RGB bitmap> |
缩略RGB位图(n为缩略图的像素数) |
||
Optional JFIF extension APP0 marker segment(s) |
任选的JFIF扩展APP0标记段 |
|||
…… |
…… |
|||
2 byte |
0xFFD9 |
(EOI) end-of-file |
图像文件结束标记 |
发表评论
-
最强大脑第六期饶舜涵和倪梓强 他们的大脑是天生的么?
2014-02-15 01:39 2968刚看了 最强大脑第6期, 里面有两个人我比较关注 饶舜 ... -
宏碁 Acer AS4738ZG-P622G32Mncc 驱动
2011-06-13 22:37 1596主板 Intel 主板驱动 9.1.1.102 ... -
git 中文文件名 乱码 mac
2011-06-10 18:32 3639git 默认中文文件名是 xx% 是因为 对0x80以上的字 ... -
必看电影
2010-09-03 11:50 1662moxue32 提名的电影是《 ... -
jQuery.validate使用必备
2010-09-01 19:34 1269jQuery.validate使用必备 ... -
centos 雅黑
2010-04-07 15:39 1660#所有操作均在root权限下进行 1、到xp或者vi ... -
【转】西厢计划原理
2010-03-19 10:28 20969转 http://blog.youxu.info/2010 ... -
CENTOS install mysql
2010-01-21 14:53 2183当前的数据库种类比较多,有MS-SQL,Oracle,MYSQ ... -
不需要让青少年有判断力和批判力
2010-01-21 13:14 1515“不需要让青少年有判断力和批判力。只要给他们汽车、摩托车、美丽 ... -
putty中文乱码问题解决
2010-01-20 21:16 1428用putty从windows xp连接ubuntu serve ... -
vi backspace
2010-01-16 14:07 1056vi ~/.vimrc set backspace=i ... -
如何做SVN迁移
2009-07-31 10:43 1531如何做SVN 迁移 ... -
pdf 免费 转换网站
2009-04-26 13:46 12014在dig网站上看到一个在线转换pdf的网站,现在收集整理如下: ... -
ruby 遍历文件夹 所有文件
2009-04-03 17:00 7456def traverse_dir(file_path) i ... -
ruby watir 整理
2009-03-18 23:54 58425. 异常对象识别(Watir应用解决方案) Watir基于处 ... -
大姐~~~假钞不是这么做的
2009-01-06 22:20 1153大姐~~~假钞不是这么做的 楼主发帖 一妇女拿假钞去买早 ... -
JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用 developerWorks
2008-11-17 01:44 1721JPEG 原理详细实例分析及其在嵌入式 Linux 中 ... -
Bmp 标准
2008-11-13 16:44 2239工具软件:工具软件:H ... -
JPEG文件格式简单分析
2008-10-27 23:19 3160摘要: 这篇文章大体上介绍了 JPEG 文件的结构信息以及它 ...
相关推荐
16进制转JPG图片工具的工作原理就是将这些16进制数据解码回原始的二进制格式,然后根据JPEG的编码标准重新构建出图像。 JPEG(Joint Photographic Experts Group)是一种有损压缩的图像格式,广泛用于网络和存储。...
官方公布的JPEG标准是基于ITU-T T.81文档,这正是压缩包中的“itu-t81.pdf”文件,它详细阐述了JPEG的压缩算法和技术规范。 JPEG标准的核心在于离散余弦变换(DCT)和量化,这两部分构成了其有损压缩的基础。离散...
- 图像文件:JPEG、PNG等图像文件以二进制格式存储像素颜色信息,包括图像宽度、高度、颜色深度等元数据。 - 音频文件:MP3、WAV等音频文件以二进制编码表示声音波形,包含采样率、位深度等信息。 - 其他文件:...
这个过程完成后,将得到的二进制数据按照JPEG文件格式的规范进行解析和重组,包括图像宽度、高度、颜色空间等信息。最后,这些信息被组合成一个有效的JPEG文件,可以被图像查看器识别和显示。 相反,将JPEG图片转换...
5. 如果目标是创建.jpg文件,还需要遵循JPEG文件格式的规范,包括图像的头部信息和编码标准,以确保文件能够被图像处理软件识别和打开。 在"big_small"这个压缩包文件中,很可能包含了实现上述转换功能的源代码。...
1. **读取JPEG文件**:使用`JPEG.H`中的函数,读取JPEG文件的二进制数据,解析其文件头以获取宽度、高度、色彩空间等信息。 2. **解码JPEG数据**:JPEG数据是经过JPEG压缩算法压缩的,需要通过库函数(如`jpeg_...
总之,JPEG解码是图像处理领域的一个核心部分,而"JPEG解码VC源码"提供了一种在VC环境下高效解码JPEG图像的方法,这对于开发者来说是宝贵的资源,可以帮助他们理解JPEG标准,优化图像处理性能,或者在自己的项目中...
标题中的“jpeg编码解码源代码”指的是提供了JPEG标准实现的原始程序代码,可以对图像进行编码(压缩)和解码(解压)。这些源代码遵循一定的编程规范,并且能在不同的操作系统环境下运行,例如Windows(通过Visual ...
6. 数据编码:编码后的系数会被转换成二进制码流,可以使用算术编码或者游程编码。MATLAB可能需要自定义编码函数来完成这个步骤。 7. 解压缩:解压过程是压缩过程的逆操作,包括解码、逆熵编码、逆小波变换和后处理...
此外,它还定义了各种编码方式,如ASCII85、LZW、Flate和JPEG等,以支持不同类型的二进制数据压缩。该文档还包含对PDF的安全特性的描述,如加密和权限管理,确保文档的隐私和安全。 adobe_supplement_iso32000.pdf...
总的来说,学习和实现JPEG编码器不仅有助于理解图像压缩原理,还能提升C++编程技巧,特别是处理二进制流和优化算法的能力。这个项目对于计算机图形学、图像处理以及软件开发的初学者来说是一个有价值的实践。
解码过程同样可以在Visual C++中实现,通过解析JPEG文件的二进制流,按照JPEG文件格式的规范,恢复出原始的8x8系数,再经过上述逆操作,得到重构的图像。 总的来说,JPEG压缩技术在图像处理中扮演着重要角色,结合...
编写JPEG编码器或解码器的C++代码需要对JPEG标准有深入理解,并且需要熟悉位操作、矩阵运算以及编码算法。以下是一些关键C++编程概念: 1. **文件I/O**:处理JPEG文件时,你需要使用C++的`fstream`库来读取和写入二...
Delphi的标准库不直接提供JPEG编码,但可以通过第三方库如Indy(包含BMP to JPEG的示例)或Jpeg单元(部分Delphi版本自带)来实现。 6. **编码参数设置**: JPG是有损压缩,允许调整压缩级别以平衡图像质量和文件...
JPG是一种基于JPEG标准的有损压缩图像格式,通常包含图像的宽度、高度、颜色空间等元数据。在易语言中,我们可以使用“读文件”命令来打开JPG文件,并使用“二进制文件操作”系列命令来解析文件内容,获取这些元数据...
此外,“二进制转换”是编程中的基础概念,因为DICOM文件是以二进制格式存储的,理解二进制数据如何表示和转换是处理DICOM数据的关键步骤。 在压缩包内的“DICOM标准”文件,很可能是DICOM官方的标准文档或者相关的...
在C语言中实现JPEG编解码,需要理解二进制文件的读写,位操作,以及数据结构如队列和哈夫曼树。同时,需要编写处理DCT和量化运算的数学函数,以及解析JPEG文件头部信息的代码。 实际编程时,可以参考开源库如...
1. BMP文件读取:BMP文件的格式相对简单,我们可以使用标准C库中的文件操作函数来读取其二进制数据。关键在于理解BMP文件头结构,包括BITMAPFILEHEADER和BITMAPINFOHEADER,从中获取图像的宽度、高度、位深度等信息...
5. 图像解码:将解析后的二进制数据解码成像素数组,这个过程可能涉及不同的图像编码标准,如JPEG或PNG。 6. 显示图像:最后,将解码后的图像数据转换成易语言支持的图像对象,显示在界面上。 这个源码示例对于学习...
图片的字节集通常包含了图片的编码信息,如JPEG、PNG、BMP等格式的二进制表示。 提取图片尺寸的过程涉及到解析图片的文件头信息。不同的图片格式,其文件头结构也不同,但通常都包含图片的宽度和高度信息。例如,...