1
usingSystem;
2
usingJJBase.FILE;
3
namespaceJJBase.Image
4

{
5
/**////<summary>
6
///BMP的摘要说明。
7
///</summary>
8
publicclassBMP
9

{
10
11
publicBMP()
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
**/
35
publicstructStructBMP
36

{
37
publicBMPHeaderHeader;
38
publicBMPPalettePalette;
39
publicBMPDataData;
40
}
41
publicstructBMPHeader
42

{
43
/**//*位图文件可看成由4个部分组成:位图文件头(BitMap-fileheader)、
44
*位图信息头(BitMap-informationheader)、彩色表(colortable)和
45
*定义位图的字节阵列,
46
**/
47
publicstringIdentifier;/**//*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
*/
56
publicSystem.Int32FileSize;//1dword,用字节表示的整个文件的大小
57
publicbyte[]Reserved;//1dword,保留,必须设置为0
58
publicSystem.Int32BitMapDataOffset;//1dword,从文件开始到位图数据开始之间的数据(BitMapdata)之间的偏移量
59
publicSystem.Int32BitMapHeaderSize;/**//*1dword
60
位图信息头(BitMapInfoHeader)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
61
28h-windows3.1x,95,nt,…
62
0ch-os/21.x
63
f0h-os/22.x
64
注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
65
*/
66
publicSystem.Int32Width;//1dword,位图的宽度,以象素为单位
67
publicSystem.Int32Height;//1dword,位图的高度,以象素为单位
68
publicSystem.Int16Planes;//1word,位图的位面数(注:该值将总是1)
69
publicSystem.Int16BitsPerPixel;
70
/**//*1word
71
每个象素的位数
72
1-单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
73
4-16色位图
74
8-256色位图
75
16-16bit高彩色位图
76
24-24bit真彩色位图
77
32-32bit增强型真彩色位图
78
*/
79
publicSystem.Int32Compression;
80
/**//*1dword
81
压缩说明:
82
0-不压缩(使用BI_RGB表示)
83
1-RLE8-使用8位RLE压缩方式(用BI_RLE8表示)
84
2-RLE4-使用4位RLE压缩方式(用BI_RLE4表示)
85
3-Bitfields-位域存放方式(用BI_BITFIELDS表示)
86
*/
87
publicSystem.Int32BitMapDataSize;//1dword,用字节数表示的位图数据的大小。该数必须是4的倍数
88
publicSystem.Int32HResolution;//1dword,用象素/米表示的水平分辨率
89
publicSystem.Int32VResolution;//1dword,用象素/米表示的垂直分辨率
90
publicSystem.Int32Colors;//1dword,位图使用的颜色数。如8-比特/象素表示为100h或者256.
91
publicSystem.Int32ImportantColors;
92
/**//*1dword,指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
93
*/
94
}
95
publicstructBMPPalette
96

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

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

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

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

{
211
b[j]=bytesFile[i];j++;
212
}
213
sbmp.Palette.Palette=b;
214
}
215
publicvoidProcessBMP(refStructBMPsbmp,stringFile)
216

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

{
224
System.Int32result=0;
225
System.Int32t=0;
226
for(inti=b.Length-1;i>=0;i--)
227

{
228
229
if((int)b[i]!=0)
230

{
231
t=(int)Math.Pow(256,i);
232
result+=(int)b[i]*t;
233
}
234
235
}
236
returnresult;
237
}
238
privatestringFromBytesToString(byte[]b)
239

{
240
stringresult="";
241
for(inti=0;i<b.Length;i++)
242

{
243
result+=Convert.ToChar((int)(b[i])).ToString();
244
}
245
returnresult;
246
}
247
248
}
249
}
分享到:
相关推荐
本资源包提供了一种方法,通过C#代码来读取BMP文件,这在进行图形处理、图像分析或者游戏开发等场景下非常有用。尽管代码可能注释较少,但其设计简单易懂,具有高度的实用性。 BMP文件格式是一种未经压缩的图像文件...
在本文中,我们将深入探讨如何使用C# WinForms来实现与AutoCAD dwg/dxf文件的交互,包括打开、浏览、导出点位坐标、线型信息以及进行图形元素分析的功能。这一技术对于进行CAD软件的二次开发尤其重要,能够帮助...
Bitmap和Graphics类则分别代表了位图对象和图形上下文,是Image类的具体实现。在进行格式转换时,我们可以使用Bitmap的Save方法,通过指定不同的编码器来改变输出格式。 下面是一个简单的C#代码示例,展示了如何将...
在C#编程语言中,图形处理是一门重要的技术,它涉及到图像的创建、修改、分析以及显示等操作。本资源库包含的"C# 图形处理大全源码(共60多种算法)"提供了丰富的示例代码,可以帮助开发者深入理解并实践图形处理的...
在C#环境中,可以使用.NET Framework提供的System.Drawing命名空间中的类来实现这个转换过程。例如,可以创建Bitmap对象,然后通过LockBits和Marshal.Copy方法直接操作像素数据。参考链接中的博客文章...
6. **图形保存**:使用`Save`方法将当前的棋盘状态保存为图片文件,如BMP、JPEG或PNG格式。 7. **界面交互**:提供按钮或菜单选项,允许用户保存当前棋盘、重新开始游戏等。 8. **异常处理**:加入适当的错误处理...
在IT行业中,图像处理是一项非常重要的任务,尤其是在游戏开发、图像分析、图形用户界面等领域。在.NET Framework中,System.Drawing命名空间提供了丰富的类用于处理图像,如Image、Graphics等,但默认并不支持所有...
Image类是所有图像对象的基类,它支持常见的图像格式如JPEG、PNG、BMP等。我们可以使用Image.FromFile或Image.FromStream方法加载图像,然后通过Graphics对象的DrawImage方法将其绘制到窗体或控件上。此外,Image类...
在计算机图形学中,BMP(Bitmap)是一种常见的位图图像格式,用于存储像素数据。当我们说“获取BMP的RGB值”时,实际上是指读取BMP文件中每个像素的红、绿、蓝三种颜色分量的数值,因为RGB(Red, Green, Blue)是...
在压缩包中的"40564353ppm2bmp_source"可能是源代码文件,包含了实现上述转换功能的函数或类。通过分析这个源代码,你可以更具体地了解转换过程的实现细节,例如如何处理不同颜色深度的图像,以及在内存中如何组织和...
位图(Bitmap)是计算机图形学中常用的一种图像文件格式,尤其在Windows操作系统中广泛使用。位图由像素数组组成,每个像素都有自己的颜色值,这些颜色值组合起来形成了我们看到的图像。位图文件通常包含图像数据、...
C#语言提供了丰富的类库,如System.Drawing命名空间,它包含了Bitmap、Graphics和Font等类,可以用来处理这些任务。 描述中提到的"网上这方面的资料少的可怜",暗示了字符字模提取可能是一个相对小众但重要的技术,...
在C#编程环境中,图形图像处理是一个非常重要的领域,它涉及到游戏开发、用户界面设计、数据分析可视化等多个方面。本资源“C#图形图像编程最好的参考例子”提供了丰富的实例,帮助开发者深入理解和应用C#中的图形...
本话题主要涉及的是将BMP(Bitmap)格式的图像文件转换为JPG(Joint Photographic Experts Group)格式的源代码。BMP是一种无损的位图格式,它存储了图像的每个像素的颜色信息,而JPG则是一种有损压缩格式,常用于...
这些操作在图形用户界面(GUI)应用、游戏开发、图像分析和许多其他领域都有广泛的应用。以下将详细讲解如何在C#中实现这些功能。 首先,我们来探讨图像的平移。平移是指图像在二维空间中的移动,可以改变图像的...
项目中的`Three_Times_spline_Interpolation`文件可能包含了实现上述功能的源代码,包括数据结构定义、插值算法实现、图形绘制类以及主程序入口。通过阅读和理解这些代码,你可以学习到如何在C#环境中进行数值计算和...
对于初学者来说,通过阅读和分析这个文件,可以学习到如何在C#中实现图形用户界面、处理用户输入、图形绘制以及文件操作等知识。 总结一下,这个"C#电子签名功能"项目涉及了以下知识点: 1. C#编程基础:语法、变量...
在C#中,我们可以使用文件系统相关的类,如Directory和FileInfo,来遍历指定目录下的所有图像文件,并对每个文件执行格式转换操作。 批量图像格式转换的核心在于Image类,它位于System.Drawing命名空间下。Image类...
接下来,使用OpenCV的`imwrite`函数将`Mat`对象保存为BMP文件。这个过程涉及位深度的调整,因为RAW格式可能包含比BMP更多的颜色信息。根据需要,可能需要进行色彩校正和白平衡调整。 在GUI设计方面,可以添加一个...
2. **图形编程**: C#中的`System.Drawing`命名空间提供了进行图形绘制的类和方法。`Graphics`类是核心,它提供了绘制线条、曲线、形状和文本的能力。 3. **Bitmap**: `Bitmap`类代表了一个图像,它可以是位图或GIF...