我的方法是将调色板内容读出来,每个颜色的三个分量(R,G,B)值都变为(R+G+B)/3(做255次循环),然后再把结果写入文件。但是这样结果并没有改变彩色,哪位能帮我看下代码有何问题吗?
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
LONG m_lWidth;
LONG m_lHeight;
unsigned c;
LONG Gray[255] = {0};
RGBQUAD rgb[255]; string image = "d:\\sun.bmp";
const char* fn = image.c_str(); BITMAPINFOHEADER m_bih;
BITMAPFILEHEADER m_bi;
FILE *fp = fopen(fn,"rb+");

fread(&m_bi, sizeof(BITMAPFILEHEADER), 1,fp);
fseek(fp, sizeof(BITMAPFILEHEADER), SEEK_SET);

fread(&m_bih, sizeof(BITMAPINFOHEADER),1, fp);
fseek(fp, m_bi.bfOffBits, SEEK_SET); m_lWidth = m_bih.biWidth;
LONG byteline = (m_lWidth*m_bih.biBitCount+31)/32*4;
m_lHeight = m_bih.biHeight;

for(int i=0; i<255;i++)              //读取调色板信息
{
fread(&(rgb[i]),sizeof(RGBQUAD),1,fp); }

BYTE p[byteline];
BYTE pImageData[m_lHeight][byteline];

fseek(fp, m_bi.bfOffBits+sizeof(rgb), SEEK_SET);  //读取像素信息,并存入pImageData
for(int i=0;i<m_lHeight;i++)
{
fread(p,byteline,1,fp);
for(int j=0;j<byteline;j++)
{
pImageData[i][j] = p[j];

}
} fseek(fp, 0, SEEK_SET);
fwrite(&m_bi,sizeof(BITMAPFILEHEADER),1,fp);
fseek(fp, sizeof(BITMAPFILEHEADER), SEEK_SET);
fwrite((void*)&m_bih,1,sizeof(BITMAPINFOHEADER),fp);
fseek(fp, m_bi.bfOffBits, SEEK_SET);
for(int i=0; i<=255;i++)                         //修改调色板R=G=B
{
rgb[i].rgbBlue=rgb[i].rgbGreen= rgb[i].rgbRed=
                          (rgb[i].rgbBlue + rgb[i].rgbGreen + rgb[i].rgbRed)/3;
}

for(int i=0;i<255;i++)                           //写入调色板信息
{
fwrite(rgb,sizeof(RGBQUAD),1,fp);
}

fseek(fp, m_bi.bfOffBits+sizeof(rgb), SEEK_SET);  //写入像素信息
for(int i=0;i<m_lHeight;i++)
{
for(int j=0;j<byteline;j++)
{
p[j] = pImageData[i][j];
}
frwite(p,byteline,1,fp);
}
ShellExecute(NULL,"open","d:\\sun.bmp","","",SW_SHOW);
fclose(fp);

}

解决方案 »

  1.   

    http://www.codeguru.com/cpp/g-m/bitmap/article.php/c4927/
      

  2.   

    for(int i=0;i<255;i++)                           //写入调色板信息
    {
    fwrite(rgb,sizeof(RGBQUAD),1,fp);
    }
    这里的rgb没有加下标,是笔误吗?
      

  3.   

    笔误,改为
    for(int i=0;i<255;i++)                           //写入调色板信息
    {
       fwrite(&rgb[i],sizeof(RGBQUAD),1,fp);
    }
    还是没有写入似乎
      

  4.   

    我的方法是将调色板内容读出来,每个颜色的三个分量(R,G,B)值都变为(R+G+B)/3(做255次循环),然后再把结果写入文件。但是这样结果并没有改变彩色,哪位能帮我看下代码有何问题吗?
    ==========================================================
    暂未看你的代码。但有几条建议:1、并不是所有256色的BMP图都有PALETTE;首先确认你的位图有调色板;2、256色只需要一个字节即可代表一个像素,请确认你的调色板是24位或32位的。
      

  5.   

    应该有调色板的,程序里都可以读出来啊;我是把jpg的图片用画图工具另存为256色bmp位图得到的sun.bmp(当然有颜色丢失),一个字节代表一个像素啊;