×

DirectX与VB.NET编程(十六)*图片结构与DirectDraw截图(上)

Kalet Kalet 发表于2009-03-20 12:00:14 浏览205 评论0

抢沙发发表评论

这一章是DirectDraw的终结篇章了,以前曾应某位观众写DirectDraw下的截图方法,所以借这个篇章,最后讲解下图片的构造和DirectDraw的截图方法,网上这个截图的方法多数用C++和COM+写的,很难翻译成.NET的语法,只好自己研究图片的构造,花了不少时间。本文可能是网上唯一一篇讲.NET+DirectDraw截图的方法吧。
(本文内容参考引用:MSDN、百度百科、南京邮电大学-吴登荣、CSDN-_wmain。由于篇幅问题,本文分为上下两篇,上篇内容为图片构造理论,下篇为截图的实际应用。)


===============华丽的分割线===============

DirectX与VB.NET编程(十六)*图片结构与DirectDraw截图(上)

学习内容:
·图片的类型
·位图的构造结构


===============华丽的分割线===============


图片的类型:
就好比声音文件有wav、mp3、wmv等格式一样,图片一样有多种格式,每种格式都有它们固定的构造格式,我们称其为图像格式(ImageFormat),下面就各种常见格式进行简短介绍(以下介绍和所有图片摘自MSDN):
BMP(位图)
BMP是Windows使用的一种标准格式,用于存储设备无关和应用程序无关的图像。一个给定BMP文件的每像素位数值(1、4、8、15、24、32 或 64)在文件头中指定。每像素24位的BMP文件是通用的。BMP文件通常不压缩,因此不太适合通过Internet传输。


GIF(可交换图像文件格式)
GIF是一种用于在 Web页中显示图像的通用格式。GIF文件适用于画线、有纯色块的图片和在颜色之间有清晰边界的图片。GIF文件是压缩的,但是在压缩过程中没有信息丢失;解压缩的图像与原始图像完全一样。GIF文件中的一种颜色可以被指定为透明,这样,图像将具有显示它的任何Web页的背景色。在单个文件中存储一系列GIF图像可以形成一个动画GIF。GIF文件每像素最多能存储 8 位,所以它们只限于使用 256 种颜色。


JPEG(联合摄影专家组)
JPEG是一种适应于自然景观(如扫描的照片)的压缩方案。一些信息会在压缩过程中丢失,但是这些丢失人眼是察觉不到的。JPEG文件每像素存储24位,因此它们能够显示超过16,000,000种颜色。JPEG文件不支持透明或动画。
JPEG 图像中的压缩级别是可以控制的,但是较高的压缩级别(较小的文件)会导致丢失更多的信息。对于一幅以20:1压缩比生成的图像,人眼难以把它和原始图像区别开来。下面的插图显示了一幅BMP图像和用这幅BMP 图像压缩而得的两幅JPEG图像。第一幅JPEG的压缩比是4:1,第二幅JPEG的压缩比是8:1。



JPEG压缩不适用于线条图形、纯色块和清晰边界。下面的插图显示了一幅BMP图像,以及两幅JPEG图像和一幅GIF图像。JPEG和GIF图像从BMP图像压缩而得。GIF的压缩比是4:1,较小JPEG的压缩比是4:1,较大JPEG的压缩比是8:3。请注意,GIF图像沿线条保持着清晰的边界,但JPEG图像的边界处则有些模糊。



JPEG是一种压缩方案,不是一种文件格式。“JPEG文件交换格式 (JFIF)”是一种文件格式,常用于存储和传输已根据JPEG方案压缩的图像。Web浏览器显示的JFIF文件使用.jpg扩展名。


EXIF(可交换图像文件)
EXIF是一种适用于数码相机拍摄的照片的文件格式。EXIF 文件中含有根据JPEG规格压缩的图像。EXIF文件中还包含了有关照片的信息(拍摄日期、快门速度、曝光时间,等等)和相机信息(制造商、型号,等等)。


PNG(可移植网络图形)
PNG格式不但保留了许多GIF格式的优点,还提供了超出GIF的功能。像GIF文件一样,PNG文件在压缩时也不损失信息。PNG文件能以每像素8、24 或48位来存储颜色,并以每像素1、2、4、8或16位来存储灰度。相比之下,GIF文件只能使用每像素1、2、4或8位。PNG文件还可为每个像素存储一个alpha值,该值指定了该像素颜色与背景颜色混合的程度。
PNG优于GIF之处在于它能够逐渐显示一幅图像,也就是说,当图像通过网络连接到达时显示将越来越近似。PNG文件可包含伽玛校正和颜色校正信息,以便图像可在各种各样的显示设备上精确地呈现。


