当前位置: 首页 > 编程日记 > 正文

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

1using System;
  2using JJBase.FILE;
  3namespace JJBase.Image
  4{
  5    /// <summary>
  6    /// BMP 的摘要说明。
  7    /// </summary>

  8    public class BMP
  9    {
 10        
 11        public BMP()
 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为基础的。Windows 3.0以前的BMP图文件格式与
 26         * 显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB
 27         * (device-dependent BitMap)文件格式。Windows 3.0以后的BMP图象文件与
 28         * 显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB
 29         * (device-independent BitMap)格式(注:Windows 3.0以后,在系统中仍
 30         * 然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将
 31         * 图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的
 32         * 是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件
 33         * 默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
 34         * */

 35        public struct StructBMP
 36        {
 37            public BMPHeader Header;
 38            public BMPPalette Palette;
 39            public BMPData Data;
 40        }

 41        public struct BMPHeader
 42        {
 43            /*位图文件可看成由4个部分组成:位图文件头(BitMap-file header)、
 44             * 位图信息头(BitMap-information header)、彩色表(color table)和
 45             * 定义位图的字节阵列,
 46             * */

 47            public string Identifier;/*2 bytes,识别位图的类型: 
 48            ‘BM’ : Windows 3.1x, 95, NT, … 
 49            ‘BA’ :OS/2 BitMap Array 
 50            ‘CI’ :OS/2 Color Icon 
 51            ‘CP’ :OS/2 Color Pointer 
 52            ‘IC’ : OS/2 Icon 
 53            ‘PT’ :OS/2 Pointer 
 54            注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。
 55            */
 
 56            public System.Int32 FileSize;//1 dword,用字节表示的整个文件的大小 
 57            public byte[] Reserved;//1 dword,保留,必须设置为0 
 58            public System.Int32 BitMapDataOffset;//1 dword,从文件开始到位图数据开始之间的数据(BitMap data)之间的偏移量
 59            public System.Int32 BitMapHeaderSize;/*1 dword
 60            位图信息头(BitMap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示: 
 61            28h - windows 3.1x, 95, nt, …
 62            0ch - os/2 1.x
 63            f0h - os/2 2.x
 64            注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。 
 65             */

 66            public System.Int32 Width;//1 dword,位图的宽度,以象素为单位
 67            public System.Int32 Height;//1 dword,位图的高度,以象素为单位 
 68            public System.Int16 Planes;//1 word,位图的位面数(注:该值将总是1) 
 69            public System.Int16 BitsPerPixel;
 70            /*1 word
 71            每个象素的位数 
 72            1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色) 
 73            4 - 16 色位图 
 74            8 - 256 色位图 
 75            16 - 16bit 高彩色位图 
 76            24 - 24bit 真彩色位图 
 77            32 - 32bit 增强型真彩色位图 
 78            */
 
 79            public System.Int32 Compression;
 80            /*1 dword
 81            压缩说明: 
 82            0 - 不压缩 (使用BI_RGB表示) 
 83            1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示) 
 84            2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示) 
 85            3 - Bitfields-位域存放方式(用BI_BITFIELDS表示) 
 86            */

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

 94        }

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

104        }

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

113        }

114        public void ProcessBMP(ref StructBMP sbmp,byte[] bytesFile)
115        {
116            byte[] word1=new byte[2];
117            byte[] word2=new byte[4];
118            System.Int32 result;
119            string str="";
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            int j=0;
201            byte[] b=new byte[sbmp.Header.BitMapDataSize];
202            for(int i=result;i<sbmp.Header.FileSize;i++)
203            {
204                b[j]=bytesFile[i];j++;
205            }

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

213            sbmp.Palette.Palette=b;
214        }

215        public void ProcessBMP(ref StructBMP sbmp,string File)
216        {
217            //先读取文件成字节数组,统一由ProcessBMP(StructBMP sbmp,byte[] bytesFile)处理
218            JJBase.FILE.ReadAndWrite  f=new ReadAndWrite();
219            byte[] result=f.ReadBytesFromFile(File);
220            ProcessBMP(ref sbmp,result);
221        }

222        private System.Int32 FromBytesToInt32(byte[] b)
223        {
224            System.Int32 result=0;
225            System.Int32 t=0;
226            for(int i=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            return result;
237        }

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

245            return result;
246        }

247        
248    }

