位图文件
常用图片文件格式

常用图片文件格式1、bmp格式——位图文件——几乎不压缩——占用磁盘空间过大Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。
随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。
这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点——占用磁盘空间过大。
2、jpg格式——国际标准图像压缩格式——有损压缩JPEG是国际标准图像压缩格式,是用于连续色调静态图像压缩的一种标准,文件后缀名为,jpg或,jpeg,是最常用的图像文件格式。
属于有损压缩格式,它能够将图像压缩在很小的储存空间,一定程度上会造成图像数据的损伤。
尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量降低,如果追求高品质图像,则不宜采用过高的压缩比例。
JPEG压缩技术十分先进,它可以用有损压缩方式去除冗余的图像数据,换句话说,就是可以用较少的磁盘空间得到较好的图像品质。
而且JPEG是一种很灵活的格式,具有调节图像质量的功能,它允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比越大,图像品质就越低;相反地,压缩比越小,图像品质就越高。
同一幅图像,用JPEG格式存储的文件是其他类型文件的1/10~1/20,通常只有几十KB,质量损失较小,基本无法看出。
JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网;它可减少图像的传输时间,支持24位真彩色;也普遍应用于需要连续色调的图像中。
3、png格式——无损压缩的位图格式——支持透明效果png是一种采用无损压缩算法的位图格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。
PNG使用无损数据压缩算法,一般应用于JAVA程序、网页中,原因是它压缩比高,生成文件体积小。
PNG可以为原图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。
位图文件(BMP)

位图⽂件(BMP)位图⽂件简介BMP(Bitmap-File)格式是最常⽤的图像⽂件存取格式之⼀,是微软为其Windows环境设置的标准图像格式,BMP位图⽂件默认的⽂件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。
⽤BMP格式存放的图像⼏乎可以被所有的图像显⽰软件读取。
BMP图形⽂件是Windows采⽤的图像⽂件格式,在Windows环境下运⾏的所有图像软件都⽀持BMP图像⽂件格式。
Windows系统内部个图像绘制操作都是以BMP为基础的。
Windows3.0以前的BMP⽂件格式与显⽰设备有关,因此把这种BMP图像⽂件格式称为设备相关位图(Device Dependent Bitmap,DDB)⽂件格式。
Windows3.0以后的BMP⽂件都与显⽰设备⽆关,因此把这种BMP⽂件格式称为设备⽆关位图(Device Independent Bitmap,DIB)格式。
BMP⽂件格式摘要每个BMP⽂件只能存放⼀张图像。
图像数据是否采⽤压缩⽅式存放,取决于⽂件的⼤⼩与格式,即压缩处理是BMP图像⽂件的⼀个选项,⽤户可以根据需要进⾏选择。
其中,⾮压缩格式是BMP图像⽂件所采⽤的⼀种通⽤格式,它按照⼀定的顺序忠实的记录图像中每⼀个像素的颜⾊值。
如果⽤户确定将BMP⽂件格式压缩处理,则Windows设计了⼀种压缩⽅式:如果位图为16⾊模式,则采⽤RLE4压缩⽅式,如果图像为256⾊模式,则采⽤RLE8压缩⽅式。
BMP图像数据⽂件格式可以存储为单⾊,16⾊,256⾊和真彩⾊四种图像数据,其数据的排列顺序与⼀般⽂件不同,它以图像的左下⾓作为起点存储图像,⽽不是以图像的坐上⾓为起点。
⽽且BMP图像⽂件格式中还存在另外⼀个与众不同的特点,即其调⾊板数据所采⽤的数据结构中,红,绿,蓝三种基⾊数据的排列顺序也恰好与其他图像⽂件格式相反。
总之,BMP图像⽂件格式拥有许多适合于Windows环境的新特⾊,⽽且随着Windows版本的不断更新,微软也在不断的改进BMP图像⽂件格式。
常见的图片格式有哪几种,各有哪些优点?

