問一個關於BMP的問題 請問在BMP的數據部分,每個像素是按照BRG的順序排列的嗎?還有,數據部分的第一個像素實際上是最後一行的第一個像素是嗎? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 由于BMP设定者认为数学坐标系更总要,所以DIB的扫描行是逆序存储的(相对于屏幕坐标系而言),即屏幕上的第一行是DIB位图数据的最后一行。 用24位表示一个像素,所以三个字节可以表示1个像素。注意它的顺序是BGR,而不是传统的RGB。在内存的摆放形式如下: 字节 0 1 2 3 4 5 ...像素 0 1 RGB B G R B G R 我来给你详细一点的说明:BMP一般是指BMP文件,它被加载进内存后有两种存放方式:1、DIB位图(设备无关),它实际上就是BMP文件除去BMP文件头的复本,与BMP文件字节排列是一致的。对于DIB位图要通过其头部信息判断其字节排列方式,影响位图数据排列的主要有两个参数:a、若高(Height)为正数,那么位图数据存放就是行倒序存放,即第一行是显示位图的最下一行的数据,若高为负数,则是正序,与我们视觉习惯是一致的。b、颜色位数(BitCount),有1、4、8、24、32(Bmp5.0以上才有,实际上现在DIB也支持16位色的)多种,只有24位色的位图是正好RGB三个分量各占一个字节并连续存放的,但我们知道,数据在内存或文件中的排列大都是低位在前,高位在后的顺序,所以其在内存或文件中就摆放成了BGR了,如:一个字节数组读出一个24位的像素a(2),则B=a(0),G=a(1),R=a(2),但若将其转换成Long型的颜色值,则需 Color=a(2)*65536+a(1)*256+a(0)2、DDB位图(设备相关),它比DIB少了个头部信息,且它位图数据与显示数据是一致的,都是从上到下排列,更重要的是它的颜色位数由屏幕色深决定,如你的显示器颜色数设置的是16位色的话,那DDB就也是16位色,DDB与DIB每个像素中字节的排列是一样,只是DDB中存在的16位色比较特殊,16位色每像素占两字节,共16Bit,RGB在其中分配的方式也有两种:即565格式与555格式(32K色,很少见了)常见的565格式排列顾名思意,就是从低到高为 B占5Bit,G占6Bit,R占5Bit,由于16位色,RGB每个分量都不是整个字节,而且G分量还是跨字节的,处理16色,需用到移位运算,这正是VB的空门,所以VB处理16位色DDB往往会很慢。另外不管是DIB还是DDB,位图数据字节总数都是以每一行,做为一个计算基准的,每行字节数必须是4的整数倍,不足的用0补齐。说了半天,我都是基于使用GDI对图片进行数组级运算而介绍的,若你对这些不了解,你可简单的使用Point或GetPixelV与SetPixelV画点,它们处理虽然很慢,但却能做到“位图无关性”(我自创的词^_^),像素排列总是从左到右,上到下,你只需把得到Long型值按R=(Value \ 65535),G=(Value \ 256 Mod 256),B=(Value Mod 256)运算取出就行了。 http://www.3lsoft.com/download/info/498.htm BMP图像数据是从下到上保存的。 服务端多连接的疑惑 自定义控件的问题 请问如何判断一个文本框中输入的都为汉字? 如何提高Access数据库读取速度??高手进(100分)在线等~~ find可以实现相关子查询的目的吗???? 加急:怎么知道MMControl播放完了.WAV文件?在线等 用VB 编写:如何得知数据库(ACESS)中哪些表存在联系,同时还可能知道是由哪些字段连接起来的? 点击文件名后如何打开文件并显示内容,请教各位! 文件合并问题,在线等! 请问lc3最多能解几位口令?nt最长有效口令是几位? winsock控件问题 串口信息怎样判断为回车符呀
字节 0 1 2 3 4 5 ...
像素 0 1
RGB B G R B G R
1、DIB位图(设备无关),它实际上就是BMP文件除去BMP文件头的复本,与BMP文件字节排列是一致的。对于DIB位图要通过其头部信息判断其字节排列方式,影响位图数据排列的主要有两个参数:
a、若高(Height)为正数,那么位图数据存放就是行倒序存放,即第一行是显示位图的最下一行的数据,若高为负数,则是正序,与我们视觉习惯是一致的。
b、颜色位数(BitCount),有1、4、8、24、32(Bmp5.0以上才有,实际上现在DIB也支持16位色的)多种,只有24位色的位图是正好RGB三个分量各占一个字节并连续存放的,但我们知道,数据在内存或文件中的排列大都是低位在前,高位在后的顺序,所以其在内存或文件中就摆放成了BGR了,如:一个字节数组读出一个24位的像素a(2),则B=a(0),G=a(1),R=a(2),但若将其转换成Long型的颜色值,则需 Color=a(2)*65536+a(1)*256+a(0)2、DDB位图(设备相关),它比DIB少了个头部信息,且它位图数据与显示数据是一致的,都是从上到下排列,更重要的是它的颜色位数由屏幕色深决定,如你的显示器颜色数设置的是16位色的话,那DDB就也是16位色,DDB与DIB每个像素中字节的排列是一样,只是DDB中存在的16位色比较特殊,16位色每像素占两字节,共16Bit,RGB在其中分配的方式也有两种:即565格式与555格式(32K色,很少见了)
常见的565格式排列顾名思意,就是从低到高为 B占5Bit,G占6Bit,R占5Bit,由于16位色,RGB每个分量都不是整个字节,而且G分量还是跨字节的,处理16色,需用到移位运算,这正是VB的空门,所以VB处理16位色DDB往往会很慢。另外不管是DIB还是DDB,位图数据字节总数都是以每一行,做为一个计算基准的,每行字节数必须是4的整数倍,不足的用0补齐。说了半天,我都是基于使用GDI对图片进行数组级运算而介绍的,若你对这些不了解,你可简单的使用Point或GetPixelV与SetPixelV画点,它们处理虽然很慢,但却能做到“位图无关性”(我自创的词^_^),像素排列总是从左到右,上到下,你只需把得到Long型值按R=(Value \ 65535),G=(Value \ 256 Mod 256),B=(Value Mod 256)运算取出就行了。