fseek(fb, 54, 0); while(!feof(fb))
{
fread(&newRgb, sizeof(newRgb), 1, fb);
printf("%d:%d:%d:%d", newRgb.rgbBlue, newRgb.rgbGreen, newRgb.rgbRed, newRgb.rgbReserved);

if((0 == newRgb.rgbBlue) && (0 == newRgb.rgbGreen) && (0 == newRgb.rgbRed))
{
while(1);
newRgb.rgbBlue = 0;
newRgb.rgbGreen = 0;
newRgb.rgbRed = 255;
newRgb.rgbReserved = 0;
fseek(fb, -sizeof(newRgb), 1);
fwrite(&newRgb, sizeof(newRgb), 1, fb);
return EXIT_SUCCESS;
}
}
 为什么进不到if里面呢 我是想把图片中的 黑色结构体改成 红色的 
我用的是vs2005

解决方案 »

  1.   

    删除while(1);
      

  2.   

    RGBQUAD newRgb; 就是自带的那个
      

  3.   

    typedef struct tagRGBQUAD { 
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;} 
    RGBQUAD;
      

  4.   

     16位的bmp文件的图像数据区中,每个像素用2个字节表示。未压缩时,低5位代表蓝色分量,中间5位代表绿色分量,高5位代表红色分量,最高一位保留,设为0.  
       根据像素点的各颜色分量的信息可以得到其RGB颜色值,由于每个颜色分量只用5位表示,即其最大值为31,因此很大一部分颜色值在16位的BMP图片中是不能够显示的。而且图片应该是很暗的。但是用ACDSEE,PS打开16位BMP图片,显示效果跟24位的BMP差不多。这是为什么呢? 把 5 位的 R ¦G ¦B 值转成 8 位的 R ¦G ¦B 值时,填充的是字节的高5位。相当于最大值为31*8=248, 而并非你说的填充在字节的低5位导致最大值为31把区间[0,31]映射到[0,255]就可以了,亮度低的问题不存在。  
    好的图象软件会用到抖动之类方法,在减少颜色数目时,提高逼真程度。基本原理:用设计好的几种颜色的组合来表示一种颜色。24色的bmp每一像素是8位r+8位g+8位b一共需要24位来存储一个像素 比如红色就是FF0000
    16位的bmp每一像素用16位表示,具体是5位r+6位g+5位b,这个就可点搞
    我现在需要一个算法来转换它们
    比如定义一个unsigned char 24bit[3]表示24位的一个像素,unsigned char 16bit[2]表示16位的一个像素 把从0到2的8次方之间的数字均匀地映射到0到2的5次方或6次方之间不就可以了吗?具体代码:
    void S_Gray(Graphics::TBitmap *Bmp)//灰阶效果
    {
    long Gray;
    BYTE *ptr;
    for (int y = 0; y < Bmp->Height; y++)
    {
    ptr =(BYTE *) Bmp->ScanLine[y];
    for (int x = 0; x < Bmp->Width*3; x+=3){
    Gray=299*ptr[x+2]+587*ptr[x+1]
    +114*ptr[x];
    ptr[x]=BYTE(Gray/1000);
    ptr[x+1]=BYTE(Gray/1000);
    ptr[x+2]=BYTE(Gray/1000);
    }
    }
    }是一个对应的过程,8位色彩表如何对应到5或6位色彩表R = (value & 0x0000F800) >> 8;
    G = (value & 0x000007E0) >> 3;
    B = (value & 0x0000001F) << 3;value = (R & 0x000000F8) << 8 | (G & 0x000000FC) << 3 | (B & 0x000000F8) >> 3;
      

  5.   

    你的printf里的输出是0:0:0的时候还是进不去吗?你可以直接赋值newRgb里的三色分量都是0还能不能进行去