常见的图片格式有哪几种,各有哪些优点?常见的图片格式有哪几种?分别有什么区别?一、图片格式:光栅图片1、BMP:Windows 位图Windows 位图可以用任何颜色深度(从黑白到24 位颜色)存储单个光栅图像。
Windows 位图文件格式与其他Microsoft Windows 程序兼容。
它不支持文件压缩,也不适用于Web 页。
从总体上看,Windows 位图文件格式的缺点超过了它的优点。
为了保证照片图像的质量,请使用PNG 文件、JPEG 文件或TIFF 文件。
BMP 文件适用于Windows 中的墙纸。
优点:*. BMP 支持 1 位到24 位颜色深度。
*. BMP 格式与现有Windows 程序(尤其是较旧的程序)广泛兼容。
缺点:*.BMP 不支持压缩,这会造成文件非常大。
*. BMP 文件不受Web 浏览器支持。
2、PCX:PC 画笔“PC 画笔”图片(也被称为Z-Soft 位图)会以任何颜色深度存储单个光栅图像。
画笔图片更广泛地用于较早的Windows 程序和基于MS-DOS 的程序。
画笔图片与许多较新的程序兼容。
PCX 图片支持“行程长度编码”(RLE) 内部压缩。
优点:*. PCX 在许多基于Windows 的程序和基于MS-DOS 的程序间是标准格式。
*. PCX 支持内部压缩。
缺点:*. PCX 不受Web 浏览器支持。
3、PNG:可移植网络图形PNG 图片以任何颜色深度存储单个光栅图像。
PNG 是与平台无关的格式。
优点:*. PNG 支持高级别无损耗压缩。
*. PNG 支持alpha 通道透明度。
*. PNG 支持伽玛校正。
*. PNG 支持交错。
*. PNG 受最新的Web 浏览器支持。
缺点:较旧的浏览器和程序可能不支持PNG 文件。
*.PNG 作为Internet 文件格式,与JPEG 的有损耗压缩相比,PNG 提供的压缩量较少。
作为Internet 文件格式,PNG 对多图像文件或动画文件不提供任何支持。
JPG、GIF、BMP和PNG

JPG、GIF、BMP和PNG格式分别是什么意思?BMP格式BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。
随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。
这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。
所以,目前BMP在单机上比较流行。
GIF格式GIF是英文Graphics Interchange Format(图形交换格式)的缩写。
顾名思义,这种格式是用来交换图片的。
事实上也是如此,上世纪80年代,美国一家著名的在线信息服务机构CompuServe针对当时网络传输带宽的限制,开发出了这种GIF图像格式。
GIF格式的特点是压缩比高,磁盘空间占用较少,所以这种图像格式迅速得到了广泛的应用。
最初的GIF只是简单地用来存储单幅静止图像(称为GIF87a),后来随着技术发展,可以同时存储若干幅静止图象进而形成连续的动画,使之成为当时支持2D动画为数不多的格式之一(称为GIF89a),而在GIF89a图像中可指定透明区域,使图像具有非同一般的显示效果,这更使GIF风光十足。
目前Internet上大量采用的彩色动画文件多为这种格式的文件,也称为GIF89a格式文件。
此外,考虑到网络传输中的实际情况,GIF图像格式还增加了渐显方式,也就是说,在图像传输过程中,用户可以先看到图像的大致轮廓,然后随着传输过程的继续而逐步看清图像中的细节部分,从而适应了用户的"从朦胧到清楚"的观赏心理。
目前Internet上大量采用的彩色动画文件多为这种格式的文件。
GIF格式只能保存最大8位色深的数码图像,所以它最多只能用256色来表现物体,对于色彩复杂的物体它就力不从心了。
尽管如此,这种格式仍在网络上大行其道应用,这和GIF图像文件短小、下载速度快、可用许多具有同样大小的图像文件组成动画等优势是分不开的。
13 BMP、JPG、DICOM文件

