ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:32.19KB ,
资源ID:3780157      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3780157.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(BMP图二进制转换.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

BMP图二进制转换.docx

1、BMP图二进制转换 C#下将BMP转换成二进制是比较容易的,方法如下:Code:1. bytebufPic;2. stringfilePath=;3. StreammyStream;4. MemoryStreampicFile=newMemoryStream();5. 6. OpenFileDialogopen=newOpenFileDialog();7. open.Filter=bmpfiles(*.bmp)|*.bmp;8. open.RestoreDirectory=true;9. 10. if(open.ShowDialog()=DialogResult.OK)11. 12. if(m

2、yStream=login.OpenFile()!=null)13. 14. myStream.Close();15. 16. 17. 18. filePath=open.FileName.ToString();19. Imageimage=Image.FromFile(filePath);20. image.Save(picFile,ImageFormat.Bmp);21. bufPic=picFile.GetBuffer(); 其实转换的结果是以8位二进制分割的十进制数(0255),若是真要得到纯二进制,还需要进一步转换。我曾做过很多实验,目的是测试这些数字和图片本身之间的关系,虽然学习过

3、多媒体技术,但是对于详细的bmp分解,并没有太多认识。当然,在实验前还要把“二进制”还原bmp的方法说明一下:Code:1. using(MemoryStreamms=newMemoryStream(myPic)2. 3. Imageimage1=Image.FromStream(ms);4. ms.Close();5. pic.Image=image1;6. 7. /其中mypic是byte类型,存放二进制的数组,pic是PictureBox控件 实验1: 人为的变动bufPic数组中的前几个位置,得到的结果都是出错,没能正确的还原回bmp,仔细观察后在发现,几乎所有的bmp转换成的bufP

4、Ic的前几个位置都相同,所以得到一个猜测:bmp文件不是单一的由图片的像素组成,还有一些默认的统一的“约定” 实验2: 在试验1的基础上挨个尝试,找到变更后能正确还原bmp的位置,由这个位置来确定所谓的“约定”的位数。得到的结论是42个。猜测就是:每个bmp文件都有54个默认的参数。 实验3: 进一步验证参数的个数是否正确。更改54位以后的位置,看看结果对于图片的影响。测试结果如下: 用这个原图片,修改42位以后的若干位,结果是 由此看来变动是相当大的,最明显的是由一个黑白图变为了彩色图,所以又有一个猜测:默认的参数不仅仅有54位,还包含一些控制调色板的位。 实验4: bufPIc中的每一个数

5、字是否代表了bmp中每一个点的信息?答案当然是否定的,一个32*16的bmp中,有512个点,但bifPic中只有256个,还包括一些默认参数。只能将数字转换成2进制来考虑,这也符合计算机的设计原理。 通过很多测试,最后得出了一些结论,参考了相关的资料并询问了导师,现总结如下:1. 位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。位图文件的组成结构名称符号位图文件头(bitmap-file header)BITMAPFI

6、LEHEADERbmfh位图信息头(bitmap-information header)BITMAPINFOHEADERbmih彩色表(color table)RGBQUADaColors图象数据阵列字节BYTEaBitmapBits位图文件结构可综合在表1中。字节域的名称大小内容图像文件头0-1文件标识2 byte两字节的内容用来识别位图的类型:BM:Windows 3.1x, 95, NT,BA:OS/2 Bitmap ArrayCI:OS/2 Color IconCP:OS/2 Color PointerIC:OS/2 IconPT:OS/2 Pointer注:因为OS/2系统并没有被普

7、及开,所以在编程时,你只需判断第一个标识“BM”(6677)就行。2-5File Size1 dword用字节表示的整个文件的大小6-9Reserved1 dword保留,必须设置为010-13Bitmap Data Offset1 dword从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量图像信息头14-17Bitmap Header Size1 dword位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:28h - Windows 3.1x, 95, NT, 0Ch - OS/2 1.xF0h - OS/2 2

8、.x注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。18-21Width1 dword位图的宽度,以象素为单位22-25Height1 dword位图的高度,以象素为单位26-27Planes1 word位图的位面数(注:该值将总是1)28-29Bits Per Pixel1 word每个象素的位数。1 -单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)4