249}

相关文章:

gsoap 学习 1-由wsdl文件生成h头文件

开始前先看一下用户向导吧 http://www.cs.fsu.edu/~engelen/soap.html 中左侧点击Documentation 英语水平确实有限,有些内容可能说的不准确,敬请参考向导中原文,以免误导 向导 1.1节中提供了gSoap开发包的下载地址http://sourceforge.net/projects/gsoap2 下载最新gSoap程序包解…

微软每年豪砸安全研发 10 亿美元,聊聊背后的技术密码

从无序中寻找踪迹&#xff0c;从眼前事探索未来。正值 IT 黄金十年新开端&#xff0c; CSDN 欲以中立技术社区专业、客观的角度&#xff0c;深度探讨中国前沿 IT 技术演进&#xff0c;现在推出年度重磅企划——「拟合」&#xff0c;通过对话企业高管大咖&#xff0c;跟踪报道企…

phpstudy多站点配置好后index of/ 列表无法出现的解决

打开配置文件vhost-conf&#xff0c;看到图中画黄色线部分。把新配置的站点中的options后面加上 Indexes 就行了。 转载于:https://www.cnblogs.com/wubuwei/p/7388700.html

【OSX】build AOSP 2.3.7时的build error解决

原始的error log&#xff1a; 1 2 PLATFORM_VERSION_CODENAMEREL3 PLATFORM_VERSION2.3.74 TARGET_PRODUCTgeneric5 TARGET_BUILD_VARIANTeng6 TARGET_SIMULATOR7 TARGET_BUILD_TYPErelease8 TARGET_BUILD_APPS9 TARGET_ARCHarm 10 HOST_ARCHx86 11 HOST_OSdarwin 12 HOST_BUIL…

undefined reference to 'pthread_create'

pthread 库不是 Linux 系统默认的库&#xff0c;连接时需要使用静态库 libpthread.a&#xff0c;所以在使用pthread_create()创建线程&#xff0c;以及调用 pthread_atfork()函数建立fork处理程序时&#xff0c;需要链接该库。源文件&#xff0c;不要忘了加上头文件#include<…

瞄准自然语言处理,百度与鹏城实验室共建实验室

4月16日&#xff0c;百度与鹏城“自然语言处理联合实验室”签约暨揭牌仪式在鹏城实验室举行。 中国工程院院士、鹏城实验室主任高文出席仪式并致辞&#xff0c;鹏城实验室人工智能研究中心主任李革教授和百度集团首席技术官王海峰代表双方介绍了联合实验室前期筹备情况并签署协…

PostgreSQL SQL 语言:并行查询

本文档为PostgreSQL 9.6.0文档&#xff0c;本转载已得到原译者彭煜玮授权。 1. 并行查询如何工作 当优化器判断对于某一个特定的查询&#xff0c;并行查询是最快的执行策略时&#xff0c;优化器将创建一个查询计划。该计划包括一个 Gather 节点。下面是一个简单的例子&#xff…

常用的linux的命令行操作

2019独角兽企业重金招聘Python工程师标准>>> 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT …

Python 极简实现 IoU

来源 | 简明AI头图 | 下载于视觉中国出品 | AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;IOU中文名叫交并比&#xff0c;见名知意就是交集与并集的比值。是在目标检测中常用的算法。IoU原理如上图所示&#xff0c;就是计算上面阴影部分与下面阴影部分的比值。…

静态页htm传参数

