BMP 位图中的 BITMAPINFOHEADER 结构撞鬼了,紧急求助!
BMP 位图是由四个部分文件头,信息头,调色板,象素数据构成的。
其中信息头结构体如下:
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER; // MSDN 里面的
我现在得到了该结构体的指针,假设是p,现在把24位BMP图转化为256色的,就要修改一些数据:
p->biBitCount = 8;
p->biClrUsed = 256;
p->biSizeImage = .....这个就懒得写了。
总之只要有 p->biBitCount = 8; 这样一句,也就是修改 biBitCount 的值,程序运行就出问题。
其他的不管怎么改都没关系。我甚至把指针定位在 biBitCount 前面的数据位置上,然后移动过来载修改。多移一位少移一位都可以修改数据,偏偏在 biBitCount 上修改其值运行就要出错。。。真是碰鬼了。我还把那一连串的变量的指针位置显示出来,都是连冠的,没什么问题啊。
为什么不能改呢?biBitCount 这样关键的数据不改就不能完成转换。。
请赐教!
问题点数:20、回复次数:19Top
1 楼Mackz(在相互)回复于 2005-04-01 23:30:14 得分 1
改为8位,设置调色板了吗?Top
2 楼rmryt(小R在线)回复于 2005-04-02 03:20:31 得分 0
在 p->biBitCount = 8; 之前已经
pRGBQuad = new RGBQUAD[256]; 并且赋值给每个元素了。
pRGBQuad 是开始声明的 RGBQUAD* 型的指针。。。Top
3 楼Mackz(在相互)回复于 2005-04-02 12:00:15 得分 1
看看别的代码吧。Top
4 楼vcmute(BCare4 H1Rest Good9!)回复于 2005-04-03 15:25:12 得分 2
数据需要连续,要整个new,不能光new调色板Top
5 楼wh_2008()回复于 2005-04-03 19:08:58 得分 2
图像的每一行必须是偶数字节(后补零),你看看是不是这个问题Top
6 楼nicfeng(石头)回复于 2005-04-04 13:04:23 得分 2
24位没有颜色表 256要建一个颜色表 作为索引Top
7 楼puhuofeie(扑火飞蛾)回复于 2005-04-04 15:23:23 得分 2
注意申请内存要连续。
一次性把需要的内存申请好。
没什么难得。
祝楼主早日解决。Top
8 楼rmryt(小R在线)回复于 2005-04-04 23:47:52 得分 0
谢谢大家。不过我下载的代码试把256色图转化为256灰度图,并没有把24位彩图转化为灰度的代码。
我想内存也申请到了,因为pBitmapInfoHeader的其他成员可以修改。难道位图不允许修改位数(即biBitCount的值)?Top
9 楼hhoking(妙手仁心)回复于 2005-04-05 12:18:47 得分 3
不明白你到底怎么弄的。
比如源图A的内存是pA,目标图B的内存是pB,那么做转换时读取pA中的数据,转换后写入pB,这样的流程清晰也不容易出错啊。
你的问题一定不在于修改biBitCount值,这个值没有什么特殊的。Top
10 楼rmryt(小R在线)回复于 2005-04-05 14:11:09 得分 0
其实我只有一个图,这个图的信息保存在一些变量中.转换时只修改这一个图的变量,然后使用invalidate()在绘图区重新显示视图.因此不存在源图和目标图的区别.Top
11 楼thisisll(学习王高李,有个好身体)回复于 2005-04-05 17:31:32 得分 2
我刚才也做了
类似这个的工作
读取一个bmp文件的bisize
就一张图读不出来
其他的都可以
在我休息了一会后
程序就好了~~~~
你该休息下了Top
12 楼rmryt(小R在线)回复于 2005-04-06 01:03:19 得分 0
晕倒!!!!!
“在我休息了一会后
程序就好了~~~~”
这也是理由吗?
我都休息一个星期了也没好!!!!Top
13 楼Panr(光荣)回复于 2005-04-06 01:16:16 得分 0
把彩色转换成灰度是不是三个分量设置得一样就可以了
R = (R+G+B)/3
G = R;
B = R;
依次处理每个像素!Top
14 楼Panr(光荣)回复于 2005-04-06 01:17:55 得分 1
你改biBitCount 多麻烦啊,先建立调色版,然后还要把所有的像素的颜色按照调色版查出编码再填回去,太麻烦的说Top
15 楼rmryt(小R在线)回复于 2005-04-06 17:47:47 得分 0
不麻烦啊,从0到255依次把调色板的的每一位递增就好了。。。。。
现在只是无法修改bitmap信息头的内容。。。。。
另外楼上的楼上说把彩色转换成灰度是不是三个分量设置得一样就可以了
R = (R+G+B)/3
G = R;
B = R;
应该是R=G=B=0.299R+0.587G+0.114B
这种转换与电视系统有关,比较科学。
Top
16 楼rmryt(小R在线)回复于 2005-04-06 23:21:18 得分 0
这种广告怎么哪里都有呢?Top
17 楼hhoking(妙手仁心)回复于 2005-04-08 09:29:13 得分 2
又看了一遍你的问题,你是做24位转8位吗?如果是,那么
你确信只在一幅图中做这样的转换操作不会有问题??你确信你的指针不会越界???
首先我们看8位和24位都有40字节的信息头(如你所写BITMAPINFOHEADER),但是8位图在
40字节后要紧跟1024字节的颜色表!这个你有吗?
我假设你的信息头内存和像素数据内存是分开分配的,那么你在为24位图分配信息头内
存时就不能只分配40,而要分配1064!(有颜色表时,颜色表和信息头应该连续)
所以如果你的内存分配不对,那么你在显示图像时,不可避免会有指针越界的异常。
或者还有其他原因,但基本都会因为内存操作不当造成的,你再仔细检查吧,但不要纠缠
biBitCount能不能修改了,这个值实在没有什么特殊的。
Top
18 楼zy3481(远影孤帆)回复于 2005-04-08 15:50:49 得分 2
看看你存图像数据的buffer,如果调色板是256个entry,buffer中的数据要转成8位×图像大小。而如果只改变biBitCount,bitmap中抓到的图像数据还是24位的。Top
19 楼rmryt(小R在线)回复于 2005-04-09 13:09:35 得分 0
哈哈,知道是怎么回事了,多谢各位兄弟!!Top
相关问题
- 急:如何根据bmp文件的路径,得到它的位图信息头结构(BITMAPINFOHEADER)??
- 谁能介绍一下BMP文件的具体格式,是什么结构,每个结构的长度等
- 谁能介绍一下BMP文件的具体格式,是什么结构,每个结构的长度等
- 得到了BITMAPINFOHEADER后,如何显示BMP的问题
- 有谁可以提供bmp图片格式的数据存放结构吗?
- bmp
- 寻找:关于一般的图像格式(BMP,jpeg, gif... ) 的结构方面资料!!!
- 寻找:关于一般图像格式(BMP, jpeg, gif ...) 的结构方面的资料
- 对照J2EE和.net两个体系结构,请问j2ee中的ejb的session bean bmp cmp,或hibernate,spring,structs等等在net中的对应技术是什么?
- OVERLAPPED结构??