(1) 图像开始SOI(Start of Image) 标记结构 字节数 0XFF 1 0XD8 1 可作为JPEG格式的判据(JFIF(JPEG File Interchange Format)还需要APP0的配合)
(7) 扫描线开始SOS(Start of Scan) 标记结构 字节数 意义 0XFF 1 0XDA 1 Ls 2 SOS标记码长度,不包括前两个字节0XFF,0XDA Ns 1 Cs1 1 (Td1,Ta1) 1 Cs2 1 (Td2,Ta2) 1 … CsNs 1 (TdNs,TaNs) 1 Ss 1 Se 1 (Ah,Al) 1 压缩图像数据 Ns为Scan中成分的个数,在基本系统中,Ns=Nf(Frame中成分个数)。CSNs 为在Scan中成分的编号。TdNs为高4位,TaNs为低4位,分别表示DC和AC编码 表的编号。在基本系统中Ss=0,Se=63,Ah=0,Al=0。
(6) 霍夫曼(Huffman)表DHT(Define Huffman Table) 标记结构 0XFF 0XC4 Lh (Tc,Th) L1 L2 … L16 V1 V2 … Vt 字节数 1 1 2 1 1 1 16组数据中,每组个数 1 1 1 每个代码值;t=L1+L2+…L16 1 意义
(4)DRI(Define Restart Interval) 此标记需要用到最小编码单元(MCU,Minimum Coding Unit)的概念。前面提到,Y 分量数据重要,UV分量的数据相对不重要,所以可以只取UV的一部分,以增加压 缩比。目前支持JPEG格式的软件通常提供两种取样方式YUV411和YUV422,其含 义是YUV三个分量的数据取样比例。举例来说,如果Y取四个数据单元,即水平取 样因子Hy乘以垂直取样因子Vy的值为4,而U和V各取一个数据单元,即 Hu×Vu=1,Hv×Vv=1。那么这种部分取样就称为YUV411。
bmp文件格式详解

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。
由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。
Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。
下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:bmp文件头(bmp file header):提供文件的格式、大小等信息位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表位图数据(bitmap data):就是图像数据啦^_^下面结合Windows结构体的定义,通过一个表来分析这四个部分。
我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。
因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。
这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。
下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据段的排布以及组成。
我们使用的图像显示如下:这是一幅16位的位图文件,因此它是含有调色板的。
在拉出图像数据进行分析之前,我们首先进行几个约定:1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。
BMP 文档

BMP格式BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。
随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。
这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。
所以,目前BMP在单机上比较流行。
目录编辑本段简介BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows 环境下运行的所有图象处理软件都支持BMP图象文件格式。
Windows系统内部各图像绘制操作都是以BMP为基础的。
Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。
Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。
BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE 作扩展名)。
6.1.2 文件结构位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件的组成结构名称符号位图文件头 (bitmap-file header) BITMAPFILEHEADER bmfh位图信息头 (bitmap-information header) BITMAPINFOHEADER bmih 彩色表 (color table) RGBQUAD aColors[]图象数据阵列字节 BYTE aBitmapBits[]位图文件结构可综合在表6-01中。
CAD中的位图导入和编辑控制技巧

