有很多灰度图,想要用数组或文本的方式(反正是二维表的方式)保存bmp里每个小方块的灰度值(0或1就可以,灰度图里R=G=B,三颜色值相等的,可以假设R<50时就取1,反之取0),重点是一个小方块一个灰度值,我虽然可以用GetPixel通过屏幕坐标扫描的方式得到各个像素的颜色值,但这样得出来的灰度矩阵不是一个小方块一个灰度值。
请高手指点!

解决方案 »

  1.   

    取得位图数据,24位位图正好是按Byte存放RGB的,然后逐位分析就可以了啊。
      

  2.   

    打开文件,
    读FILEHEADER
    读INFOHEADER
    因为是24,所以下面的就是数据了
      

  3.   

    看你的位图来源了。如果是有位图句柄,那么用GetBitmapBits,如果是文件读入,用楼上的方法。操作位图数据,你可以看一下这个,虽然不是一回事,参考总是可以的:
    http://blog.csdn.net/pomelowu/archive/2006/01/23/587060.aspx
      

  4.   

    使用LoadImage()读入BMP,再申请内存,使用GetBitmapBits将BMP的数据读入申请的内存里处理。使用GetRedValue宏取得R的值,将其赋予G,B即可。
      

  5.   

    下面是我的一段程序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图并放大可以看到):
    0000000001111000111
    0000000011111111000
    0000000111110111100
    0000011110000001110
    0011000110000000110
    0000000110000000011
    0000000111000000011
    0001111111100000111
    0111110111111011111
    0111000000111111110
    1110000000001100000
    1100000000001110000
    1100000000000110000
    1100000000000110000
    1100000000001100000
    1110000000011100000
    0111000000111000000
    0011111111110000000
    0001111111000000000
      

  6.   

    严格来说,我这里指的BMP图是256色图
      

  7.   

    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;
    }