//从转向过来的URL中截取参数 开始function SplitUrl(key){var fstrkey;var getstr;var urldocument.URL.toString();urlurl.toLowerCase();//转为小写var locurl.indexOf(fstr);if(loc>0){getstrurl.substring(locfstr.length,url.length);return getstr;}else{return &quo…

vue router 入门笔记

vue router 入门笔记 tips&#xff1a; components优先级大于component&#xff0c;即当一个route对象里同时配置了component和components时component视为无效即使route对象有name属性&#xff0c;也要配置一个path属性。name属性只是配对用的&#xff0c;path是要直接打到url上…

用C#的Raw Socket实现网络封包监视

<script language"javascript" src"/ad/js/edu_left_300-300.js" type"text/javascript"></script> 谈起socket编程&#xff0c;大家也许会想起QQ和IE&#xff0c;没错。还有许多网络工具如P2P、NetMeeting等在应用层实现的应用程序…

人工智能是否能开启人类世界新纪元?

想必许多人都不止一次地幻想过&#xff0c;当人工智能发展到极限时&#xff0c;它将为我们的生活带来多少触手可及的便捷&#xff0c;或是意想不到的惊喜呢&#xff1f;试想一下我们身处英剧《黑镜》的世界中&#xff0c;人类的生活里充斥着人工智能对社交行为的各种评分机制&a…

1月国内操作系统市场:Windows XP份额高达60.84%

IDC评述网&#xff08;idcps.com&#xff09;02月21日报道&#xff1a;据CNZZ数据&#xff0c;在国内操作系统市场上&#xff0c;2014年1月份&#xff0c;微软Windows系统依旧称霸市场&#xff0c;份额为90.63%&#xff0c;环比去年末下滑0.57%。对于市场份额下滑一事&#xff…

17.08.17

控制文件 丢失部分控制文件&#xff1a; SQL> select * from v$controlfile; $ >/u01/app/oracle/oradata/orcl/control01.ctl SQL> select * from v$tablespace; 报错 SQL> alter system checkpoint; 报错 $ vi /u01/app/oracle/diag/rd…

用C#实现基于TCP协议的网络通讯

TCP协议是一个基本的网络协议&#xff0c;基本上所有的网络服务都是基于TCP协议的&#xff0c;如HTTP,FTP等等&#xff0c;所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP协议是一个庞杂的体系&#xff0c;要彻底的弄清楚它的实现不是一天两天的功夫&#xff0c;所幸…

Java NIO系列教程(二) Channel

为什么80%的码农都做不了架构师&#xff1f;>>> Java NIO的通道类似流&#xff0c;但又有些不同&#xff1a; 既可以从通道中读取数据&#xff0c;又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer&#xff0…

百度CTO王海峰博鳌解读AI“融合创新”,算力算法数据发挥综合作用

4月18至21日&#xff0c;博鳌亚洲论坛2021年年会在海南博鳌举行。19日下午&#xff0c;百度CTO王海峰受邀参加本届博鳌年会“后疫情时代的人工智能”为主题的圆桌论坛。与公钥加密技术之父、图灵奖得主惠特菲尔德迪菲&#xff0c;阿斯利康公司董事长雷夫约翰森等多位专家和企业…

Java开发工具(Eclipse中内容辅助键的使用)

* A:Alt/ 起提示作用* B:mainalt/,sysoalt/,给出其他提示* C:补充输出语句,选中需要输出的部分,alt/选择最后一项即可* C:定义自己的alt / * windows--perference-Java-Editor-Templates--New * A:新建 ctrl n(new)* B:格式化 ctrlshiftf(format)* C:导入包 ctrlshifto *…

常用的css3的新属性

2019独角兽企业重金招聘Python工程师标准>>> 作为前端开发人员&#xff0c;如果你还不知道或还没有接触过CSS3&#xff0c;那么你真的OUT了&#xff01;就像蒸汽机的发明标志工业革命的开始一样&#xff0c;CSS3和HTML5的出现&#xff0c;将会带来WEB前端开发以及互…

