怎样取得BMP图像的数据区指针

hela329512384 2010-08-12 07:05:30
我用的是简单的C编程,可是碰到了个难题,不知道怎么样得到BMP图像的数据区指针,请问哪位哪些能否指教下,谢谢了
...全文
448 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunrier 2010-08-23
  • 打赏
  • 举报
回复
了 解
mikithebest 2010-08-15
  • 打赏
  • 举报
回复
首先8bit、24bit、32bit以及不同大小的bmp图像的文件头大小是不同的。具体可以google下。
如果你的是嵌入式系统的话,可能不能一次性开辟那么多内存,可以通过fseek和fread来读取指定位置和大小的数据,就可以了。明白我的意思吧?
xiongmingvvv 2010-08-15
  • 打赏
  • 举报
回复
二楼已经说得十分清楚了,函数调用都给你了。自己仔细看
[Quote=引用 10 楼 hela329512384 的回复:]
谢谢各位,是都说的很对,我知道可以利用文件指针。不过我是想通过这种*(p+(height-1)*j+i)这种方式来得到图像的数据,p是指向图像数据的指针。我现在的做法是把文件里的数据赋值到数组,然后对数组操作,再把数组里的值写到文件里去,以改变图像,但是开辟的数组容量太大,而且由于我想要的操作图像的原因,还要几个这样大小的数组,所以资源占用太多,所以想要那个p,就不需要那么多数组了。希望哪位大侠能……
[/Quote]
hela329512384 2010-08-14
  • 打赏
  • 举报
回复
谢谢各位,是都说的很对,我知道可以利用文件指针。不过我是想通过这种*(p+(height-1)*j+i)这种方式来得到图像的数据,p是指向图像数据的指针。我现在的做法是把文件里的数据赋值到数组,然后对数组操作,再把数组里的值写到文件里去,以改变图像,但是开辟的数组容量太大,而且由于我想要的操作图像的原因,还要几个这样大小的数组,所以资源占用太多,所以想要那个p,就不需要那么多数组了。希望哪位大侠能够明白我的意思~
hastings 2010-08-13
  • 打赏
  • 举报
回复
说得太绝对了~~
要自己搞偏移量之类的,你得彻底了解位图格式。
BITMAPINFOHEADER类型的:
8位位图,其颜色表不一定是256个。
4位位图,其颜色表不一定是16个。
16位和32位位图,其信息头后面可能还会有3个DWORD大小的屏蔽码~~
fire_woods 2010-08-13
  • 打赏
  • 举报
回复
14+40+4*调色板元素格式
256色的BMP是14+40+256*4=1078
kevin07042034 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dingshaofengbinbin 的回复:]
BMP文件头包括两个结构体:BITMAPFILEHEADER和(BITMAPINFOHEADER或BITMAPINFO),这两个结构体的大小分别是14和(40或44)字节,所以总共是54或58字节,不是1078字节吧??你先试一下,看看准确不(应该没有错的)。
[/Quote]

256色的BMP是1078,其他的在头文件里面都有偏移说明的,我没说清楚...
鱼塘鱼汤 2010-08-13
  • 打赏
  • 举报
回复
BMP的头有54位,你直接fseek过去就行了
jackyjkchen 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hela329512384 的回复:]
你们说的这些我知道,但是我想要的是指向数据的指针,毕竟你们说的指针还是文件指针,是文件类型的指针,比如我是24位图,读数据虽然读了可以用frwite(&a[i][j],1,1,fp)fp是文件指针,但是当我只要把24位按8为读出来时,按道理读3次,我的那条指令是读了8位,可是fp读了一次后指向了下一个像素了,而不是这个像素里的第二个8位。所以我想要指向该数据的指针~文件指针这里碰到了麻烦
[/Quote]
不明白你说的,缓冲区的指针不就是“指向数据的指针”么
hela329512384 2010-08-13
  • 打赏
  • 举报
回复
你们说的这些我知道,但是我想要的是指向数据的指针,毕竟你们说的指针还是文件指针,是文件类型的指针,比如我是24位图,读数据虽然读了可以用frwite(&a[i][j],1,1,fp)fp是文件指针,但是当我只要把24位按8为读出来时,按道理读3次,我的那条指令是读了8位,可是fp读了一次后指向了下一个像素了,而不是这个像素里的第二个8位。所以我想要指向该数据的指针~文件指针这里碰到了麻烦
dingshaofengbinbin 2010-08-13
  • 打赏
  • 举报
回复
BMP文件头包括两个结构体:BITMAPFILEHEADER和(BITMAPINFOHEADER或BITMAPINFO),这两个结构体的大小分别是14和(40或44)字节,所以总共是54或58字节,不是1078字节吧??你先试一下,看看准确不(应该没有错的)。
kevin07042034 2010-08-13
  • 打赏
  • 举报
回复
unsigned char *bmpbuff = NULL;
FILE *bmpfp;

bmpbuff = (unsigned char *)malloc(sizeof(char)*WIDTH*LINE );//WIDTH * LINE 是数据区的字符数
if(bmpbuff == NULL)
exit (1);
bmpfp = fopen("picture.bmp","rb");
fseek(bmpfp, 1078, 0);//BMP文件前1078个字节是头文件
fread(bmpbuff, sizeof(char), WIDTH * LINE, bmpfp);
这样bmpbuff里面就是你所需要的东西了
jackyjkchen 2010-08-12
  • 打赏
  • 举报
回复
打开文件,偏移N个字节越过BMP文件头(多少我忘了,去看bmp格式去)

把剩下的读出来,就是图像区

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