TIFF(标签图像文件格式)
TIFF是一种灵活的和可扩展的格式,各种各样的平台和图像处理应用程序都支持这种格式。TIFF文件能以每像素任意位来存储图像,并可以使用各种各样的压缩算法。单个的多页TIFF文件可以存储数幅图像。可以把与图像相关的信息(扫描仪制造商、主机、压缩类型、打印方向和每像素采样,等等)存储在文件中并使用标签来排列这些信息。可以根据需要通过批准和添加新标签来扩展TIFF格式。


===============华丽的分割线===============


位图的构造结构:
所谓位图(Bitmap),就是由图片的每个像素点的所构成的集合,是位的数组,也可以理解是一串代表颜色的数字以矩形的方式排列成的矩阵,每个数字代表一个颜色,即构成了位图。
位图从结构上分为两大类:调色板索引位图非调色板索引位图
所谓调色板索引位图,就是在位图的文件头部分声明了数个枚举,我们可以称这些枚举为调色板调色板索引,用以表示位图中出现的颜色,调色板索引位图普遍应用于1、4、8位色的位图,因为这些图片中应用到的图片数量比较少,使用调色板索引将更加节省空间。下图则是一个调色板位图的模型,右边是调色板,而左边则是使用该调色板所构成的调色板索引位图,相信应该很容易理解。



另外一种则是非调色板索引位图,这种位图中所有的颜色数值均是以实际的颜色值进行表示,非调色板索引位图直接应用于16位色或者24位色的位图。下图是一个非调色板索引位图,左边是构成位图的颜色数值矩阵,右边是图片显示时的效果,可以看到所使用的数值都是颜色实际本身的数值。




下面详细讲解位图文件的文件构造:
一个位图文件通常分为三个部分:文件信息头位图信息头位图数据


===============华丽的分割线===============


文件信息头:
该部分保存的是面向文件方面的识别,如文件类型、大小等。文件信息头的结构体声明如下:
Structure FILEHEADER
    '文件类型,位图文件始终为BM
    Public vType() As Char
    '文件尺寸
    Public vSize As UInt32
    '保留字,始终为0
    Public vReserved As UInt32
    '文件头的内容偏移量
    Public vOffset As UInt32
End Structure


===============华丽的分割线===============


位图信息头:
位图信息头包含位图信息调色板索引两个部分。
位图信息:
位图信息包含图片的尺寸、色深等内容,调色板位图则是针对调色板索引位图所储存的调色板信息。位图信息头的结构体声明如下,需要注意的是其中COLORBOARD是调色板结构体:
Structure BITMAPHEADERDirectX与VB.NET编程(十六)*图片结构与DirectDraw截图(上)
    '位图信息头长度
    Public vHeaderSize As UInt32
    '位图宽度
    Public vWidth As UInt32
    '位图高度
    Public vHeight As UInt32
    '设备级别,始终为1
    Public vPlanes As UInt16
    '位图色深
    Public vDepth As UInt16
    '位图压缩类型,必须是0(不压缩)、1(BI_RLE8 压缩类型)或2(BI_RLE4压缩类型)之一
    Public vCompression As UInt32
    '图片数据大小,值为位图宽度*位图高度*色深
    Public vSize As UInt32
    '水平分辨率
    Public vHRes As UInt32
    '垂直分辨率
    Public vVRes As UInt32
    '调色板索引数,为0则代表位图为非调色板索引位图
    Public vClrCount As UInt32
    '重要颜色索引数,0为都重要
    Public vClrImportant As UInt32
    '调色板
    Public vClrBoard() As COLORBOARD
End Structure


调色板索引:
Structure COLORBOARD
    '红色掩码
    Public vClrRed As UInt32
    '绿色掩码
    Public vClrGreen As UInt32
    '蓝色掩码
    Public vClrBlue As UInt32
    '保留值,总是为0
    Public vClrReserved As UInt32
End Structure


===============华丽的分割线===============


位图数据:
位图数据包含图片的实际内容,需要注意的是每种色深都有其不同的格式,像1、4、8这种使用调色板索引的位图,一个字节可以储存一个甚至多个像素的内容,但如果是16、24色这种非调色板索引位图,那么需要三个字节方能储存一个像素,占用的字节数可以用公式字节数占用=色深/8来取得,因此需要依情况而定。
调色板索引位图结构体:
Private Structure BITMAPCOLOR_BOARD
    '颜色值
    Public vColor As Byte
End Structure


非调色板索引位图结构体:
Private Structure BITMAPCOLOR_NOBOARD
    '红色
    Public vClrRed As Byte
    '绿色
    Public vClrGreen As Byte
    '蓝色
    Public vClrBlue As Byte
End Structure


最后需要提醒一点的是位图数据的储存顺序是从左到右,从上到下。

DirectX与VB.NET编程(十六)*图片结构与DirectDraw截图(上)

===============华丽的分割线===============


限于篇幅原因,DirectDraw下截图的实际应用将在下一篇中进行讲解,博客更新速度较慢还望见谅。


群贤毕至

访客