`
957803796_1
  • 浏览: 127044 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

BMP图形文件分析类(c#)

 
阅读更多

1usingSystem;
2usingJJBase.FILE;
3namespaceJJBase.Image
4{
5/**////<summary>
6///BMP的摘要说明。
7///</summary>

8publicclassBMP
9{
10
11publicBMP()
12{
13//
14//TODO:在此处添加构造函数逻辑
15//作者:梁俊杰
16//时间:2005-9-29
17//功能:分析bmp文件格式
18//本文参考了林福宗老师的有关BMP文件格式的文章
19//参考链接:http://www.chinahacker.net/article/showarticle.asp?articleid=20809
20//参考链接:http://www.moon-soft.com/program/FORMAT/graphics/Bmp.html
21//
22}

23/**//*BMP(BitMap-File)图形文件是Windows采用的图形文件格式,在Windows环境
24*下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各
25*图像绘制操作都是以BMP为基础的。Windows3.0以前的BMP图文件格式与
26*显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB
27*(device-dependentBitMap)文件格式。Windows3.0以后的BMP图象文件与
28*显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB
29*(device-independentBitMap)格式(注:Windows3.0以后,在系统中仍
30*然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将
31*图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的
32*是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件
33*默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
34**/

35publicstructStructBMP
36{
37publicBMPHeaderHeader;
38publicBMPPalettePalette;
39publicBMPDataData;
40}

41publicstructBMPHeader
42{
43/**//*位图文件可看成由4个部分组成:位图文件头(BitMap-fileheader)、
44*位图信息头(BitMap-informationheader)、彩色表(colortable)和
45*定义位图的字节阵列,
46**/

47publicstringIdentifier;/**//*2bytes,识别位图的类型:
48‘BM’:Windows3.1x,95,NT,…
49‘BA’:OS/2BitMapArray
50‘CI’:OS/2ColorIcon
51‘CP’:OS/2ColorPointer
52‘IC’:OS/2Icon
53‘PT’:OS/2Pointer
54注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。
55*/

56publicSystem.Int32FileSize;//1dword,用字节表示的整个文件的大小
57publicbyte[]Reserved;//1dword,保留,必须设置为0
58publicSystem.Int32BitMapDataOffset;//1dword,从文件开始到位图数据开始之间的数据(BitMapdata)之间的偏移量
59publicSystem.Int32BitMapHeaderSize;/**//*1dword
60位图信息头(BitMapInfoHeader)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
6128h-windows3.1x,95,nt,…
620ch-os/21.x
63f0h-os/22.x
64注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
65*/

66publicSystem.Int32Width;//1dword,位图的宽度,以象素为单位
67publicSystem.Int32Height;//1dword,位图的高度,以象素为单位
68publicSystem.Int16Planes;//1word,位图的位面数(注:该值将总是1)
69publicSystem.Int16BitsPerPixel;
70/**//*1word
71每个象素的位数
721-单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
734-16色位图
748-256色位图
7516-16bit高彩色位图
7624-24bit真彩色位图
7732-32bit增强型真彩色位图
78*/

79publicSystem.Int32Compression;
80/**//*1dword
81压缩说明:
820-不压缩(使用BI_RGB表示)
831-RLE8-使用8位RLE压缩方式(用BI_RLE8表示)
842-RLE4-使用4位RLE压缩方式(用BI_RLE4表示)
853-Bitfields-位域存放方式(用BI_BITFIELDS表示)
86*/

87publicSystem.Int32BitMapDataSize;//1dword,用字节数表示的位图数据的大小。该数必须是4的倍数
88publicSystem.Int32HResolution;//1dword,用象素/米表示的水平分辨率
89publicSystem.Int32VResolution;//1dword,用象素/米表示的垂直分辨率
90publicSystem.Int32Colors;//1dword,位图使用的颜色数。如8-比特/象素表示为100h或者256.
91publicSystem.Int32ImportantColors;
92/**//*1dword,指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
93*/

94}

95publicstructBMPPalette
96{
97publicbyte[]Palette;//newbyte[8192];//bmp规范没有规定调色板最大81926字节,此处可以根据程序需要调节
98/**//*调色板数据根据BMP版本的不同而不同PaletteN*4byte调色板规范。
99对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:1字节用于蓝色分量
1001字节用于绿色分量
1011字节用于红色分量
1021字节用于填充符(设置为0)
103*/

104}

105publicstructBMPData
106{
107publicbyte[]BitMapData;//=newbyte[1024000];//bmp规范没有规定bmp数据最多为1024000,此处可以根据需要调整
108/**//*
109图象数据根据BMP版本及调色板尺寸的不同而不同BitMapDataxxxbytes该域的大小取决
110于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是
111彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。
112*/

113}

114publicvoidProcessBMP(refStructBMPsbmp,byte[]bytesFile)
115{
116byte[]word1=newbyte[2];
117byte[]word2=newbyte[4];
118System.Int32result;
119stringstr="";
120word1[0]=bytesFile[0];
121word1[1]=bytesFile[1];
122str=FromBytesToString(word1);
123sbmp.Header.Identifier=str;
124word2[0]=bytesFile[2];
125word2[1]=bytesFile[3];
126word2[2]=bytesFile[4];
127word2[3]=bytesFile[5];
128result=this.FromBytesToInt32(word2);
129sbmp.Header.FileSize=result;
130word2[0]=bytesFile[10];
131word2[1]=bytesFile[11];
132word2[2]=bytesFile[12];
133word2[3]=bytesFile[13];
134result=this.FromBytesToInt32(word2);
135sbmp.Header.BitMapDataOffset=result;
136word2[0]=bytesFile[14];
137word2[1]=bytesFile[15];
138word2[2]=bytesFile[16];
139word2[3]=bytesFile[17];
140result=this.FromBytesToInt32(word2);
141sbmp.Header.BitMapHeaderSize=result;
142word2[0]=bytesFile[18];
143word2[1]=bytesFile[19];
144word2[2]=bytesFile[20];
145word2[3]=bytesFile[21];
146sbmp.Header.Width=result;
147word2[0]=bytesFile[22];
148word2[1]=bytesFile[23];
149word2[2]=bytesFile[24];
150word2[3]=bytesFile[25];
151result=this.FromBytesToInt32(word2);
152sbmp.Header.Height=result;
153word1[0]=bytesFile[26];
154word1[1]=bytesFile[27];
155sbmp.Header.Planes=(System.Int16)FromBytesToInt32(word1);
156word1[0]=bytesFile[28];
157word1[1]=bytesFile[29];
158sbmp.Header.BitsPerPixel=(System.Int16)FromBytesToInt32(word1);
159word2[0]=bytesFile[30];
160word2[1]=bytesFile[31];
161word2[2]=bytesFile[32];
162word2[3]=bytesFile[33];
163result=this.FromBytesToInt32(word2);
164sbmp.Header.Compression=result;
165word2[0]=bytesFile[34];
166word2[1]=bytesFile[35];
167word2[2]=bytesFile[36];
168word2[3]=bytesFile[37];
169result=this.FromBytesToInt32(word2);
170sbmp.Header.BitMapDataSize=result;
171word2[0]=bytesFile[38];
172word2[1]=bytesFile[39];
173word2[2]=bytesFile[40];
174word2[3]=bytesFile[41];
175result=this.FromBytesToInt32(word2);
176sbmp.Header.HResolution=result;
177word2[0]=bytesFile[42];
178word2[1]=bytesFile[43];
179word2[2]=bytesFile[44];
180word2[3]=bytesFile[45];
181result=this.FromBytesToInt32(word2);
182sbmp.Header.VResolution=result;
183word2[0]=bytesFile[46];
184word2[1]=bytesFile[47];
185word2[2]=bytesFile[48];
186word2[3]=bytesFile[49];
187result=this.FromBytesToInt32(word2);
188sbmp.Header.Colors=result;
189word2[0]=bytesFile[50];
190word2[1]=bytesFile[51];
191word2[2]=bytesFile[52];
192word2[3]=bytesFile[53];
193result=this.FromBytesToInt32(word2);
194sbmp.Header.ImportantColors=result;
195//计算位图数据的开始位置
196//sbmp.Header.BitMapDataSize是位图数据的大小,sbmp.Header.FileSize是整个文件的大小
197//sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-1就是位图数据的开始位置
198//0x36到sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-2就是调色板数据
199result=sbmp.Header.FileSize-sbmp.Header.BitMapDataSize;
200intj=0;
201byte[]b=newbyte[sbmp.Header.BitMapDataSize];
202for(inti=result;i<sbmp.Header.FileSize;i++)
203{
204b[j]=bytesFile[i];j++;
205}

206sbmp.Data.BitMapData=b;
207j=0;
208b=newbyte[result-sbmp.Header.BitMapDataOffset];
209for(inti=sbmp.Header.BitMapDataOffset;i<result;i++)
210{
211b[j]=bytesFile[i];j++;
212}

213sbmp.Palette.Palette=b;
214}

215publicvoidProcessBMP(refStructBMPsbmp,stringFile)
216{
217//先读取文件成字节数组,统一由ProcessBMP(StructBMPsbmp,byte[]bytesFile)处理
218JJBase.FILE.ReadAndWritef=newReadAndWrite();
219byte[]result=f.ReadBytesFromFile(File);
220ProcessBMP(refsbmp,result);
221}

222privateSystem.Int32FromBytesToInt32(byte[]b)
223{
224System.Int32result=0;
225System.Int32t=0;
226for(inti=b.Length-1;i>=0;i--)
227{
228
229if((int)b[i]!=0)
230{
231t=(int)Math.Pow(256,i);
232result+=(int)b[i]*t;
233}

234
235}

236returnresult;
237}

238privatestringFromBytesToString(byte[]b)
239{
240stringresult="";
241for(inti=0;i<b.Length;i++)
242{
243result+=Convert.ToChar((int)(b[i])).ToString();
244}

245returnresult;
246}

247
248}

249}

分享到:
评论

相关推荐

    c#编写的bmp文件的读取资料

    本资源包提供了一种方法,通过C#代码来读取BMP文件,这在进行图形处理、图像分析或者游戏开发等场景下非常有用。尽管代码可能注释较少,但其设计简单易懂,具有高度的实用性。 BMP文件格式是一种未经压缩的图像文件...

    C#winfrm-打开AutoCAD dwg/dxf文件并导出点位坐标及线型信息。

    在本文中,我们将深入探讨如何使用C# WinForms来实现与AutoCAD dwg/dxf文件的交互,包括打开、浏览、导出点位坐标、线型信息以及进行图形元素分析的功能。这一技术对于进行CAD软件的二次开发尤其重要,能够帮助...

    BatchChange_C#_bmp转换png_shownv1g_

    Bitmap和Graphics类则分别代表了位图对象和图形上下文,是Image类的具体实现。在进行格式转换时,我们可以使用Bitmap的Save方法,通过指定不同的编码器来改变输出格式。 下面是一个简单的C#代码示例,展示了如何将...

    C# 图形处理大全源码(共60多种算法).rar

    在C#编程语言中,图形处理是一门重要的技术,它涉及到图像的创建、修改、分析以及显示等操作。本资源库包含的"C# 图形处理大全源码(共60多种算法)"提供了丰富的示例代码,可以帮助开发者深入理解并实践图形处理的...

    YUV420转BMP

    在C#环境中,可以使用.NET Framework提供的System.Drawing命名空间中的类来实现这个转换过程。例如,可以创建Bitmap对象,然后通过LockBits和Marshal.Copy方法直接操作像素数据。参考链接中的博客文章...

    棋盘覆盖C# (图形保存)

    6. **图形保存**:使用`Save`方法将当前的棋盘状态保存为图片文件,如BMP、JPEG或PNG格式。 7. **界面交互**:提供按钮或菜单选项,允许用户保存当前棋盘、重新开始游戏等。 8. **异常处理**:加入适当的错误处理...

    c# PGM图片处理 (将PGM格式转换为Bmp格式)

    在IT行业中,图像处理是一项非常重要的任务,尤其是在游戏开发、图像分析、图形用户界面等领域。在.NET Framework中,System.Drawing命名空间提供了丰富的类用于处理图像,如Image、Graphics等,但默认并不支持所有...

    c#图形图像编程资料

    Image类是所有图像对象的基类,它支持常见的图像格式如JPEG、PNG、BMP等。我们可以使用Image.FromFile或Image.FromStream方法加载图像,然后通过Graphics对象的DrawImage方法将其绘制到窗体或控件上。此外,Image类...

    获取BMP的RGB值

    在计算机图形学中,BMP(Bitmap)是一种常见的位图图像格式,用于存储像素数据。当我们说“获取BMP的RGB值”时,实际上是指读取BMP文件中每个像素的红、绿、蓝三种颜色分量的数值,因为RGB(Red, Green, Blue)是...

    ppm图片格式转换为bmp

    在压缩包中的"40564353ppm2bmp_source"可能是源代码文件,包含了实现上述转换功能的函数或类。通过分析这个源代码,你可以更具体地了解转换过程的实现细节,例如如何处理不同颜色深度的图像,以及在内存中如何组织和...

    位图与调色板源代码bmp_in_mdiclient2.zip_BMP 调色板_C#调色_c# 调色板_in_调色板

    位图(Bitmap)是计算机图形学中常用的一种图像文件格式,尤其在Windows操作系统中广泛使用。位图由像素数组组成,每个像素都有自己的颜色值,这些颜色值组合起来形成了我们看到的图像。位图文件通常包含图像数据、...

    C#实现字符字模提取(内含程序截图)

    C#语言提供了丰富的类库,如System.Drawing命名空间,它包含了Bitmap、Graphics和Font等类,可以用来处理这些任务。 描述中提到的"网上这方面的资料少的可怜",暗示了字符字模提取可能是一个相对小众但重要的技术,...

    C#图形图像编程最好的参考例子

    在C#编程环境中,图形图像处理是一个非常重要的领域,它涉及到游戏开发、用户界面设计、数据分析可视化等多个方面。本资源“C#图形图像编程最好的参考例子”提供了丰富的实例,帮助开发者深入理解和应用C#中的图形...

    BMP文件转换为JPG文件的源代码(356KB)

    本话题主要涉及的是将BMP(Bitmap)格式的图像文件转换为JPG(Joint Photographic Experts Group)格式的源代码。BMP是一种无损的位图格式,它存储了图像的每个像素的颜色信息,而JPG则是一种有损压缩格式,常用于...

    C#实现图像平移、镜像、缩放及任意角度的旋转

    这些操作在图形用户界面(GUI)应用、游戏开发、图像分析和许多其他领域都有广泛的应用。以下将详细讲解如何在C#中实现这些功能。 首先,我们来探讨图像的平移。平移是指图像在二维空间中的移动,可以改变图像的...

    三次样条插值C#实现及函数绘图

    项目中的`Three_Times_spline_Interpolation`文件可能包含了实现上述功能的源代码,包括数据结构定义、插值算法实现、图形绘制类以及主程序入口。通过阅读和理解这些代码,你可以学习到如何在C#环境中进行数值计算和...

    C#电子签名功能

    对于初学者来说,通过阅读和分析这个文件,可以学习到如何在C#中实现图形用户界面、处理用户输入、图形绘制以及文件操作等知识。 总结一下,这个"C#电子签名功能"项目涉及了以下知识点: 1. C#编程基础:语法、变量...

    C#批量图像格式转换

    在C#中,我们可以使用文件系统相关的类,如Directory和FileInfo,来遍历指定目录下的所有图像文件,并对每个文件执行格式转换操作。 批量图像格式转换的核心在于Image类,它位于System.Drawing命名空间下。Image类...

    RAW 转 BMP 图像小程序(VS2015+Qt5.8+OpenCV)

    接下来,使用OpenCV的`imwrite`函数将`Mat`对象保存为BMP文件。这个过程涉及位深度的调整,因为RAW格式可能包含比BMP更多的颜色信息。根据需要,可能需要进行色彩校正和白平衡调整。 在GUI设计方面,可以添加一个...

    C#winform画图程序(附解决方案,挺不错的)

    2. **图形编程**: C#中的`System.Drawing`命名空间提供了进行图形绘制的类和方法。`Graphics`类是核心,它提供了绘制线条、曲线、形状和文本的能力。 3. **Bitmap**: `Bitmap`类代表了一个图像,它可以是位图或GIF...

Global site tag (gtag.js) - Google Analytics