高分求bmp24位图的灰度矩阵!!先来先得! 有很多灰度图,想要用数组或文本的方式(反正是二维表的方式)保存bmp里每个小方块的灰度值(0或1就可以,灰度图里R=G=B,三颜色值相等的,可以假设R<50时就取1,反之取0),重点是一个小方块一个灰度值,我虽然可以用GetPixel通过屏幕坐标扫描的方式得到各个像素的颜色值,但这样得出来的灰度矩阵不是一个小方块一个灰度值。请高手指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 取得位图数据,24位位图正好是按Byte存放RGB的,然后逐位分析就可以了啊。 打开文件,读FILEHEADER读INFOHEADER因为是24,所以下面的就是数据了 看你的位图来源了。如果是有位图句柄,那么用GetBitmapBits,如果是文件读入,用楼上的方法。操作位图数据,你可以看一下这个,虽然不是一回事,参考总是可以的:http://blog.csdn.net/pomelowu/archive/2006/01/23/587060.aspx 使用LoadImage()读入BMP,再申请内存,使用GetBitmapBits将BMP的数据读入申请的内存里处理。使用GetRedValue宏取得R的值,将其赋予G,B即可。 下面是我的一段程序pszFilename为char*型,是一个24位图文件的路径和文件名。看着网上很多的关于BMP的文件结构及例子我就头疼,只好把代码贴出,望大家指点BOOL Bmp2Array(const char *pszFilename) { int i,pos; FILE *f=fopen(pszFilename,"rb"); if(f==NULL) //判断文件是否打开成功 { return FALSE; } fseek(f,0,0);//移动到开头 //----------读BMP文件头 BITMAPFILEHEADER BFH; if(fread(&BFH,sizeof(BITMAPFILEHEADER),1,f)==NULL) { return FALSE; } //-----------读BMP信息头 BITMAPINFOHEADER BIH; if(fread(&BIH,sizeof(BITMAPINFOHEADER),1,f)==NULL) { return FALSE; } fseek(f,BFH.bfOffBits,SEEK_SET); //定位位图矩阵 int skip=0; //填充象素数 if(BIH.biWidth%4==0) skip=0; else skip=4-BIH.biWidth%4; long N=(BIH.biWidth)*(BIH.biHeight);//有效象素总数 //接下来的事,我就不知道怎么做了? //我想生成一个(BIH.biWidth)*(BIH.biHeight)的矩阵或二维表,元素是1或0(将颜色二值化或者是个COLORREF颜色值更好,二值化的问题好解决), //怎么做了,请高手指点...........}如果把将颜色二值化(怎么二值化不是这里的重点),这个矩阵类似下面形式,注意,一个元素代表bmp里的一个小方块(在画笔里打开bmp图并放大可以看到):0000000001111000111000000001111111100000000001111101111000000011110000001110001100011000000011000000001100000000110000000111000000011000111111110000011101111101111110111110111000000111111110111000000000110000011000000000011100001100000000000110000110000000000011000011000000000011000001110000000011100000011100000011100000000111111111100000000001111111000000000 严格来说,我这里指的BMP图是256色图 BYTE * pBuffer = NULL;long lSize = (BIH.biWidth + skip) * (BIH.biHeight);pBuffer = malloc(lSize);if( pBuffer == NULL ) return FALSE;if( fread(pBuffer, lSize, 1, f) < lSize ){ fclose(f); free(pBuffer); return FALSE;} 请教一个串口问题 调用其他程序问题 Raknet 转发的问题? 怎样往excel文件里写宏 法国对输球我开心,散分。 我从朋友处找到好书现想制作成PDF格式的电子书,有扫描仪,请问制作过程?扫描时要注意事项?需有哪些软? 一个较难的问题::关于录音源设置的问题。。。。。谢谢关注 有懂GPS的吗? 请问我如果要获得一个输入的数值,应该用什么vc的控件? 再次求助,关于VC和oracle数据库中的存储过程的问题,各位大侠,回一下啊 [散分]今天拿到了第一笔工资,高兴!大家快来,下班结帖! 为什么 unsigned char 数组也能存储中文?
读FILEHEADER
读INFOHEADER
因为是24,所以下面的就是数据了
http://blog.csdn.net/pomelowu/archive/2006/01/23/587060.aspx
BOOL Bmp2Array(const char *pszFilename)
{
int i,pos;
FILE *f=fopen(pszFilename,"rb");
if(f==NULL) //判断文件是否打开成功
{
return FALSE;
}
fseek(f,0,0);//移动到开头
//----------读BMP文件头
BITMAPFILEHEADER BFH;
if(fread(&BFH,sizeof(BITMAPFILEHEADER),1,f)==NULL)
{
return FALSE;
}
//-----------读BMP信息头
BITMAPINFOHEADER BIH;
if(fread(&BIH,sizeof(BITMAPINFOHEADER),1,f)==NULL)
{
return FALSE;
}
fseek(f,BFH.bfOffBits,SEEK_SET); //定位位图矩阵
int skip=0; //填充象素数
if(BIH.biWidth%4==0)
skip=0;
else
skip=4-BIH.biWidth%4;
long N=(BIH.biWidth)*(BIH.biHeight);//有效象素总数
//接下来的事,我就不知道怎么做了?
//我想生成一个(BIH.biWidth)*(BIH.biHeight)的矩阵或二维表,元素是1或0(将颜色二值化或者是个COLORREF颜色值更好,二值化的问题好解决),
//怎么做了,请高手指点...........
}如果把将颜色二值化(怎么二值化不是这里的重点),这个矩阵类似下面形式,注意,一个元素代表bmp里的一个小方块(在画笔里打开bmp图并放大可以看到):
0000000001111000111
0000000011111111000
0000000111110111100
0000011110000001110
0011000110000000110
0000000110000000011
0000000111000000011
0001111111100000111
0111110111111011111
0111000000111111110
1110000000001100000
1100000000001110000
1100000000000110000
1100000000000110000
1100000000001100000
1110000000011100000
0111000000111000000
0011111111110000000
0001111111000000000
long lSize = (BIH.biWidth + skip) * (BIH.biHeight);
pBuffer = malloc(lSize);if( pBuffer == NULL )
return FALSE;if( fread(pBuffer, lSize, 1, f) < lSize )
{
fclose(f);
free(pBuffer);
return FALSE;
}