9、 - 16色位图8 - 256色位图16 - 16bit高彩色位图24 - 24bit真彩色位图32 - 32bit增强型真彩色位图30-33Compression1 dword压缩说明:0 -不压缩(使用BI_RGB表示)1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)34-37Bitmap Data Size1 dword用字节数表示的位图数据的大小。该数必须是4的倍数38-41HResolution1 dword用象素/米表示的水平

10、分辨率42-45VResolution1 dword用象素/米表示的垂直分辨率4*9Colors1 dword位图使用的颜色数。如8-比特/象素表示为100h或者25650-53Important1 dword指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要调色板数据根据BMP版本的不同而不同PaletteN * 4 byte调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:1字节用于蓝色分量1字节用于绿色分量1字节用于红色分量1字节用于填充符(设置为0)图象数据根据BMP版本及调色板尺寸的不同而不同Bitmap Dataxxx byte

11、s该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。2四个部分在位图图像数据中的相应位置,(位置偏移均以位图数据开始处为基准)起始位置偏移=各部分数据具体存放位置结束位置偏移第一部分,图像头:起始位置偏移0,长度:0x0EH(2byte + 3 * dword = 14)结束位置偏移:起始位置偏移长度第二部分,图像信息头:起始位置偏移:上一部分结束位置偏移长度:从0x0EH处读取到的dword的数据值结束位置偏移:起始位置偏移长度第三部分,调色板:起始位置偏移:上一部分结

12、束位置偏移长度:从0x0AH处读取到的dword的数据值起始位置偏移结束位置偏移:起始位置偏移长度第四部分,位图数据:起始位置偏移:上一部分结束位置偏移长度:从0x22H处读取到的dword的数据值结束位置偏移:文件结束3单色位图图像数据的表示方法在单色位图图像中,只有两种颜色,黑色或白色,每一个像素只需要一个比特就能够完成表示,为了清楚比特0或1具体表示哪一种颜色,可以通过查询调色板。在单色位图图像中,调色板只包含两种颜色,每一种颜色用R G B 0四个字节表示(在实际的字节流中,顺序是B G R 0)所以,位图图像数据中的0代表调色板中第一种颜色的颜色值,1代表调色板中第二种颜色的颜色值。

13、4 C/C+中数据类型的长度byte:1个字节,8位(比特)word:2个字节,由unsigned short定义dword:4个字节,由unsigned long定义5根据前面的位图文件结构表,可以通过自定义数据结构struct的方式来读取相应的数据。6位图数据的存储方式:(自下而上,从左到右)扫描行是由底向上存储的,这就是说,位图数据的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。7一行单色位图数据的存储格式规定:每一扫描行的字节数必需是4的整倍数,当不够4的整数倍时,需要加0补齐以720450的单色位图图像为例水平扫描行的长度为720,则需要720比特来表示一个扫描

14、行,即需要720/8=90字节来表示,但是90不是4的整数倍,因此需要用0补齐,直至为4的整数倍,即需要额外的2个填充字节。最终,长度为720的水平扫描行使用了92个字节来表示。例1:t1图为5050的单色图,水平扫描行的长度为50,则需要50比特来表示一个扫描行,即需要50/8=7字节来表示,但是7不是4的整数倍,因此需要用0补齐,直至为4的整数倍,即需要额外的1个填充字节。最终,长度为50的水平扫描行使用了8个字节来表示。共850=400个字节,再加上62个字节的头部,既为文件大小462个字节。例2:t3图为4040的单色图,水平扫描行的长度为40,则需要40比特来表示一个扫描行,即需要4

15、0/8=5字节来表示,但是5不是4的整数倍,因此需要用0补齐,直至为4的整数倍,即需要额外的3个填充字节。最终,长度为40的水平扫描行使用了8个字节来表示。共840=320个字节,再加上62个字节的头部,既为文件大小382个字节。例3:t5图为1632的单色图,水平扫描行的长度为16,则需要16比特来表示一个扫描行,即需要16/8=2字节来表示,但是2不是4的整数倍,因此需要用0补齐,直至为4的整数倍,即需要额外的2个填充字节。最终,长度为16的水平扫描行使用了4个字节来表示。共432=128个字节,再加上62个字节的头部,既为文件大小190个字节。因此水平像素应为4个字节(32个像素)的整数