高效分页存储过程

存储过程与页面调用如下&#xff1a; CREATE PROCEDURE search_sptblName varchar(255), -- 表名 strGetFields varchar(1000) *, -- 需要返回的列 fldName varchar(255), -- 排序的字段名 PageSize int 10, -- 页尺寸 PageIndex int , -- 页码 doCount bit 0, -- 返回记录…

2020年企业业务营收同比增长23.0%,华为的数字化转型实践之道

近日&#xff0c;在华为分析师大会期间&#xff0c;华为举办“共创行业新价值”主题峰会&#xff0c;与来自全球的400多名行业分析师、财经分析师、各行业意见领袖及媒体现场参会&#xff0c;分享了对行业趋势的洞察&#xff0c;解决方案在具体行业场景中的实践与探索&#xff…

Neo4j - CQL简介

CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL&#xff0c;Neo4j具有CQL作为查询语言。 Neo4j CQL - 它是Neo4j图形数据库的查询语言。它是一种声明性模式匹配语言它遵循SQL语法。它的语法是非常简单且人性化、可读的格式。常用的Neo4j CQL命令&#xff1a; NO.CQL…

String.Format格式说明

C#格式化数值结果表 字符 说明 示例 输出 C货币string.Format("{0:C3}", 2)&#xff04;2.000D十进制string.Format("{0:D3}", 2)002E科学计数法1.20E0011.20E001G常规string.Format("{0:G}", 2)2N用分号隔开的数字string.Format("{…

Azure 中国四年扩容 12 倍还不够,微软放话:全球每年新建 50-100 数据中心!

作者 | 伍杏玲出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;数据已渗透到我们生活和工作的方方面面&#xff0c;如今全球正处于经济发展转型与变革的关键时期&#xff0c;数据作为数字经济的核心生产要素&#xff0c;无疑建设先进的数据中心是科技企业的硬核 IT 实…

.NET中多线程的使用

为什么80%的码农都做不了架构师&#xff1f;>>> 1、不需要传递参数&#xff0c;也不需要返回参数。启动一个线程最直观的办法是实用Thread类。 2、ThreadStart类型的委托&#xff0c;这个委托制定了线程需要执行的方法&#xff1a;method。ThreadStart这个委托定义…

[数位dp] spoj 10738 Ra-One Numbers

题意&#xff1a;给定x、y。为[x,y]之间有多少个数的偶数位和减去奇数位和等于一。个位是第一位。 样例&#xff1a; 101-01 所以10是这种数 思路&#xff1a;数位dp[i][sum][ok] i位和为sum 是否含有前导0. 然后就是由于有负数 所以依据范围把0设置为100 然后最后和等于101则为…

VML 画统计 柱状、饼图、折线

<!-- --><!-- 涉及文件 alt.js / function.asp--><!-- 必须包含页面所有代码 --><!-- 高度定义有待改进 chart_top --> <html xmlns:v"urn:schemas-microsoft-com:vml" xmlns:o"urn:schemas-microsoft-com:office:office">…

在Ubuntu下FFmpeg编译,支持x264和x265(HECV)

所有下载的源在Ubuntu下FFmpeg编译&#xff0c;支持x264和x265。Ubuntu 12.04FFmpeg 2.1 Release 注意&#xff1a;cmake要升级要2.8.8yasm要升级到1.2.00000. 资料&#xff1a;http://stackoverflow.com/questions/19634453/ffmpeg-how-to-generate-a-mp4-with-h-265-codecFF…

Java 程序员薪资这么高,取决于什么?

众多行业中&#xff0c;程序员当然属于高薪职业。无论是国内还是国外&#xff0c;IT行业的程序员、工程师&#xff0c;甚至连码农都要比其他行业的从业者的收入高很多&#xff01;但是Java程序员拿多少钱跟有多少经验有关系&#xff0c;但经验的多少跟年限没有必然关系。工作以…