BMP文件结构的探索
- 格式:doc
- 大小:74.00 KB
- 文档页数:19
BMP文件结构分析(三)
继续分析接下来的数据,根据BMP文件结构的定义,接下来的数据是位图信息头,cat2.bmp图像文件的位图信息头的内容如图5-5所示。
色板[49] ,第3个像素的颜色等于调色板[49] ,第4个像素的颜色等于调色板[B1]……依此类推。
分析完cat2.bmp图像之后,接下来分析的是cat1.bmp。
cat1.bmp图像是24位色图像,根据BMP文件结构定义得知,cat1.bmp图像没有调色板,图像数据存储的是实际的颜色数据,每个像素用3字节表示,分别是红绿蓝。
由于cat1.bmp和cat2.bmp的位图文件头和位图信息头结构一样,所以cat1.bmp 的位图文件头和位图信息头可以参考上面对cat2.bmp的分析,下面从cat1.bmp 的位图信息头结束的位置开始分析,如图5-11所示。
BMP文件结构1. BMP文件组成BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。
颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。
文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。
2. BMP文件头BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:3. 位图信息头BMP位图信息头数据用于说明位图的尺寸等信息。
其结构如下:注意:对于BMP文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么16色图像采用RLE4压缩算法,256色图像采用RLE8压缩算法。
4. 颜色表颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。
RGBQUAD结构的定义如下:颜色表中RGBQUAD结构数据的个数由BITMAPINFOHEADER 中的biBitCount项来确定,当biBitCount=1,4,8时,分别有2,16,256个颜色表项,当biBitCount=24时,图像为真彩色,图像中每个像素的颜色用三个字节表示,分别对应R、G、B值,图像文件没有颜色表项。
王君岩,张 涵,刘哲熹,等.猪BMPR1B基因的生物信息学分析[J].江苏农业科学,2023,51(1):32-44.doi:10.15889/j.issn.1002-1302.2023.01.005猪BMPR1B基因的生物信息学分析王君岩,张 涵,刘哲熹,白珂瑞,王德鹏,吴克亮(中国农业大学动物科学技术学院动物遗传资源与分子育种实验室,北京100193) 摘要:为了分析猪骨形态发生蛋白1B型受体BMPR1B蛋白的理化性质、高级结构、结构域、亚细胞定位、N-糖基化、同源进化关系、选择压力以及分子内共进化等,利用生物信息学软件及平台,对BMPR1B基因的结构与功能进行鉴定,为进一步探讨BMPR1B基因在母猪繁殖性状中发挥的作用奠定遗传信息基础。
结果表明,猪BMPR1B基因编码502个氨基酸;相对分子量为56960.47,理论等电点为7.78,带正电,呈碱性,不稳定,是一种跨膜的亲水蛋白;二级结构以α-螺旋和无规卷曲为主,三级结构由1条主链和1条侧链构成,模型稳定,构象合理;具有3个保守的功能结构域,为激活素受体结构域、GS结构域和丝氨酸/苏氨酸激酶结构域;定位于细胞膜上,无信号肽序列,为非GPI锚定蛋白;另含有13个潜在的N-糖基化位点。
系统进化分析表明:物种间,猪BMPR1B基因与马的同源性最高;物种内,猪BMPR1B基因类型上可以分为3个组,值得注意的是梅山猪作为独立的一支被分为一组,与猪的高繁殖力性状有一定联系。
选择压力分析显示:猪BMPR1B基因经历了强烈的净化选择,十分保守,但在M7vs.M8模型中发现了44个强烈的正选择位点。
分子共进化显示,在猪BMPR1B基因中检测到4组协同进化,涉及10个氨基酸。
关键词:猪;BMPR1B基因;生物信息学;选择压力;分子共进化 中图分类号:S828.2 文献标志码:A 文章编号:1002-1302(2023)01-0032-12收稿日期:2022-03-18基金项目:国家重点研发计划重点专项(编号:2021YFF1000603);生猪产业技术体系北京市创新团队项目(编号:BAIC02-2021)。
bmp5 基因
BMP5基因是一种蛋白质编码基因,具有多种生物学功能,包括骨骼发育、神经发生和肿瘤发生等。
BMP5基因通过编码一种称为骨形态发生蛋白(BMP)的信号分子,参与调控细胞生长和分化。
在骨骼发育过程中,BMP5基因的表达可以促进骨骼的形成和生长。
此外,BMP5基因还参与神经发生和肿瘤发生等过程。
BMP5基因的突变可以导致多种疾病,包括但不限于:骨发育异常、脊柱侧弯、唐氏综合征、智力障碍、孤独症和癌症等。
这些疾病的发生可能与BMP5基因的表达水平或突变引起的功能异常有关。
针对BMP5基因的研究已经取得了不少进展,包括对其表达调控机制、与疾病的关系以及治疗策略等方面的研究。
例如,研究人员发现BMP5基因的表达可以受到miRNA等非编码RNA的调控,这些调控机制可以影响BMP5基因的表达水平和功能。
同时,针对BMP5基因突变引起的疾病,研究人员也在探索相应的治疗策略,如基因治疗和药物干预等。
总之,BMP5基因是一个重要的生物学基因,参与多种生物学过程,其突变可以引起多种疾病。
针对BMP5基因的研究可以为相关疾病的预防、诊断和治疗提供重要的理论依据和实验数据。
目 录第一章 绪论1.1 选题背景及意义 (1)1.2 图像去噪的发展现状 (2)1.3 本课题研究主要内容 (3)第二章 图像预处理及C++Builder编程环境2.1 常见图像类型及读存实现 (7)2.1.1 图像的色彩模型 (7)2.1.2 图像类型表示 (8)2.1.3 常见图像文件的读入与保存实现 (9)2.2 图像的预处理 (10)2.3 C++ Builder编程环境 (15)2.3.1 C++ Builder功能特点 (15)2.3.2 本课题涉及到的C++ Builder控件 (17)第三章 图像的时域去噪方法研究及实现3.1 图像常见噪声的添加方法 (19)3.1.1 噪声的定义和分类 (19)3.1.2 随机噪声的添加方法与实现 (20)3.1.3 椒盐噪声的添加方法与实现 (20)3.2 时域去噪的常用算法与实现 (21)3.2.1 传统均值滤波 (21)3.2.2 模糊加权均值滤波 (22)3.2.3 传统中值滤波 (23)3.2.4 加权多级中值滤波 (24)3.2.5 多级非线性加权平均中值滤波 (25)3.2.6 均值加速中值滤波 (26)3.2.7 递归极大中值滤波 (28)3.2.8多级中值滤波滤波 (29)3.2.9 改进的多向多级中值滤波 (32)3.3 图像去噪效果的评价标准 (32)3.4 对比实验及结果分析 (34)3.5 结论 (38)第四章 总结及展望4.1 工作总结 (39)4.2 技术展望 (39)参考文献 (41)致谢 (42)附 录 (42)第一章 绪 论1.1 选题背景及意义人类通过眼、耳、鼻、舌、身接受信息,感知世界,并进而认识世界和改造世界。
据统计,人类约有70%的信息是通过视觉系统获取的。
粗略地说,图像是二维或三维景物呈现在人心目中的影像。
如果接受并加工识别这种视觉信息的是电子计算机,则称之为计算机图像处理和识别。
近年来,由于计算机技术的迅猛发展,计算机的速度越来越快,图像处理系统的价格日益下降,从而使图像处理得以广泛应用于众多的科学与工程领域,如遥感、工业检测、医学、气象、侦察、通信、智能机器人等。
空间大数据中的数据整合与可视化分析一、介绍随着科技的不断发展,空间大数据的需求量越来越大。
而空间大数据的整合与可视化分析是空间大数据应用中的重要环节。
本文将从数据整合与可视化分析两个方面进行阐述。
二、数据整合数据整合是将多个来源、多个格式的数据合并为一个统一的格式,方便后续的分析。
空间大数据的数据整合需要考虑以下几个方面:1. 标准化数据格式不同来源的数据格式不同,有的是栅格数据格式(如tif、img、bmp)、有的是矢量数据格式(如shp、geojson、kml),有的是GPS轨迹数据格式(如gpx、kml)、有的是CAD图像格式(如dwg、dxf),甚至还有不同的数据库管理系统、文件夹结构等。
因此,在数据整合过程中,需要将不同格式的数据转化为一致的格式。
2. 空间参考统一不同的数据来源,其空间参考可能不同。
因此在数据整合过程中,需要将不同的数据空间参考转化为一致的格式,以方便后续的空间分析。
3. 数据质量检查在数据整合过程中,需要对数据进行质量检查,检查数据是否满足分析的要求。
比如,在某个区域内,不同数据来源的数据应该在空间上是完全重叠的,如果不重叠,则需要排查数据质量是否有问题。
4. 数据存储在数据整合过程中,需要设计数据存储的结构。
数据存储的结构可以是基于文件夹的层次结构,也可以是基于数据库表格的关系模型结构。
不同的数据结构需要根据具体情况进行选择。
三、可视化分析可视化分析是将大量的数据通过可视化手段呈现,以便用户对数据进行探索和分析。
空间大数据的可视化分析需要考虑以下几个方面:1. 矢量数据可视化矢量数据可视化包括点、线、面的可视化。
点的可视化可以采用散点图、符号图等方式进行展示;线的可视化可以采用简单的线、箭头线、流线等方式进行展示;面的可视化可以采用填充色、线边框的方式进行展示。
在选择可视化方式时,需要考虑图形的美观性、直观性和表达能力。
2. 栅格数据可视化栅格数据可视化分为灰度值、颜色渐变色、颜色区间等方式。
《信息技术教材教法》试卷一、多项选择题(每题2分,共10分)1、信息技术教材教法具有哪些特点()A 综合性B 实践性C 发展性D 独立性E 创新性F 连续性2、信息技术教材教法的研究对象有哪些()A 信息技术课程B 计算机辅助教育C 计算机基础D 信息技术教学E 计算机远程教育3、信息技术教育发展经历那些阶段()A 实验改革阶段B 实验启动阶段C 逐步发展阶段D 快速发展阶段4、信息技术课的教学特点有哪些()A 现代性特点B 复古性特点C 实践性特点D 工具性特点E 应用性特点F 文化性特点5、下面那些属于基本教学法()A 讲授法B 发现教学法C 游戏教学法D 谈话法E 演示法F 模型教学法填空题(每题2分,共10分)1、(,)推动信息技术教育的发展,是每个信息技术教育工作者义不容辞的历史使命。
2、教学方法是师生为达到()、完成()而采用的教学措施和教学手段,是教师和学生相互结合的活动方式。
3、信息技术教材教法的研究意义包括()和实践意义。
4、根据现代教学论对教学方法进行了归纳,将教学方法分为两大类:()和基本教学法。
5、讲授法有三种方式,分别是讲述、( )和讲演。
三、简答题(每题5分,共25分)1、《中小学信息技术课程指导纲要(试行)》中对于中小学信息技术课程的教学目的做了怎样的规定?2、请简单说明“练习法”方法、意义与使用应注意哪些问题?3、信息技术课教学的原则有哪些?4、信息技术教材教法研究的任务主要有哪些?5、信息技术课具有哪些显著学习特点?四、论述题(15分)1、假设你接到了学校的任务,要你和你的学生共同来设计一个信息技术学科教研网站,要求设计美观大方,内容丰富实际,有地方特色,简述你将如何发动学生,从哪些方面来着手准备,以及对网站的整体设计构思。
五、根据下面给定的材料,经过你的分析和总结,写出说课稿(40分)制作小板报——图文混排教学设计教学对象分析该课时的学习对象为小学五年级的学生,他们从四年级开始学习信息技术,已经掌握了计算机的基本操作,熟练文字输入、文字排版。
BMP文件结构的探索BMP文件结构的探索WhatIf 2004-9-10一、文件格式Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。
针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。
首先,整个bmp文件的内容可以分为3到4块。
之所以分为3到4块而不是固定的值,是因为,对于bmp来说可能存在调色板或者一些掩码。
具体稍候讨论。
第一块是bmp的文件头用于描述整个bmp文件的情况。
结构如下:typedef struct BITMAPFILEHEADER {WORD bfType; //两个字节DWORD bfSize; //四个字节WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER, *PBITMAPFILEHEADER;这些信息相当有用,如果你想直接来解析bmp文件。
第一个bfType用于表示文件类型,如果它是bmp文件,那么它这个位置的值一定是”BM”也就是0x4D42。
第二个bfSize表示整个文件的字节数。
第三第四个则保留,目前无意义,最后一个相当重要,表示,位图的数据信息离文件头的偏移量,以字节为单位。
第二块是位图信息头,即BITMAPINFOHEADER,用于描述整个位图文件的情况。
以下挑重要的数据进行解释typedef struct BITMAPINFOHEADER{DWORD biSize; //表示本结构的大小LONG biWidth; //位图的宽度LONG biHeight; //位图的高度WORD biPlanes; //永远为1 ,由于没有用过所以没做研究附msdn解释//Specifies the number of planes for the target device. This value must be set to 1.WORD biBitCount;//位图的位数分为1 4 8 16 24 32 本文没对1 4 进行研究DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释DWORD biSizeImage; //表示位图数据区域的大小以字节为单位LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER, *PBITMAPINFOHEADER;第三块就是调色板信息或者掩码部分,如果是8位位图则存放调色板;16 与32位位图则存放RGB颜色的掩码,这些掩码以DWORD 大小来存放。
1.位图和调色板的概念如今Windows(3.x以及95,NT)系列已经成为决大多数用户使用的操作系统。
它比DOS成功的一个重要因素是它可视化的漂亮界面,例如你可以在桌面上铺上你喜欢的墙纸。
那么Windows 是如何显示图象的呢?这就要谈到位图(Bitmap)。
我们知道,普通的显示器屏幕是由许许多多的点构成的,我们称之为象素。
显示时采用扫描的方法:电子枪每次从左到右扫描一行,为每个象素着色,然后从上到下这样扫描若干行,就扫过了一屏。
为了防止闪烁,每秒要重复上述过程几十次。
例如我们常说的屏幕分辨率为640*480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复扫描屏幕70次。
我们称这种显示器为位映象设备。
所谓位映象,就是指一个二维的象素矩阵,而位图就是采用位映象方法显示和存储的图象。
举个例子,下图1是一幅普通的黑白位图,图2是被放大后的图,图中每个方格代表了一个象素,我们可以看到:整个骷髅就是由这样一些黑点和白点组成的。
图1.骷髅(左) 图2.放大后的骷髅位图(右)那么,彩色图是怎么回事呢?我们先来说说三元色RGB概念。
我们知道,自然界中的所有颜色都可以由红,绿,蓝(R,G,B)组合而成。
有的颜色含有红色成分多一些,如深红;有的含有红色成分少一些,如淡红。
针对含有红色成分的多少,可以分成0到255共256个等级,0级表示不含红色成分,255级表示含有100%的红色成分。
同样,绿色和蓝色也被分成256级。
这种分级的概念被称作量化。
这样,根据红,绿,蓝各种不同的组合我们就能表示出256*256*256,约1千6百万种颜色。
这么多颜色对于我们人眼来已经足够了。
下表是常见的一些颜色的RGB组合值。
颜色R G B红25500蓝00255绿02550黄2552550紫2550255青0255255白255255255黑000灰128128128你大概已经明白了,当一幅图中每个象素赋予不同的RGB值时,就能呈现出五彩缤纷的颜色了,这样就形成了彩色图。
2024年软件资格考试多媒体应用制作技术员(基础知识、应用技术)合卷(初级)自测试卷(答案在后面)一、基础知识(客观选择题,75题,每题1分,共75分)1、以下哪种操作系统不是微软公司开发的?()A、Windows操作系统B、Linux操作系统C、Mac OS操作系统D、UNIX操作系统2、在多媒体应用制作中,以下哪个不是音频文件的常见格式?()A、MP3B、WAVC、AACD、JPEG3、题干:在多媒体应用制作中,以下哪种媒体类型不属于多媒体的基本元素?A. 文本B. 图像C. 声音D. 动画4、题干:在多媒体制作中,以下哪个概念不属于多媒体数据的存储和传输?A. 数据压缩B. 数据加密C. 数据校验D. 数据同步5、以下哪个选项不属于软件工程的基本原则?A. 单一职责原则B. 开放封闭原则C. 李氏替换原则D. 数据驱动原则6、在面向对象设计中,以下哪个概念不属于设计模式的三种基本类型?A. 创建型模式B. 结构型模式C. 行为型模式D. 数据库模式7、在多媒体应用中,以下哪个不属于常见的多媒体素材类型?A、音频B、视频C、动画D、代码8、以下哪个概念描述了多媒体数据在传输过程中对实时性的要求?A、数据压缩B、数据同步C、数据传输速率D、数据存储容量9、在多媒体应用制作中,以下哪种格式通常用于存储音频文件?()A. JPEGB. MP3C. GIFD. WAV11、在多媒体制作中,以下哪种格式不属于常见的视频格式?()A. AVIB. MPEGC. WMVD. PDF13、在多媒体制作过程中,以下哪种格式通常用于存储音频数据?A. MP3B. WAVC. JPGD. PNG15、题干:在多媒体应用制作中,以下哪种格式是音频文件格式?A. BMPB. WAVC. JPGD. AVI17、在多媒体数据压缩技术中,下列哪种编码属于无损压缩?A. JPEG压缩B. MP3压缩C. Huffman编码D. MPEG压缩19、题干:在多媒体制作中,以下哪种格式不支持动画效果?A. SWFB. AVIC. MP4D. PNG21、下列哪个文件格式不属于常用的图像文件格式?A、JPEGB、PNGC、GIFD、MP323、题干:在多媒体制作中,以下哪个格式通常用于存储动画文件?A. BMPB. GIFC. JPEGD. WAV25、下列选项中哪一个不是常用的音频文件格式?A、WAVC、JPEGD、MIDI27、在多媒体制作中,以下哪种编码格式可以提供高质量的音频和视频,同时文件大小相对较小?A. MP3B. WAVC. AVID. MPEG-229、下列哪种文件格式最适合用于存储包含透明背景的图像?A. JPEGB. PNGC. GIFD. BMP31、在多媒体应用中,以下哪个不是常见的音频格式?A. MP3B. WAVC. JPEGD. MIDI33、以下哪种文件格式通常用于无损压缩的音频文件?A. MP3B. WAVD. FLAC35、在多媒体应用制作过程中,以下哪项技术不属于数字音频处理技术?A. 混音技术B. 音频压缩技术C. 数字信号处理技术D. 文字识别技术37、在多媒体数据压缩技术中,下列哪种算法属于无损压缩?A. JPEG压缩B. MP3压缩C. GIF压缩D. MPEG压缩39、以下哪项不是多媒体应用制作技术员需要掌握的软件工具?A. Adobe PhotoshopB. Adobe Premiere ProC. Microsoft WordD. Microsoft Excel41、在多媒体应用中,以下哪种格式不支持动画效果?A. AVIB. MPGC. GIFD. WMV43、在多媒体应用中,以下哪种格式通常用于存储静态图像?A. MP3B. JPEGC. AVID. WAV45、在多媒体应用制作中,以下哪个术语指的是音频信号的数字化过程?A. 编码B. 解码C. 压缩D. 解压缩47、在多媒体应用制作中,以下哪种格式通常用于存储高质量的数字图像?A. JPEGB. PNGC. GIFD. BMP49、以下哪个不是多媒体数据压缩的基本方法?A. 熵压缩B. 线性预测编码C. 子带编码D. 运动补偿51、在多媒体应用制作中,以下哪个术语指的是通过计算机软件对音频信号进行编辑和处理的技术?A. 数字音频B. 音频合成C. 音频编辑D. 音频播放53、在多媒体制作中,以下哪个软件不是视频编辑软件?A. Adobe Premiere ProB. Final Cut ProC. PhotoshopD. After Effects55、题目:在多媒体应用制作过程中,以下哪个不是常用的数字音频格式?A. MP3B. WAVC. AVID. MIDI57、以下哪个不属于软件工程中常用的软件开发模型?()A. 瀑布模型B. V形模型C. 螺旋模型D. 原型化模型E. 水平模型59、以下哪项不是多媒体技术中常见的音频文件格式?A. WAVC. AVID. JPG61、以下关于多媒体数据压缩技术的描述,正确的是:A. 多媒体数据压缩技术只能应用于音频和视频数据B. 多媒体数据压缩技术主要目的是为了提高数据传输速度C. 压缩比越高,压缩后的数据质量越好D. 压缩后的数据可以通过无损压缩技术完全恢复原样63、在多媒体应用制作中,以下哪种文件格式主要用于存储数字图像?A. MPEGB. JPEGC. WAVD. AVI65、以下哪项不是多媒体的基本要素?()A. 音频B. 视频C. 文本D. 硬盘67、以下哪种文件格式适合用于存储视频流数据,并且具有较好的压缩率?A. AVIB. MP4C. MOV69、在多媒体应用中,下列哪种文件格式主要用于存储高质量的音频信息?A. BMPB. MP3C. JPEGD. GIF71、在多媒体制作中,以下哪种格式通常用于存储视频内容,并且支持较高的视频质量和较低的文件大小?A. AVIB. MP4C. MOVD. WMV73、下列哪一种文件格式不是常见的图像文件格式?A. JPEGB. PNGC. GIFD. MP375、以下关于多媒体数据压缩技术的描述,错误的是:A. 多媒体数据压缩技术可以提高数据的传输效率B. 多媒体数据压缩技术可以减少存储空间的需求C. 多媒体数据压缩技术通常会导致数据的不可逆损坏D. 多媒体数据压缩技术包括无损压缩和有损压缩二、应用技术(全部为主观问答题,总5大题,第一题必选,剩下4选2,每题25分,共75分)第一题案例描述:某公司计划开发一款面向儿童教育的互动应用程序,旨在通过游戏化学习的方式教授基础数学知识。
大家一定有过这样的经历,每当我们殚精竭虑为用户开发完一个系统之后往往都是派一名技术员到用户那里进行应用软件的安装,数据库的配置,这些看似简单的配置对一般用户来说可不是件容易做的事。
这不仅给那些喜欢力求完美的程序设计师带来一点遗憾外,而且也使我们设计出来的软件缺少一种安全可靠感。
如果我们在交给用户软件的时候能给他们一个象一些专业软件的安装程序,这不仅给用户留下了一个良好的第一印象,同时也节省了开发维护成本。
要说起制作安装程序的软件有许多,像InstallShield,CreateInstall,Easy Install,EasySetup,SetupBuilder 等等,可以举出一大堆来。
但其中最为著名的当属InstallShield。
目前世界上绝大多数的商业软件的安装盘都是用她来完成,比如我们可能天天在使用的Norton AntiVirus 2000。
InstallShield之所以很流行也许是因为程序员可以在通过编写脚本语言方便的进行Windows应用程序的注册表修改、ODBC配置等复杂的操作,以及她本身提供了一些相当智能化的功能。
下面,就本人在实际开发中的一些所得和大家一起探讨,文中如有任何不妥之处还请同行们给予指教。
在讲述到数据库配置的一系列问题是以目前最常用的ODBC接口为基础,文中用到的实例是在WIN98系统中,InstallShield用的是Professional 6.21下开发和调试的,其中的应用程序实例用的PowerBuilder 7.0下开发的演示程序。
第一步:快速体验首先,我们可以来快速体验一下用InstallShield制作的安装程序是什么样的。
当然,我不可能详细到怎样建立一个项目之类的问题,有关这方面的内容还请看InstallShield的入门教材。
第二步:;InstallShield初探首先,用Project Wizard建立一个新的项目,取名Demo,同时在对话框中选择所有的选项,并且在语言选择中选择Chinese(PRC)和English,即简体中文和英文支持。
探索性测试及基本⽤例1 测试决策5要素测试⽬标:所有的重要任务都完成了,⽽剩下没做的事情是⽐较次要的,我们做到这⼀点就可以尽早尽可能地降低发布风险。
测试⽅法:测试是⼀个不断抉择的过程,测试⼈员必须理解运⾏测试⽤例时和分析现有信息所涉及的各种复杂性。
测试决策5要素:⽤户输⼊、状态、代码路径、⽤户数据、执⾏环境。
⽤户输⼊输⼊:环境产⽣的刺激,该刺激导致被测试的应⽤有所响应。
主要分原⼦输⼊(输⼊⼀个数字、按钮)和抽象输⼊(1-25535之间的任何⼀个原⼦输⼊长度值,类似于等价类划分)两类。
考虑各种输⼊之间会相互影响:单独输⼊、混合输⼊。
输⼊值的顺序:组合输⼊。
核⼼功能:接收输⼊、产⽣输出、存储数据、进⾏运算。
[正向测试、逆向测试]错误处理程序[error handler]:输⼊筛选器、输⼊检查、异常处理代码。
常规输⼊[字母和数字]、⾮常规输⼊[⽐如输⼊ctrl+c、shift+c、esc、ctrl键、alt、操作系统的保留字、不同的字符集,本地化的问题]默认输⼊[空格、空⽩、默认值]使⽤输出来指导输⼊。
状态:状态控件中的⼀个点,由所有内部数据结构的取值进⾏决定。
代码路径:⼀连串的代码语句[基于⽩盒]。
⽤户数据:测试数据尽量与上线环境的数据保持⼀致。
执⾏环境:操作系统、当前配置、其他应⽤程序、⽹络拓扑、驱动程序、⽂件系统、⽹络带宽、性能。
2 缺陷检测1.⾃动化测试:通过编写代码来测试⼀个应⽤。
(擅长找到的问题:程序崩溃、系统死机、程序挂起、突发异常、原有能⽤的功能出现问题)2.⼿⼯测试:使⽤程序的⽤户界⾯,⼿⼯输⼊数据进⾏测试。
(缺点:速度慢、没有规律、不可反复使⽤、发现问题也不能重视、⼈员⽔平决定测试质量、使⽤喜欢的测试⽤例⼜缺乏变通)。
测试⽤例的编写不要太使⽤细节的描述,尽量描述⼀些⽤户使⽤场景,同时结合⾃动化测试⼯具进⾏使⽤。
1.需要测试⼈员编写代码。
2.花费太多的时间来开发测试代码,⽽减少了测试项⽬的时间。
BMP格式结构详解位图文件(B it m a p-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。
Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(d evice-d ependent b itmap,DDB)文件格式。
Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(d evice-i ndependent b itmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。
BMP位图文件默认的文件扩展名是BMP或者bmp。
6.1.2 文件结构位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它们的名称和符号如表6-01所示。
表6-01 BMP图像文件组成部分的名称和符号位图文件结构可综合在表6-02中。
表6-02 位图文件结构内容摘要6.1.3 构件详解1. 位图文件头位图文件头包含有关于文件类型、文件大小、存放位置等信息,在Windows 3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义:typedef struct tagBITMAPFILEHEADER { /* bmfh */UINT bfType;DWORD bfSize;UINT bfReserved1;UINT bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER;其中:bfType 说明文件的类型.bfSize 说明文件的大小,用字节为单位bfReserved1 保留,设置为0bfReserved2 保留,设置为0bfOffBits 说明从BITMAPFILEHEADER结构开始到实际的图像数据之间的字节偏移量2. 位图信息头位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-information header)和彩色表(color table)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。
ttf提取转bmp -回复【TTF提取转BMP】- 一步一步解析TTF (TrueType Font) 是一种常见的字体文件格式,在计算机上用于存储和显示文字。
TTF 文件包含了字体的描述信息和字符的轮廓数据。
有时,我们可能需要将TTF 文件中的字符提取出来,并转换成其他格式,如BMP (Bitmap) 文件。
本文将一步一步地回答如何进行TTF 提取转BMP 的操作,让您能够轻松应对此类需求。
第一步:了解TTF 文件的结构在开始操作之前,我们需要先了解TTF 文件的结构。
TTF 文件是由表格和数据块组成的。
其中,最重要的表格是`name`,用于存储字体名称信息;`hhea`,用于存储字体的水平度量信息;`cmap`,用于映射字符编码与字符轮廓数据的关系;`glyf`,用于存储字符轮廓数据;`head`,用于存储字体的基本信息。
通过解析这些表格,我们可以提取出所需的字符轮廓数据。
第二步:选择合适的TTF 提取工具为了提取TTF 文件中的字符轮廓数据,我们需要选择合适的工具。
一种常用的工具是FontTools,它是一个用于处理字体文件的Python 库。
使用FontTools,我们可以轻松读取TTF 文件中的表格和数据块。
第三步:使用FontTools 提取字符轮廓数据在准备好FontTools 之后,我们可以编写Python 脚本来提取字符轮廓数据。
首先,我们需要导入`ttLib` 模块,该模块包含了TTF 文件的解析和处理函数。
接下来,我们可以使用`ttLib.TTFont` 类来打开TTF 文件:pythonfrom fontTools.ttLib import TTFontttf = TTFont('font.ttf')现在,我们可以通过查找`glyf` 表格来获取字符轮廓数据。
每个字符的轮廓数据都存储在`glyf` 表格的字典中,键为字符的Unicode 编码。
我们可以遍历`glyf` 字典,提取出所需的字符轮廓数据:pythonglyf_table = ttf['glyf']for glyph_name in glyf_table.keys():if glyph_name.startswith('uni'):glyph = glyf_table[glyph_name]# 处理字符轮廓数据在处理字符轮廓数据时,我们可以选择将其保存为BMP 文件,以便后续使用。
二进制流解析文件类型1.引言1.1 概述概述部分的内容:引言部分的概述旨在介绍本文的主题和背景,提供读者对二进制流解析文件类型的基本了解。
二进制流解析文件类型是一项重要的技术,它可以帮助我们识别和处理各种文件类型,进而对文件进行有效的操作和处理。
在计算机领域中,二进制流是一种由0和1组成的数据流。
它是表示和传输数据的一种方式,被广泛应用于软件开发、数据存储和网络通信等方面。
二进制流具有高效、快速和可靠的特点,因此被广泛使用。
然而,由于二进制流的具体内容是由计算机程序生成的,我们需要一种方法来解析其实际含义和文件类型。
解析文件类型对于正确处理文件数据至关重要。
不同的文件类型可能具有不同的结构和格式,例如图像文件、音频文件、视频文件和文档文件等。
准确地解析文件类型可以帮助我们识别并正确处理这些文件。
本文将介绍二进制流的定义和特点,以及文件类型的概念和分类。
我们将探讨解析文件类型的方法和应用,重点关注如何通过解析二进制流来确定文件类型。
此外,我们还将讨论二进制流解析的重要性,以及它在实际应用中的价值。
通过本文的阅读,读者将能够了解二进制流解析文件类型的基本原理和方法,以及其在计算机领域中的重要性和实际应用。
这将有助于读者更好地理解和应用二进制流解析技术,提高文件处理和数据操作的效率和准确性。
1.2 文章结构文章结构部分的内容可以包括以下方面的描述:文章结构是指文章的整体构架和组织方式,它决定了文章的逻辑关系和表达方式。
一个良好的文章结构能够使读者更好地理解和阅读文章的内容。
在本文中,文章结构分为引言、正文和结论三个部分。
引言部分主要包括概述、文章结构和目的三个方面。
概述部分简要介绍了二进制流解析文件类型这一主题的背景和意义。
通过说明二进制流的概念和特点,引起读者对这一问题的兴趣。
文章结构部分详细阐述了本文的组织方式。
通过给出一个具体的目录,列出了文章的各个章节和小节的名称和层次结构。
这样,读者在阅读文章时可以有一个清晰的导航,能够更好地理解文章的内容和结构。
BMP审计模式介绍
王义华
【期刊名称】《中国注册会计师》
【年(卷),期】2005(000)006
【摘要】在风险导向战略系统审计的实践与理论研究中,毕马威(KPMG)会计师事务所做了许多探索。
1997年,KPMG研究小组出版了研究报告《从战略系统的视角来审计组织》,提出了一种BMP(Business Measurement Process)审计模式。
本文拟对此模式的主要思路和框架作一介绍。
【总页数】2页(P69-70)
【作者】王义华
【作者单位】深圳大学经济学院
【正文语种】中文
【中图分类】F239.1
【相关文献】
1.掀开内部审计规范化建设新的篇章——中国内部审计协会学习贯彻《审计法》座谈会内部审计准则专题介绍侧记 [J], 郭旭
2.企业集权管理模式下内部审计研究与探讨——XD集团内部审计介绍 [J], 易湘
玲
3.立足于审计实践探索企业经济效益审计——东风汽车公司开展经济效益审计的
经验介绍 [J],
4.河北省政府召开审计新闻发布会:介绍全省2000年审计情况通报有关审计结果
[J], 郝卫宁
5.在强化审计监督职能中显现特有地位和作用——全国审计机关先进集体吉水县审计局的事迹介绍 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
BMP文件结构的探索BMP文件结构的探索WhatIf 2004-9-10一、文件格式Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。
针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。
首先,整个bmp文件的内容可以分为3到4块。
之所以分为3到4块而不是固定的值,是因为,对于bmp来说可能存在调色板或者一些掩码。
具体稍候讨论。
第一块是bmp的文件头用于描述整个bmp文件的情况。
结构如下:typedef struct BITMAPFILEHEADER {WORD bfType; //两个字节DWORD bfSize; //四个字节WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER, *PBITMAPFILEHEADER;这些信息相当有用,如果你想直接来解析bmp文件。
第一个bfType用于表示文件类型,如果它是bmp文件,那么它这个位置的值一定是”BM”也就是0x4D42。
第二个bfSize表示整个文件的字节数。
第三第四个则保留,目前无意义,最后一个相当重要,表示,位图的数据信息离文件头的偏移量,以字节为单位。
第二块是位图信息头,即BITMAPINFOHEADER,用于描述整个位图文件的情况。
以下挑重要的数据进行解释typedef struct BITMAPINFOHEADER{DWORD biSize; //表示本结构的大小LONG biWidth; //位图的宽度LONG biHeight; //位图的高度WORD biPlanes; //永远为1 ,由于没有用过所以没做研究附msdn解释//Specifies the number of planes for the target device. This value must be set to 1.WORD biBitCount;//位图的位数分为1 4 8 16 24 32 本文没对1 4 进行研究DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释DWORD biSizeImage; //表示位图数据区域的大小以字节为单位LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER, *PBITMAPINFOHEADER;第三块就是调色板信息或者掩码部分,如果是8位位图则存放调色板;16 与32位位图则存放RGB颜色的掩码,这些掩码以DWORD 大小来存放。
最后一块就是位图的数据实体。
以上文件信息可以在任意一篇bmp文件结构的文章中找到描述,所以本文只是稍微带过。
二、4字节对其问题关于数据读取。
Bmp文件有个重要特性,那就是对于数据区域而言,每行的数据它必须凑满4字节,如果没有满,则用冗余的数据来补齐。
这个特性直接影响到我们读取位图数据的方法,因为在我们看来(x,y)的数据应该在 y*width+x这样的位置上但是因为会有冗余信息那么必须将width用width+该行的冗余量来处理,而由于位图文件有不同的位数,所以这样的计算也不尽相同。
下面列出计算偏移量的一般公式。
首先将位图信息读入一个UCHAR 的buffer中:8位:int pitch;if(width%4==0){pitch=width;}else{pitch=width+4-width%4;}index=buffer[y*pitch+x]; 因为8位位图的数据区域存放的是调色板索引值,所以只需读取这个index16位int pitch=width+width%2;buffer[(y*pitch+x)*2]buffer[(i*pitch+j)*2+1]两个UCHAR内,存放的是(x,y)处的颜色信息24位int pitch=width%4;buffer[(y*width+x)*3+y*pitch];buffer[(y*width+x)*3+y*pitch+1];buffer[(y*width+x)*3+y*pitch+2];32位由于一个象素就是4字节所以无需补齐虽然计算比较繁琐,但是这些计算是必须的,否则当你的位图每行的象素数不是4的倍数,那么y*width+x带给你的是一个扭曲的图片,当然如果你想做这样的旋转,也不错啊,至少我因为一开始没有考虑(不知道这个特性)让一个每行象素少1字节的16位图片变成了扭曲的菱形。
三、有了数据分离RGB分量。
由于我的测试代码用了GDI,所以我必须讲得到的某一个点的值分离成 24位模式下的RGB分离,这不是一件容易的工作。
位图麻烦的地方之一就是他的格式太多,所以我们还是要分格式再讨论。
8位通过第二部分提到的操作我们得到了一个index,这个值的范围是0~255 一共256个正好是调色板的颜色数量。
在8位bmp图片中数据信息前256个RGBQUAD的大小开始就是调色板的信息。
不过如果要组织成调色板还要一定的转换因为里面是RGBQUAD信息 r b 两个与调色板中的顺序是颠倒的。
因为我不需要调色板设置所以我字节读取到RGBQUAD数组中,并且通过下面的表达式获取RGB值:UCHAR r=quad[index].rgbRed;UCHAR g=quad[index].rgbGreen;UCHAR b=quad[index].rgbBlue;16位这是最麻烦的一个。
因为在处理时有555 565 两种格式的区别,而且还有所谓压缩类型的区别。
之前的bitmapinfoheader里面提到一个biCompression现在我们分两种情况讨论:BI_RGB和BI_BITFIELDS当他等于BI_RGB时只有555 这种格式,所以可以放心大胆的进行如下的数据分离:UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch +j)*2]>>5);UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;希望不要被这个表达式折磨的眼花缭乱,我想既然你在看这篇文章,你就有能力阅读这样的代码,否则只能说你还没有到阅读这方面的地步,需要去学习基础的语法了。
有一点值得提醒的是由于有较多的位操作,所以在处理的时候在前一次操作的上面加上一对括号,我就曾经因为没有加而导致出现误差,另外虽然buffer中一个元素代表的是一个UCHAR 但是右移操作会自动增长为两字节所以需要在进行一次与操作截取低位的1字节数据。
现在讨论BI_BITFIELDS。
这个模式下既可以有555 也可以有565 。
555 格式 x rrrrr ggggg bbbbb565 格式rrrrr gggggg bbbbb显然不同的格式处理不同,所以我们要首先判断处到底属于那种格式。
Bitmapinfoheader的biCompression为BI_BITFIELDS时,在位图数据区域前存在一个RGB掩码的描述是3个DWORD值,我们只需要读取其中的R或者G的掩码,来判断是那种格式。
以红色掩码为例 0111110000000000的时候就是555格式1111100000000000就是565格式。
以下是565格式时的数据分离:UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch+j)*2]>>5);UCHAR r=buffer[(i*pitch+j)*2+1]>>3;现在我们得到了RGB各自的分量,但是还有一个新的问题,那就是由于两字节表示了3个颜色 555下每个颜色最多到0x1F 565格式下最大的绿色分量也就0x3F。
所以我们需要一个转换color=color*255/最大颜色数即可如565下RGB(r*0xFF/0x1F,g*0xFF/0x3F,b*0xFF/0x1F)24位UCHAR b=buffer[(i*width+j)*3+realPitch];UCHAR g=buffer[(i*width+j)*3+1+realPitch];UCHAR r=buffer[(i*width+j)*3+2+realPitch];32位UCHAR b=buffer[(i*width+j)*4];UCHAR g=buffer[(i*width+j)*4+1];UCHAR r=buffer[(i*width+j)*4+2];四、剩余的问题当数据取到了,颜色也分离出来了,但是可能你绘出的位图是倒转的,这是因为有些位图的确是翻转的。
通过bitmapinfoheader的biHeight可以判断是正常还是翻转,当biHeight>0的时候颠倒,它小于0的时候正常,不过测试写到现在看到的文件都是颠倒过来的。
五、相关测试代码:(9798.0*r+19235*g+3735*b)/32768.0+0.5采用MFC 目的只是实现自行解析位图文件void CBmpTestView::OnDraw(CDC* pDC){CBmpTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: 在此处为本机数据添加绘制代码if(filename==""){return;}FILE *fp=fopen(filename,"r");if(fp==NULL){pDC->TextOut(100,200,"no file found");return;}BITMAPFILEHEADER fileheader;BITMAPINFO info;fread(&fileheader,sizeof(fileheader),1,fp);if(fileheader.bfType!=0x4D42){pDC->TextOut(100,200,"无位图文件请选择位图文件");fclose(fp);return ;}fread(&info.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp); long width=info.bmiHeader.biWidth;long height=info.bmiHeader.biHeight;UCHAR *buffer=new UCHAR[info.bmiHeader.biSizeImage]; fseek(fp,fileheader.bfOffBits,0);fread(buffer,info.bmiHeader.biSizeImage,1,fp);if(info.bmiHeader.biBitCount==8){int pitch;if(width%4==0){pitch=width;}else{pitch=width+4-width%4;}RGBQUAD quad[256];fseek(fp,fileheader.bfOffBits-sizeof(RGBQUAD)*256,0);fread(quad,sizeof(RGBQUAD)*256,1,fp);if(height>0){//height>0 表示图片颠倒for(int i=0;i<height;i++){for(int j=0;j<width;j++){int index=buffer[i*pitch+j];UCHAR r=quad[index].rgbRed;UCHAR g=quad[index].rgbGreen;UCHAR b=quad[index].rgbBlue;pDC->SetPixel(j,height-i,RGB(r,g,b));}}}else{for(int i=0;i<0-height;i++){for(int j=0;j<width;j++){int index=buffer[i*pitch+j];UCHAR r=quad[index].rgbRed;UCHAR g=quad[index].rgbGreen;UCHAR b=quad[index].rgbBlue;pDC->SetPixel(j,i,RGB(r,g,b));}}}}else if(info.bmiHeader.biBitCount==16){int pitch=width+width%2;if(height>0){//height>0 表示图片颠倒if(info.bmiHeader.biCompression==BI_RGB){//该模式只有555for(int i=0;i<height;i++){for(int j=0;j<width;j++){//5 5 5 格式UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch +j)*2]>>5);UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;pDC->SetPixel(j,height-i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F ,(b*0xFF)/0x1F));}}}elseif(info.bmiHeader.biCompression==BI_BITFIELDS){//该模式在bitmapinfoheader之后存在RGB掩码每个掩码1 DWORDfseek(fp,fileheader.bfOffBits-sizeof(DWORD )*3,0);DWORD rMask;fread(&rMask,sizeof(DWORD ),1,fp);if(rMask==0x7C00){// 5 5 5 格式MessageBeep(0);for(int i=0;i<height;i++){for(int j=0;j<width;j++){UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch +j)*2]>>5);UCHARr=(buffer[(i*pitch+j)*2+1]<<1)>>3;pDC->SetPixel(j,height-i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F ,(b*0xFF)/0x1F));}}}else if(rMask==0xF800){//5 6 5 格式for(int i=0;i<height;i++){for(int j=0;j<width;j++){UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch +j)*2]>>5);UCHAR r=buffer[(i*pitch+j)*2+1]>>3;pDC->SetPixel(j,height-i,RGB(r*0xFF/0x1F,g*0xFF/0x3F,b*0 xFF/0x1F));}}}}}else{if(info.bmiHeader.biCompression==BI_RGB){//该模式只有555for(int i=0;i<0-height;i++){for(int j=0;j<width;j++){//5 5 5 格式UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch +j)*2]>>5);UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;pDC->SetPixel(j,i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F,(b*0xF F)/0x1F));}}}elseif(info.bmiHeader.biCompression==BI_BITFIELDS){//该模式在bitmapinfoheader之后存在RGB掩码每个掩码1 DWORDfseek(fp,fileheader.bfOffBits-sizeof(DWORD )*3,0);DWORD rMask;fread(&rMask,sizeof(DWORD ),1,fp);if(rMask==0x7C00){// 5 5 5 格式MessageBeep(0);for(int i=0;i<0-height;i++){for(int j=0;j<width;j++){UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch +j)*2]>>5);UCHARr=(buffer[(i*pitch+j)*2+1]<<1)>>3;pDC->SetPixel(j,i,RGB((r*0xFF)/0x1F,(g*0xFF)/0x1F,(b*0xF F)/0x1F));}}}else if(rMask==0xF800){//5 6 5 格式for(int i=0;i<0-height;i++){for(int j=0;j<width;j++){UCHAR b=buffer[(i*pitch+j)*2]&0x1F;UCHARg=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch +j)*2]>>5);UCHAR r=buffer[(i*pitch+j)*2+1]>>3;pDC->SetPixel(j,i,RGB(r*0xFF/0x1F,g*0xFF/0x3F,b*0xFF/0x1F));}}}}}//pDC->TextOut(100,200,"16位图");}else if(info.bmiHeader.biBitCount==24){int pitch=width%4;//b g rif(height>0){//height>0 表示图片颠倒for(int i=0;i<height;i++){int realPitch=i*pitch;for(int j=0;j<width;j++){UCHAR b=buffer[(i*width+j)*3+realPitch];UCHAR g=buffer[(i*width+j)*3+1+realPitch];UCHAR r=buffer[(i*width+j)*3+2+realPitch];pDC->SetPixel(j,height-i,RGB(r,g,b));}}}else{for(int i=0;i<0-height;i++){int realPitch=i*pitch;for(int j=0;j<width;j++){UCHAR b=buffer[(i*width+j)*3+realPitch];UCHAR g=buffer[(i*width+j)*3+1+realPitch];UCHAR r=buffer[(i*width+j)*3+2+realPitch];pDC->SetPixel(j,i,RGB(r,g,b));}}}//pDC->TextOut(100,200,"24位图");}else if(info.bmiHeader.biBitCount==32){// b g r aif(height>0){//height>0 表示图片颠倒for(int i=0;i<0-height;i++){for(int j=0;j<width;j++){UCHAR b=buffer[(i*width+j)*4];UCHAR g=buffer[(i*width+j)*4+1];UCHAR r=buffer[(i*width+j)*4+2];pDC->SetPixel(j,height-i,RGB(r,g,b));}}}else{for(int i=0;i<height;i++){for(int j=0;j<width;j++){UCHAR b=buffer[(i*width+j)*4];UCHAR g=buffer[(i*width+j)*4+1];UCHAR r=buffer[(i*width+j)*4+2];pDC->SetPixel(j,i,RGB(r,g,b));}}}//pDC->TextOut(100,200,"32位图");}delete buffer;fclose(fp);}。