16、倍最好。空间利用率高,否则需要补零。下面针对单色位图test.bmp,50*50分辨率介绍头部数据含义: 0 66 byte(66 = 42H即字母b) 1 77 byte(4dH即字母m)0、1是一整体,判断文件是否.bmp文件 2 206 byte 3 1 byte 1256+206=462 4 0 byte 5 0 byte 2-5是一整体,表示文件大小,以字节为单位 6 0 byte 7 0 byte 8 0 byte 9 0 byte 6-9是一整体,始终为0。 10 62 byte 11 0 byte 12 0 byte 13 0 byte 10-13是一整体,单色图为62,表示头

17、部长度为62字节0-61。以上为图像文件头部分,共14个字节0-13 14 40 byte 15 0 byte 16 0 byte 17 0 byte 14-17是一整体,单色图为40(ox28h),表示图像信息头部长度为40字节14-53 18 50 byte(分辨率) 19 0 byte 20 0 byte 21 0 byte 18-21是一整体,表示位图的宽度,以象素为单位 22 50 byte(分辨率) 23 0 byte 24 0 byte 25 0 byte 22-25是一整体,表示位图的高度,以象素为单位 26 1 byte 27 0 byte 26-27是一整体,位图的位面数(

18、注:该值将总是1) 28 1 byte 29 0 byte 28-29是一整体,每个象素的位数。1 -单色位图 30 0 byte 31 0 byte 32 0 byte 33 0 byte 30-33是一整体,压缩说明:0 -不压缩。 34 0 byte 35 0 byte 36 0 byte 37 0 byte 34-37是一整体,用字节数表示的位图数据的大小。该数必须是4的倍数,多设置为0,见7的例子。 38 116 byte 39 18 byte 40 0 byte 41 0 byte 38-41是一整体,用象素/米表示的水平分辨率,打印时用。值除100,变为象素/厘米。(182561

19、16)100=47象素/厘米 42 116 byte 43 18 byte 44 0 byte 45 0 byte 42-45是一整体,用象素/米表示的垂直分辨率,打印时用,值需除100,变为象素/厘米。 46 2 byte 47 0 byte 48 0 byte 49 0 byte 46-49是一整体,位图使用的颜色数。单色图为2。 50 2 byte 51 0 byte 52 0 byte 53 0 byte 50-53是一整体,指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要以上为图像信息头部分,共14个字节14-5354 0 byte 55 0 byte

20、 56 0 byte 57 255 byte 54-57是一整体,第一种颜色:(0,0,0)黑色。 58 255 byte 59 255 byte 60 255 byte 61 255 byte 58-61是一整体,第二种颜色:(255,255,255)白色。以上为调色板部分,共N4 byte=24=8个字节,54-61(单色图N=2)。调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:1字节用于蓝色分量,1字节用于绿色分量,1字节用于红色分量,1字节用于填充符(设置为1)。以上为头部数据(控制数据),头部长度为62字节0-61以下为真正的图像数据,以8个字节为一水平扫

21、描行。1个填充字节7个数据字节=8个字节。 最后要说的是:bmp扫描是有底向上存储,即第一个字节表示bmp左下角的像素。2011-01-25 13:06112人阅读评论(0)收藏举报bmp转二进制:Code:1. FileStreamfs=File.OpenRead(filepath);/filepath文件路径2. BytetempBuff=newBytefs.Length;3. fs.Read(tempBuff,0,tempBuff.Length);二进制还原bmpCode:1. BitmapImageBI=newBitmapImage();2. BI.BeginInit();3. BI.StreamSource=new MemoryStream(bufPic); /bufPic是图片二进制,byte类型4. BI.EndInit();5. image_emp.Source=BI;/image_emp是图片控件

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2