Dark@nger
来源: BlogBus 原始链接: http://darkanger.blogbus.com:80/s1128699/ 存档链接: https://web.archive.org/web/20061030102613id_/http://darkanger.blogbus.com:80/s1128699/
BMP、GIF和JPEG文件格式简介及相互转换 2006-10-29 BMP、GIF和JPEG文件格式简介及相互转换 图象文件就是描绘了一幅图象的计算机磁盘文件。形成数字图象数据后,将其存储在计算机里的方法有2种,即位映射和向量处理方式。 我们这里主要讨论的是位图。不同图象软件几乎都用各种的方法处理图象,图象格式也多种多样,它主要包括文件识别头和图象数据。文件识别头用来让计算机判断是哪种文件格式,图象数据包含了整个对图象描绘相关数据,包括调色板、位图映象等。根据压缩算法不同,映象方式也不同,下面简要介绍一下压缩算法。 一、 行程长度压缩 原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。对于拥有大面积,相同颜色区域的图像,用RLE压缩方法非常有效。由RLE原理派生出许多具体行程压缩方法: 1.PCX行程压缩方法: 该算法实际上是位映射格式到压缩格式的转换算法,该算法对于连续出现1次的字节Ch,若Ch>0xc0则压缩时在该字节前加上0xc1,否则直接输出Ch,对于连续出现N 次的字节Ch,则压缩成0xc0+N,Ch这两个字节,因而N最大只能为ff-c0=3fh(十进制为63),当N大于63时, 则需分多次压缩。 2.BI_RLE8压缩方法:在WINDOWS的位图文件中采用了这种压缩方法。该压缩方法编码也是以两个字节为基本单位。其中第一个字节规定了用第二个字节指定的颜色重复次数。 如编码 0504表示从当前位置开始连续显示5个颜色值为04的像素。当第二个字节为零时第二个字节有特殊含义:0表示行末;1表示图末;2转义后面2个字节, 这两个字节分别表示下一像素相对于当前位置的水平位移和垂直位移。这种压缩方法所能压缩的图像像素位数最大为8位(256色)图像。 3.BI_RLE压缩方法: 该方法也用于WINDOWS位图文件中,它与 BI_RLE8编码类似,唯一不同是:BI_RLE4的一个字节包含了两个像素的颜色,因此,它只能压缩的颜色数不超过16的图像。因而这种压缩应用范围有限。 4.紧缩位压缩方法(Packbits):该方法是用于Apple公司的Macintosh机上的位图数据压缩 方法, TIFF 规范中使用了这种方法, 这种压缩方法与BI_RLE8压缩方法相似,如1c1c1c2132325648 压缩为:83 1c 21 81 32 56 48,显而易见, 这种压缩方法最好情况是每连续128个字节相同,这128个字节可压缩为一个数值7f。这种方法还是非常有效的。 二、霍夫曼编码压缩: 也是一种常用的压缩方法。是1952年为文本文件建立的,其基本原理是频繁使用的数据用较短的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。如: 有一个原始数据序列,ABACCDAA则编码为A(0),B(10),C(110),(D111),压缩后为010011011011100。产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计出原始数据中的每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。 三、LZW压缩方法 LZW压缩技术比其它大多数压缩技术都复杂, 压缩效率也较高。其基本原理是把每一个第一次出现的字符串用一个数值来编码,在还原程序中再将这个数值还成原来的字符 串,如用数值0x100代替字符串"abccddeee"这样每当出现该字符串时,都用0x100代替,起到了压缩的作用。 至于0x100与字符串的对应关系则是在压缩过程中动态生成的,而且这种对应关系是隐含在压缩数据中,随着解压缩的进行这张编码表会从压缩数据中逐步得到恢复,后面的压缩数据再根据前面数据产生的对应关系产生更多的对应关系。直到压缩文件结束为止。LZW是可逆的, 所有信息全部保留。 四、算术压缩方法 算术压缩与霍夫曼编码压缩方法类似,只不过它比霍夫曼编码更加有效。算术压缩适合于由相同的重复序列组成的文件,算术压缩接近压缩的理论极限。这种方法,是将不同的序列映像到0到1之间的区域内,该区域表示成可变精度(位数 screen.width/2)this.width=screen.width/2" vspace=2 border=0>的二进制小数,越不常见的数据要的精度越高(更多的位数),这种方法比较复杂,因而不太常用。 五、 JPEG( 联合摄影专家组 Joint Photographic Exprerts Group) JPEG标准与其它的标准不同,它定义了不兼容的编码方法,在它最常用的模式中,它是带失真的,一个从JPEG文件恢复出来的图像与原始图像总是不同的,但有损压缩重建后的图像常常比原始图像的效果更好。JPEG的另一个显著的特点是它的压缩比例相当高,原图像大小与压缩后的图像大小相比,比例可以从1%到80~90%不等。 这种方法效 果也好,适合多媒体系统。 介绍完了压缩算法,我们来简要介绍一下三种位图格式的异同和它们之间的相互转换。
- bmp图象 · 位图文件头(BITMAPHEADER)数据结构 · 位图信息(BITMAPINFO)数据结构 · 位图阵列 1)位图文件头数据结构包含BMP图象文件的类型、显示内容等信息。 Typedef struct{ Int bfType; //must be "BM" Long bfSize; //位图大小 Int bfReserved1;//must be "0" Int bfReserved2;//must be "0" Long bfOffBits;//位图阵列的起始位置 }BITMAPEFILEHEADER; 2)位图信息数据结构由BITMAPINFOHEADER和RGBQUAD两个数据结构组成, typedef struct{ BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[]; }BITMAPINFO 其中BITMAPINFOHEADER数据结构包含了有关BMP图象的宽、高、压缩方法等信息。 数据结构RGBQUAD定义一种颜色。 3)位图阵列 位图阵列记录了图象的每一个象素值。从图象的左下角开始逐行扫描图象。从左到右,从上到下,将图象的象素值逐一记录下来,这些记录象素值的字节组成了位图阵列。 位图阵列数据的存储格式有压缩和非压缩两种格式。 1. 非压缩格式 位图中的每一个点的象素值对应与位图阵列的若干位,而位图阵列的若干位由图象的高度、宽度及图象的颜色数决定。 2. 压缩格式 在bmp格式文件中,Windows支持BI-RLE8和BI-RLE4两种压缩类型的存储格式。 2、GIF图象文件格式 GIF的全称是Graphics Interchange Format,.译做图形交换格式。GIF是一种公用的图象文件格式标准,但它归compuServe公司版权所有。 在一个GIF文件中首先碰到的是GIF的标志,这个标志告诉解码程序这是个GIF文件。这个标志是3字节的串:GIF。一个GIF文件中可以存放多幅图象,但绝大多数的文件都只包含一幅图象。 然后是屏幕描述字(screen descriptor),说明了用来生成的显示文件中的图象的显示器分辨率,分别表示屏幕的宽和高。 紧跟下来的一个字节是全局标志,其低三位说明了即将碰到的图象是多少颜色的。最高位表示是否存在一个全局色彩表。 背景色表示把背景置成适当的颜色,实际上是一个指向全局色彩表的数。 Struct Global_Data{ Unsigned short screen_width; Unsigned short screen_height; Unsigned char background; har tail=' '; } 接下来是全局色彩表,按顺序存放所有的严肃,每一种严肃由色彩表的一项来描述,每项是3字节,分别表示红、绿、蓝三种原色的强度。其长度有全局标志的低三位表示。 以后的数据都是局部的了。是些数据块的集合。下面是图象数据块的结构。 Struct Local_Head{ Char heading=','; Unsigned short image_left;//图象的屏幕上显示的起始位置 Unsigned short image_top; Unsigned short image_width; Unsigned short image-height; Unsigned char local_flag;//局部标志 } 局部标志和 全局标志的不同之处在于次高位,如果这位被置成1则表示图像的位图数据是以隔行方式存放的。也就是说,在解开的位图数据中,第一行存放的是屏幕上第一行,第二行对应屏幕上的第9行,第三行对应屏幕上的第17行,以此递增--这是第一遍扫描;第二遍扫描是从屏幕上的第5行开始,两行之间也是以8递增;第三遍扫描是从屏幕上的第3行开始,两行之间以4递增;第四遍扫描,也是最后一遍,从第2行开始,两行之间以2递增。 隔行存放的GIF图像在边解码边显示的时候可分成四遍扫描。第一遍扫描虽然只显示了整个图像的八分之一,第二遍的扫描后也只显示了四分之一,但这已经把整个图像的概貌显示出来了。在显示GIF图像的时,隔行存放的图像会给你这样一个印象:向它的显示速度似乎要比其他图像快一些,这是隔行存放的优点。 在GIF图像的编解码中用到了LZW压缩算法--把这些字符流转换成另一种形式的代码流,解码过程则是把这种代码流还原成原来的字符流。 3、JPEG图象文件格式 JPEG是Joint Photographic Experts Group(联合摄影专家小组)的首字母缩写。JPEG的主要作用是用于数字化图象的标准编码技术。JPEG图象文件是一种象素格式文件格式,但它比诸如象GIF、BMP等图象文件要复杂的多。所幸,我们在使用由JPEG组成的JPEG库时,只要对该文件格式有个一般的了解就可以了。而没有必要对JPEG文件格式做一个全面细致的了解。 JPEG格式是种有损的编码格式,但如果GIF文件比,他经过解码后的重构图象要比GIF图象更接近于原始的图象。 JPEG编码技术是由颜色转换、DCT变换、进行量化、编码。其压缩格式由著名的JPEG集团所著的4.0版本的库所定。 关于这3种图象格式的互相转换,主要是用c语言或c++和汇编语言,因为这些语言可以 直接进行底层的操作,把图象解压缩后按用另一种格式要求进行压缩即可。 10:30 添加评论 固定链接 引用通告 (0) 记录它 高手进阶 固定链接 http://pcshow.spaces.live.com/blog/cns!A58BFD72347E9EA5!184.entry 添加评论 2005年6月 Word另类应用小技巧 一、利用Word解锁注册表 目前网上有许多网页含有恶意代码,而几乎每一个恶意网页都要禁用我们的注册表编辑器。其实质就是修改注册表,将注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVerssion\Policies\System分支下的DWORD值“Disableregistrytools”的键值改为“1”,这样,我们一运行注册表编辑器就会出现“注册编辑已被管理员所禁止”的对话框(图1)。面对这样的恶意锁定,如果我说用Word来给注册表解锁是不是很出乎大家的意料啊? 请大家点击桌面上的Word图标,运行Word,然后录制一个名为“Unlock”宏,运行该宏即可给注册表解锁,以下是该宏的源代码: Sub Unlock() Dim RegPath As String RegPath = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System" System.PrivateProfileString(FileName:="",Section:=RegPath,Key:="Disableregistrytools")="OK!" End Sub 您是不是觉得本方法很奇妙?其实说穿了也很简单,主要是利用了注册表的一个特性,即在同一注册表项下,不能有相同名字的字符串值和DWORD值,如果先前有一个DWORD值存在,则后建立的同名的字符串值会将其覆盖,这也就间接的删除了原值,在本例中就是DWORD值Disableregistrytools被同名的字符串值所覆盖删除。 在本方法利用了VBA中的System对象,System是有关计算机系统信息的一个特殊对象,该对象的PrivateProfileString属性可在Windows注册表中添加字符串值,其使用格式为:“System.PrivateProfileString(FileName, Section, Key)=Keyword”。该属性除了可操作注册表外,还可对Windows的ini配置文件进行操作。在对注册表操作时,这里的FileName必须是空字符串(""),Section是欲操作注册表项的完整路径,Key是欲操作注册表项的键值名,Keyword是对应于Key的键值。 另外,之所以给新建立的“Disableregistrytools”字符串值赋值为“OK!”,是因为在解锁后该字符串值并没有什么用处,所以临时赋值为“OK!”,当然你不赋值也可以。 二、选择纵向Word文本 在Word中,拖动鼠标或使用方向键所选中的内容总是横向的连续的文本块,如果想选纵向的文本该怎么办呢?很简单,看我的!只要先将插入点置于要选择的文本的一角,然后按下Ctrl+Shift+F8组合键,接下来按方向键“↑”、“↓”、“←”、“→”来选择要选定的内容范围即可。当然了,你也可以不用键盘,而是通过鼠标单击或拖动鼠标进行选择。此时,Word被选中的文本是按列来显示。按Esc键或者在被选中的文本上单击鼠标左键,则取消选择。现在你也会按列纵向选择文本了吧? 三、在带毒环境下使用Word 大家指导,Word宏病毒的种类非常多,出现的速度也较快,有时即使有最新版的杀毒软件,对新出来的宏病毒也会令人束手无策。如果此时我们恰恰又不得不在带毒环境下继续工作,该怎么办呢?以下是笔者总结出来的方法,可以让你放心的在带毒皇家下使用Word,避开宏病毒的攻击! 首先,删除桌面和“开始→程序”中的Word快捷方式“Microsoft Word”。然后打开“我的电脑”,找到Word的安装目录,这里假设你的Word安装在E:\Program Files\Microsoft Office\Office下。进入该文件夹,找到Winword.exe文件,对着它点击鼠标右键,在弹出的快捷菜单中选择“发送到→桌面快捷方式”,这样就在桌面上建立了一个Winword.exe文件的快捷方式。如果你够仔细的话,你会发现你建立的这个快捷方式名字为“Winword.exe”,而桌面和“开始→程序”中的Word快捷方式名字为“Microsoft Word”,两者不仅名字不相同,而且“内涵”也不尽相同,在文章的最后我们会介绍两者的不同。 继续我们的工作,用鼠标右键单击该快捷方式,选择“属性”,会弹出“Winword 属性”对话框,选择其中的“快捷方式”标签,然后在“目标”框里填入:"E:\Program Files\Microsoft Office\Office\WINWORD.EXE" /a/n/m,给Winword.exe加上参数“/a”、“/m”和“/n”,输入时请大家注意在参数“/a”前面有一个空格,不要忘了,输入完毕如下图所示(图2)。点击“确定”退出即可。 下面,再来解释一下上述参数的含义。“/n”指定Word启动时忽略初始化文件,不加载包括Normal模板在内的所有模板;“/m”指定Word启动时不必运行任何宏,包括AutoExec宏,若不使用此开关,启动时按住Shift键也可以防止运行Autoexec宏;“/n”指定Word启动时不打开任何文档。由于宏病毒藏身于doc文档、dot模板和宏中,只要启动Word时不打开文档,不加载模板,不运行宏,病毒就无法进入内存。采用此方式启动后可直接开始一个新文档。 若要打开已感染的Word文档,可这样操作:首先单击“工具”菜单下的“选项”命令,选中“常规”选项中的“宏病毒防护”。然后打开已感染的文档,此时Word会发出警告,并给出三种选择,即打开文档并运行宏、打开文档但不运行宏、不打开文档。选择打开文档但不运行宏,由于不运行宏,所以系统不会受到攻击。将打开的文档另存为文本文件,删除原文件,再存回Word格式即可。需要说明的是,由于该方法启动时没有加载任何模板,用户原来对系统的所作的自定义均无效,在操作过程中切记不能使用模板。 现在,我们再来谈谈为什么要删除桌面和“开始→程序”中Word快捷方式,以及自己建立的Word快捷方式和安装Word时软件自己建立的Wrod快捷方式有何不同。对于Word在安装时自己建立的快捷方式,我们无法为它加上上述参数。如果不信可以试试,用鼠标右键点击桌面上原来Word自建的快捷方式,选“属性”,会发现“目标”栏、“起始位置”栏、“快捷键”栏和“运行方式”栏都是灰色不可选取状(图3)。这就是它们之间最大的不同!也是本文的关键所在。 四、在Word中调用外部程序 我们在编辑Word文档的时候,在某些特殊情况下,可能要提示阅读者调用其它程序,如果要从开始菜单中众多“程序”中选择所需的程序非常麻烦,那么能不能在Word中直接调用外部程序呢?下面就以在Word中调用 计算器程序为例,看一下具体的操作方法。 单击“工具”菜单中的“宏”命令,在出现的“宏”对话框中输入宏名“计算器”(图4),在“宏的位置”框中选择“所有活动模板和文档”选项,以便在任何时候都可以使用这个宏。然后单击“创建”按钮进入宏编辑状态(图5),输入以下代码:Shell"c:\WINDOWS\CALC,EXE",最后单击“文件”菜单中的“保存”命令(图6),退出宏编辑状态,回到Word中。单击“工具”菜单中的“自定义”命令,会弹出如图所示窗口(图7),选择“命令”标签中“宏”类别,找到我们刚才编辑的“计算器”宏(图8),把它拖到工具栏上,以后我们要调用计算器的时候,只需单击该项按钮即可。 Tag: 媒体转换 jkjj @ 15:45:49 | 阅读全文 | 评论 0 | 引用 0 | 编辑 分页: