代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
CSharp
】
BMP图形文件分析类
作者:
dezai
/ 发布于
2014/7/8
/
797
using System; using JJBase.FILE; namespace JJBase.Image { /// <summary> /// BMP 的摘要说明。 /// </summary> public class BMP { public BMP() { // //TODO: 在此处添加构造函数逻辑 //作者:梁俊杰 //时间:2005-9-29 //功能:分析bmp文件格式 //本文参考了林福宗老师的有关BMP文件格式的文章 //参考链接:http://www.chinahacker.net/article/showarticle.asp?articleid=20809 //参考链接:http://www.moon-soft.com/program/FORMAT/graphics/Bmp.html // } /*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作扩展名)。 * */ public struct StructBMP { public BMPHeader Header; public BMPPalette Palette; public BMPData Data; } public struct BMPHeader { /*位图文件可看成由4个部分组成:位图文件头(BitMap-file header)、 * 位图信息头(BitMap-information header)、彩色表(color table)和 * 定义位图的字节阵列, * */ public string Identifier;/*2 bytes,识别位图的类型: ‘BM’ : Windows 3.1x, 95, NT, … ‘BA’ :OS/2 BitMap Array ‘CI’ :OS/2 Color Icon ‘CP’ :OS/2 Color Pointer ‘IC’ : OS/2 Icon ‘PT’ :OS/2 Pointer 注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。 */ public System.Int32 FileSize;//1 dword,用字节表示的整个文件的大小 public byte[] Reserved;//1 dword,保留,必须设置为0 public System.Int32 BitMapDataOffset;//1 dword,从文件开始到位图数据开始之间的数据(BitMap data)之间的偏移量 public System.Int32 BitMapHeaderSize;/*1 dword 位图信息头(BitMap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示: 28h - windows 3.1x, 95, nt, … 0ch - os/2 1.x f0h - os/2 2.x 注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。 */ public System.Int32 Width;//1 dword,位图的宽度,以象素为单位 public System.Int32 Height;//1 dword,位图的高度,以象素为单位 public System.Int16 Planes;//1 word,位图的位面数(注:该值将总是1) public System.Int16 BitsPerPixel; /*1 word 每个象素的位数 1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色) 4 - 16 色位图 8 - 256 色位图 16 - 16bit 高彩色位图 24 - 24bit 真彩色位图 32 - 32bit 增强型真彩色位图 */ public System.Int32 Compression; /*1 dword 压缩说明: 0 - 不压缩 (使用BI_RGB表示) 1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示) 2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示) 3 - Bitfields-位域存放方式(用BI_BITFIELDS表示) */ public System.Int32 BitMapDataSize;//1 dword,用字节数表示的位图数据的大小。该数必须是4的倍数 public System.Int32 HResolution;//1 dword,用象素/米表示的水平分辨率 public System.Int32 VResolution;//1 dword,用象素/米表示的垂直分辨率 public System.Int32 Colors;//1 dword,位图使用的颜色数。如8-比特/象素表示为100h或者 256. public System.Int32 ImportantColors; /*1 dword,指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要 */ } public struct BMPPalette { public byte[] Palette;//new byte[8192];//bmp规范没有规定调色板最大81926字节,此处可以根据程序需要调节 /*调色板数据根据BMP版本的不同而不同PaletteN * 4 byte调色板规范。 对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值: 1字节用于蓝色分量 1字节用于绿色分量 1字节用于红色分量 1字节用于填充符(设置为0) */ } public struct BMPData { public byte[] BitMapData;//=new byte[1024000];//bmp规范没有规定bmp数据最多为1024000,此处可以根据需要调整 /* 图象数据根据BMP版本及调色板尺寸的不同而不同BitMap Dataxxx bytes该域的大小取决 于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是 彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。 */ } public void ProcessBMP(ref StructBMP sbmp,byte[] bytesFile) { byte[] word1=new byte[2]; byte[] word2=new byte[4]; System.Int32 result; string str=""; word1[0]=bytesFile[0]; word1[1]=bytesFile[1]; str=FromBytesToString(word1); sbmp.Header.Identifier=str; word2[0]=bytesFile[2]; word2[1]=bytesFile[3]; word2[2]=bytesFile[4]; word2[3]=bytesFile[5]; result=this.FromBytesToInt32(word2); sbmp.Header.FileSize=result; word2[0]=bytesFile[10]; word2[1]=bytesFile[11]; word2[2]=bytesFile[12]; word2[3]=bytesFile[13]; result=this.FromBytesToInt32(word2); sbmp.Header.BitMapDataOffset=result; word2[0]=bytesFile[14]; word2[1]=bytesFile[15]; word2[2]=bytesFile[16]; word2[3]=bytesFile[17]; result=this.FromBytesToInt32(word2); sbmp.Header.BitMapHeaderSize=result; word2[0]=bytesFile[18]; word2[1]=bytesFile[19]; word2[2]=bytesFile[20]; word2[3]=bytesFile[21]; sbmp.Header.Width=result; word2[0]=bytesFile[22]; word2[1]=bytesFile[23]; word2[2]=bytesFile[24]; word2[3]=bytesFile[25]; result=this.FromBytesToInt32(word2); sbmp.Header.Height =result; word1[0]=bytesFile[26]; word1[1]=bytesFile[27]; sbmp.Header.Planes=(System.Int16)FromBytesToInt32(word1); word1[0]=bytesFile[28]; word1[1]=bytesFile[29]; sbmp.Header.BitsPerPixel=(System.Int16)FromBytesToInt32(word1); word2[0]=bytesFile[30]; word2[1]=bytesFile[31]; word2[2]=bytesFile[32]; word2[3]=bytesFile[33]; result=this.FromBytesToInt32(word2); sbmp.Header.Compression =result; word2[0]=bytesFile[34]; word2[1]=bytesFile[35]; word2[2]=bytesFile[36]; word2[3]=bytesFile[37]; result=this.FromBytesToInt32(word2); sbmp.Header.BitMapDataSize =result; word2[0]=bytesFile[38]; word2[1]=bytesFile[39]; word2[2]=bytesFile[40]; word2[3]=bytesFile[41]; result=this.FromBytesToInt32(word2); sbmp.Header.HResolution =result; word2[0]=bytesFile[42]; word2[1]=bytesFile[43]; word2[2]=bytesFile[44]; word2[3]=bytesFile[45]; result=this.FromBytesToInt32(word2); sbmp.Header.VResolution =result; word2[0]=bytesFile[46]; word2[1]=bytesFile[47]; word2[2]=bytesFile[48]; word2[3]=bytesFile[49]; result=this.FromBytesToInt32(word2); sbmp.Header.Colors =result; word2[0]=bytesFile[50]; word2[1]=bytesFile[51]; word2[2]=bytesFile[52]; word2[3]=bytesFile[53]; result=this.FromBytesToInt32(word2); sbmp.Header.ImportantColors =result; //计算位图数据的开始位置 //sbmp.Header.BitMapDataSize是位图数据的大小,sbmp.Header.FileSize是整个文件的大小 //sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-1就是位图数据的开始位置 //0x36到sbmp.Header.FileSize-sbmp.Header.BitMapDataSize-2就是调色板数据 result=sbmp.Header.FileSize-sbmp.Header.BitMapDataSize; int j=0; byte[] b=new byte[sbmp.Header.BitMapDataSize]; for(int i=result;i<sbmp.Header.FileSize;i++) { b[j]=bytesFile[i];j++; } sbmp.Data.BitMapData=b; j=0; b=new byte[result-sbmp.Header.BitMapDataOffset]; for(int i=sbmp.Header.BitMapDataOffset;i<result;i++) { b[j]=bytesFile[i];j++; } sbmp.Palette.Palette=b; } public void ProcessBMP(ref StructBMP sbmp,string File) { //先读取文件成字节数组,统一由ProcessBMP(StructBMP sbmp,byte[] bytesFile)处理 JJBase.FILE.ReadAndWrite f=new ReadAndWrite(); byte[] result=f.ReadBytesFromFile(File); ProcessBMP(ref sbmp,result); } private System.Int32 FromBytesToInt32(byte[] b) { System.Int32 result=0; System.Int32 t=0; for(int i=b.Length-1;i>=0;i--) { if((int)b[i]!=0) { t=(int)Math.Pow(256,i); result+=(int)b[i]*t; } } return result; } private string FromBytesToString(byte[] b) { string result=""; for(int i=0;i<b.Length;i++) { result+=Convert.ToChar((int)(b[i])).ToString(); } return result; } } }
试试其它关键字
BMP
图形文件
同语言下
.
文件IO 操作类库
.
Check图片类型[JPEG(.jpg 、.jpeg),TIF,GIF,BMP,PNG,P
.
机器名和IP取得(IPV4 IPV6)
.
Tiff转换Bitmap
.
linqHelper
.
MadieHelper.cs
.
RegHelper.cs
.
如果关闭一个窗体后激活另一个窗体的事件或方法
.
创建日志通用类
.
串口辅助开发类
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
dezai
贡献的其它代码
(
1065
)
.
双色球
.
列出所有物理网络适配器
.
快乐数的 Python 实现
.
计算当月还剩天数
.
猜属相
.
二十四小时时钟
.
每日一语
.
很酷的日历
.
超长日历表单
.
最简单的时钟
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3