CAD中的位图导入和编辑控制技巧CAD软件作为一种三维设计和建模工具,广泛应用于建筑、工程、汽车设计等行业。
在CAD中,位图的导入和编辑是常见的操作。
本文将介绍CAD中的位图导入和编辑控制技巧,以帮助读者更好地利用CAD软件进行设计和建模工作。
一、位图导入技巧1. 打开CAD软件后,选择“插入”选项卡中的“图像”命令。
在弹出的对话框中,选择要导入的位图文件,并点击“打开”按钮。
CAD软件支持导入多种格式的位图文件,如JPEG、PNG、BMP等。
2. 在导入位图前,可以设置位图的比例。
点击“图像比例”选项卡中的“按比例”按钮,在弹出的对话框中选择合适的比例值,并点击“确定”按钮。
3. 导入位图后,可以根据需要对其进行位置和大小的调整。
选择“移动”或“缩放”命令,点击位图,并按照指示进行操作。
移动指令可以将位图在画布上自由移动,而缩放指令可以调整位图的大小。
二、位图编辑控制技巧1. 选择“编辑”选项卡中的“图像编辑器”命令,可以进入位图编辑模式。
在位图编辑器中,可以对导入的位图进行编辑操作。
2. 位图编辑器提供了一系列编辑工具,如裁剪、旋转、反转、调整亮度和对比度等。
根据实际需求,选择相应的工具进行编辑操作。
3. 裁剪工具可以用来去除位图中不需要的部分。
点击裁剪工具,然后在位图上绘制一个矩形框,裁剪出需要的部分,并点击“完成”按钮。
4. 旋转工具可以将位图旋转到任意角度。
点击旋转工具,然后在位图上点击两个点,定义一个角度,使位图按照指定角度旋转,并点击“完成”按钮。
5. 反转工具可以对位图进行水平或垂直反转。
选择反转工具,点击位图,即可对位图进行相应的反转操作。
6. 调整亮度和对比度工具可以对位图的亮度和对比度进行调整。
选择相应的工具,然后在位图上拖动滑块,即可实时调整位图的亮度和对比度。
三、附加技巧1. 在位图导入和编辑过程中,可以使用CAD软件提供的图层管理功能。
选择“格式”选项卡中的“图层”命令,可以创建新的图层,并将位图放在指定的图层上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、位图文件结构位图文件由三部分组成:文件头+ 位图信息+ 位图像素数据1、位图文件头。
位图文件头主要用于识别位图文件。
以下是位图文件头结构的定义:[cpp]view plaincopyprint?1.typedef struct tagBITMAPFILEHEADER { // bmfh2.WORD bfType;3.DWORD bfSize;4.WORD bfReserved1;5.WORD bfReserved2;6.DWORD bfOffBits;7.} BITMAPFILEHEADER;1.typedef struct tagBITMAPINFO {2.BITMAPINFOHEADER bmiHeader;3.RGBQUAD bmiColors[1];4.} BITMAPINFO;[cpp]view plaincopyprint?1.typedef struct tagBITMAPINFOHEADER{ // bmih2.DWORD biSize;3.LONG biWidth;4.LONG biHeight;5.WORD biPlanes;6.WORD biBitCount7.DWORD biCompression;8.DWORD biSizeImage;9.LONG biXPelsPerMeter;10.LONG biYPelsPerMeter;11.DWORD biClrUsed;12.DWORD biClrImportant;13.} BITMAPINFOHEADER;每个像素的位数*(1)biCompression图像的压缩格式(这个值几乎总是为0)biSizeImage以字节为单位的图像数据的大小(对BI_RGB压缩方式而言)biXPelsPermeter水平方向上的每米的像素个数biYpelsPerMeter垂直方向上的每米的像素个数biClrused调色板中实际使用的颜色数(2)biClrImportant现实位图时必须的颜色数(3)说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量(1)对于每个像素的字节数,分别有一下意义:0,用在JPEG格式中1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片4,16色图8,256色图,通常说的灰度图16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式(2)这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色数目小于制定的颜色深度的颜色数目的最大值。
(3)这个值通常为0,表示所有的颜色都是必需的2.2颜色表。
颜色表一般是针对16位一下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。
而对于16位一下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。
颜色表的作用就是创建调色板。
下图是带调色板和不带调色板的位图的简单示意图图1 带调色板和不带调色板位图之间的区别颜色表是由颜色表项组成的,颜色表项结构的定义如下:[cpp]view plaincopyprint?1.typedef struct tagRGBQUAD { // rgbq2.BYTE rgbBlue;3.BYTE rgbGreen;4.BYTE rgbRed;5.BYTE rgbReserved;6.} RGBQUAD;1.private:2.DWORD m_dwDibSize;3.CPalette m_Palette;4.int m_nPaletteEntries;5.RGBQUAD *m_pPalette;6.unsigned char *m_pDib, *m_pDibBits;7.BITMAPINFOHEADER *m_pBIH;1.//加载图片2.void CImageDisposeDlg::OnBtnloadimage()3.{4.// TODO: Add your control notification handler code here5.6.//文件路径名称7.CString pszFilename;8.9.//浏览文件对话框10.CFileDialog hFileDlg(TRUE,"bmp",11.NULL,12.OFN_FILEMUSTEXIST|OFN_READONLY|OFN_PATHMUSTEXIST|OFN_NOCHANGEDIR,13.TEXT("BMP (*.bmp)|*.bmp|所有文件(*.*)|*.*|"),14.NULL);15.16.if(hFileDlg.DoModal() == IDOK)17.{18.//获得文件路径名称19.pszFilename=hFileDlg.GetPathName();20.}21.22.//文件类23.CFile cf;24.25.//文件打开失败,程序返回26.if( !cf.Open( pszFilename, CFile::modeRead ) )27.{28.return;29.}30.31.//获得位图信息文件大小32.DWORD dwDibSize;33.dwDibSize = cf.GetLength() - sizeof( BITMAPFILEHEADER );34.35.//申请一块内存存放位图信息36.unsigned char *pDib;37.pDib = new unsigned char [dwDibSize];38.if( pDib == NULL )39.{40.return;41.}42.43.//位图文件头44.BITMAPFILEHEADER BFH;45.46.//从文件读取位图文件头和位图数据47.try{48.// 判断读取位图文件头是否成功49.if( cf.Read( &BFH, sizeof( BITMAPFILEHEADER ) )50.!= sizeof( BITMAPFILEHEADER ) ||51.52.// 判断是否是位图类型53.BFH.bfType != 'MB' ||54.55.// 判断读取位图数据是否成功56.cf.Read( pDib, dwDibSize ) != dwDibSize ){57.58.//释放位图数据指针59.delete [] pDib;60.61.//读取失败,程序返回62.return;63.}64.}65.catch( CFileException *e ){66.e->Delete();67.delete [] pDib;68.return;69.}70.71.//重置全局位图信息指针72.if( m_pDib != NULL )73.{74.delete m_pDib;75.}76.77.//将位图信息指针和位图信息大小赋值给全局变量78.m_pDib = pDib;79.m_dwDibSize = dwDibSize;80.81.//获取位图信息头指针82.m_pBIH = (BITMAPINFOHEADER *) m_pDib;83.84.//获取位图调色板指针85.m_pPalette = (RGBQUAD *) &m_pDib[sizeof(BITMAPINFOHEADER)];86.87.// 计算调色板中实际颜色数量88.m_nPaletteEntries = 1 << m_pBIH->biBitCount;//1左移89.if( m_pBIH->biBitCount > 8 )90.{91.m_nPaletteEntries = 0;92.}93.else if( m_pBIH->biClrUsed != 0 )94.{95.m_nPaletteEntries = m_pBIH->biClrUsed;96.}97.98.// 获取位图数据指针99.m_pDibBits =&m_pDib[sizeof(BITMAPINFOHEADER)+m_nPaletteEntries*sizeof(RGBQUAD)]; 100.101.// 重置全局调色板102.if( m_Palette.GetSafeHandle() != NULL )103.{104.m_Palette.DeleteObject();105.}106.107.//如果调色板颜色数量不为零,则通过逻辑调色板创建调色板108.if( m_nPaletteEntries != 0 ){109.110.//为逻辑调色板分配内存111.LOGPALETTE *pLogPal = (LOGPALETTE *) new char112.[sizeof(LOGPALETTE)+113.m_nPaletteEntries*sizeof(PALETTEENTRY)];114.115.if( pLogPal != NULL ){116.117.//设置逻辑调色板的版本118.pLogPal->palVersion = 0x300;119.//设置逻辑调色板的颜色数量120.pLogPal->palNumEntries = m_nPaletteEntries;121.122.//为每个颜色实体赋颜色值123.for( int i=0; i<m_nPaletteEntries; i++ ){124.pLogPal->palPalEntry[i].peRed =125.m_pPalette[i].rgbRed;126.pLogPal->palPalEntry[i].peGreen =127.m_pPalette[i].rgbGreen;128.pLogPal->palPalEntry[i].peBlue =129.m_pPalette[i].rgbBlue;130.}131.132.//创建调色板133.m_Palette.CreatePalette( pLogPal );134.//释放内存135.delete [] pLogPal;136.}137.}138.//重绘139.Invalidate();140.}1.//保存图片2.void CImageDisposeDlg::OnBtnsave()3.{4.// TODO: Add your control notification handler code here5.//文件路径名称6.CString pszFilename;7.8.//浏览文件对话框9.CFileDialog hFileDlg(FALSE,"bmp",10.NULL,11.OFN_FILEMUSTEXIST|OFN_READONLY|OFN_PATHMUSTEXIST|OFN_NOCHANGEDIR,12.TEXT("BMP (*.bmp)|*.bmp|所有文件(*.*)|*.*|"),13.NULL);14.15.if(hFileDlg.DoModal() == IDOK)16.{17.//获得文件路径名称18.pszFilename=hFileDlg.GetPathName();19.}20.21.// 如果位图信息为空则程序返回22.if( m_pDib == NULL )23.return;24.25.//文件类26.CFile cf;27.28.// 创建文件29.if( !cf.Open( pszFilename,30.CFile::modeCreate | CFile::modeWrite ) )31.return;32.33.// 写入数据34.try{35.36.//创建位图文件头37.BITMAPFILEHEADER BFH;38.memset( &BFH, 0, sizeof( BITMAPFILEHEADER ) );39.BFH.bfType = 'MB';40.BFH.bfSize = sizeof( BITMAPFILEHEADER ) + m_dwDibSize;41.BFH.bfOffBits = sizeof( BITMAPFILEHEADER ) +42.sizeof( BITMAPINFOHEADER ) +43.m_nPaletteEntries * sizeof( RGBQUAD );44.45.//将数据写入文件46.cf.Write( &BFH, sizeof( BITMAPFILEHEADER ) );47.cf.Write( m_pDib, m_dwDibSize );48.}49.catch( CFileException *e ){50.e->Delete();51.return;52.}53.54.}1.void CImageDisposeDlg::OnPaint()2.{3.4.CPaintDC dc(this);5.6.//如果位图信息为空,程序返回7.if( m_pDib == NULL )8.return;9.10.//获得位图宽高11.int nWidth,nHeight;12.nWidth = m_pBIH->biWidth;13.nHeight = m_pBIH->biHeight;14.15.//如果有调色板则使用调色板16.if( m_Palette.GetSafeHandle() != NULL )17.{18.CPalette *pOldPalette;19.pOldPalette = dc.SelectPalette( &m_Palette, FALSE );//选择调色板20.dc.RealizePalette();//实现调色板21.22.//绘图23.StretchDIBits( dc.m_hDC, 0, 0,24.nWidth, nHeight,25.0, 0,26.m_pBIH->biWidth, m_pBIH->biHeight,27.m_pDibBits,28.(BITMAPINFO *) m_pBIH,29.BI_RGB, SRCCOPY );30.31.//恢复调色板32.dc.SelectPalette( pOldPalette, FALSE );33.}34.else//没有调色板,直接绘制35.{36.StretchDIBits( dc.m_hDC, 0, 0,37.nWidth, nHeight,38.0, 0,39.m_pBIH->biWidth, m_pBIH->biHeight,40.m_pDibBits,41.(BITMAPINFO *) m_pBIH,42.BI_RGB, SRCCOPY );43.}44.}头文件Cdib.h[cpp]view plaincopyprint?1.#ifndef __CDIB_H2.#define __CDIB_H3.4.class CDib : public CObject5.{6.public:7.BITMAPFILEHEADER bitmapFileHeader;//位图文件头结构8.BYTE* pDib;//指向位图文件内容的指针9.DWORD size;//位图信息大小10.BITMAPINFO* m_pBitmapInfo;//指向位图信息的指针11.BITMAPINFOHEADER* m_pBitmapInfoHeader;//指向位图信息头的指针12.RGBQUAD* m_pPalette;//指向调色板的指针13.BYTE* m_pData;//指向位图数据的指针14.BOOL m_valid;//判断是否是位图文件15.CPalette m_Palette;//调色板对象16.int m_nPaletteEntries;//调色板颜色数目17.int m_WIDTHBYTES;//字节宽18.public:19.CDib();20.~CDib();21.22.DWORD GetSize();//获得图像数据大小,以字节为单位23.void DrawImage(CPaintDC* dc,int left,int top,int right,int bottom);//绘制图像24.void LoadFile(CString filePath);//加载位图文件25.void SaveFile(CString filePath);//保存位图文件26.};27.28.#endif1.#include "stdafx.h"2.#include "cdib.h"3.#include "windowsx.h"4.#include "math.h"5.#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)6.7.CDib::CDib()8.{9.size=0;//位图信息大小10.}11.12.CDib::~CDib()13.{14.GlobalFreePtr(pDib);//释放内存15.}16.17.//加载位图数据18.void CDib::LoadFile(CString filePath)19.{20.CFile dibFile(filePath, CFile::modeRead);//通过文件路径创建一个文件21.dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));//读取文件头到文件头结构22.if (bitmapFileHeader.bfType == 0x4d42)//判断文件类型是否是位图文件23.{24.DWORD fileLength = dibFile.GetLength();//获得文件大小25.size = fileLength -sizeof(BITMAPFILEHEADER);//获得位图信息大小26.pDib = (BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);//分配一大小为size的可移动内存块27.dibFile.Read((void*)pDib, size);//将数据读取到位图信息指针所指向的内存28.dibFile.Close();//关闭位图文件29.30.m_pBitmapInfo = (BITMAPINFO*) pDib;//获取位图信息指针31.m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pDib;//获取位图信息头指针32.m_pPalette = (RGBQUAD*)(pDib + m_pBitmapInfoHeader->biSize);//获得位图颜色表指针33.34.m_pBitmapInfoHeader->biSizeImage = GetSize();//获得位图数据大小35.36.// 计算调色板中实际颜色数量37.m_nPaletteEntries = 1 << m_pBitmapInfoHeader->biBitCount;//逻辑值38.//实际值39.if( m_pBitmapInfoHeader->biBitCount > 8 )40.{41.m_nPaletteEntries = 0;42.}43.else if( m_pBitmapInfoHeader->biClrUsed != 0 )44.{45.m_nPaletteEntries = m_pBitmapInfoHeader->biClrUsed;46.}47.48.DWORD colorTableSize = m_nPaletteEntries * sizeof(RGBQUAD);//颜色表大小49.m_pData = pDib + m_pBitmapInfoHeader->biSize + colorTableSize;//获得位图数据的指针50.51.if (m_pPalette == (RGBQUAD*)m_pData)//没有调色板的情况52.{53.m_pPalette = NULL;54.}55.else//有调色板的情况,创建调色板对象57.// 重置全局调色板58.if( m_Palette.GetSafeHandle() != NULL )59.{60.m_Palette.DeleteObject();61.}62.63.//为逻辑调色板分配内存,通过逻辑调色板创建调色板64.LOGPALETTE *pLogPal = (LOGPALETTE *) new char65.[sizeof(LOGPALETTE)+66.m_nPaletteEntries*sizeof(PALETTEENTRY)];67.68.if( pLogPal != NULL ){69.70.//设置逻辑调色板的版本71.pLogPal->palVersion = 0x300;72.//设置逻辑调色板的颜色数量73.pLogPal->palNumEntries = m_nPaletteEntries;74.75.//为每个颜色实体赋颜色值76.for( int i=0; i<m_nPaletteEntries; i++ ){77.pLogPal->palPalEntry[i].peRed =78.m_pPalette[i].rgbRed;79.pLogPal->palPalEntry[i].peGreen =80.m_pPalette[i].rgbGreen;81.pLogPal->palPalEntry[i].peBlue =82.m_pPalette[i].rgbBlue;83.}84.85.//创建调色板86.m_Palette.CreatePalette( pLogPal );87.//释放内存88.delete [] pLogPal;89.}90.}92.m_WIDTHBYTES =WIDTHBYTES((m_pBitmapInfoHeader->biWidth)*((DWORD)m_pBitmapInfoHeader->bi BitCount));93.94.m_valid = TRUE;//位图文件读取成功95.}96.else97.{98.m_valid = FALSE;//位图文件读取失败99.}100.}101.102.//获得图像数据大小,以字节为单位103.DWORD CDib::GetSize()104.{105.if (m_pBitmapInfoHeader->biSizeImage != 0)106.{107.return m_pBitmapInfoHeader->biSizeImage;108.}109.else110.{111.returnWIDTHBYTES((m_pBitmapInfoHeader->biWidth)*((DWORD)m_pBitmapInfoHeader->bi BitCount))*m_pBitmapInfoHeader->biHeight;112.}113.}114.115.//保存位图文件116.void CDib::SaveFile(CString filePath)117.{118.CFile dibFile(filePath, CFile::modeCreate|CFile::modeWrite);119.dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER)); 120.dibFile.Write((void*)pDib, size);121.dibFile.Close();122.}123.124.//绘制图像125.void CDib::DrawImage(CPaintDC* dc,int left,int top,int right,int bottom) 126.{127.//如果有调色板则使用调色板128.if(m_Palette.GetSafeHandle()!=NULL)129.{130.CPalette *pOldPalette;131.pOldPalette = dc->SelectPalette( &m_Palette, FALSE );//选择调色板132.dc->RealizePalette();//实现调色板133.134.//绘图135.StretchDIBits( dc->m_hDC, left, top,136.right,bottom,137.0, 0,138.m_pBitmapInfoHeader->biWidth,m_pBitmapInfoHeader->biHeight,139.m_pData,140.(BITMAPINFO *) m_pBitmapInfo,141.BI_RGB, SRCCOPY );142.143.//恢复调色板144.dc->SelectPalette( pOldPalette, FALSE );145.}146.else//没有调色板,直接绘制147.{148.StretchDIBits( dc->m_hDC, left, top,149.right,bottom,150.0, 0,151.m_pBitmapInfoHeader->biWidth,m_pBitmapInfoHeader->biHeight,152.m_pData,153.(BITMAPINFO *) m_pBitmapInfo,154.BI_RGB, SRCCOPY );155.}156.}。