本帖最后由 xyczy 于 2012-09-24 13:11:59 编辑

解决方案 »

  1.   

    ((((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4)公式计算的是图像中每行像素所占的字节数;
    有一点要注意的是BMP图像要求每行数据4字节对齐,所以才会有上面这个公式再乘以图像高度得到图像数据所占内存大小。
      

  2.   

    这个我知道啊,我就是问公式怎么来的还有高度的字节数应该是biheight*3吧,24位的图哦
      

  3.   

    int width=(((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4;
    width 里就包含 *3;即 biBitCount
      

  4.   

    你这个程序打开的是一个位图,就是后缀名为.bmp的图片.如果用于打开jpg图片当然不可能成功了,你看一下文件头里的bfType的值就知道了.想试程序就截一幅位图吧,少年!!!
      

  5.   

    3楼:stBMPInfoHeader.biWidth不是表示像素值吗我图片是600*400的,那这个值是600*3吗?
    4楼:当然是bmp图而且我已经把效果图链接放在末尾了,而且能正常显示的,只是我想显示之前对像素进行一些操作不知道这个像素坐标对应的数组下标该怎么算
      

  6.   

    biWidth当然是600,这个仅表示每行有多少个像素点,和你图像是否为彩色、还是灰度没关系。
    我觉得你现在的问题是,没有弄清:每行的像素点数和每行像素所占字节数这两个概念;//每行图像所占字节数,4字节对齐
    int nLineBytes = (((stBMPInfoHeader.biWidth * stBMPInfoHeader.biBitCount) + 31) / 32) * 4;
    //图像宽
    int nWidth = stBMPInfoHeader.biWidth;
    //图像高
    int nHeight= stBMPInfoHeader.biHeight;//
    for(int i = 0; i < nHeight; i++)
    {
    for(int j = 0; j < nWidth; j++)
    {
    if(i>=0 && i<=100 && j>=0 && j<=100)
    {
    //这里注意是行下标乘每行数据所占字节数 pByte[nLineBytes*i + j*3+2] -= 20; //r
    pByte[nLineBytes*i + j*3+1] -= 20; //g
    pByte[nLineBytes*i + j*3]   -= 20; //b
    }
    }
    }
    //
      

  7.   

    厉害!真的对了,我再理清一下这个关系。只是修改后的显示在左下角,是因为bmp数据是从左下角开始显示的原因吗?分先给你了
      

  8.   

    pByte[nLineBytes*(height-i-1)+j*3+2]-=20;
            pByte[nLineBytes*(height-i-1)+j*3+1]-=20;
            pByte[nLineBytes*(height-i-1)+j*3]-=20;bingo!对图片格式又加深了感谢laoma_hbu!