有一幅jpeg图像,我读入其数据后,然后按bmp格式保存,结果保存后图片跟原来图片颜色差异很大,不知道什么原因,望高手指点一下,谢谢!我用得代码如下: //位图信息头参数相关设置
BITMAPINFOHEADER *InfoHeader=new BITMAPINFOHEADER;
memset(InfoHeader,0,sizeof(BITMAPINFOHEADER));
InfoHeader->biSize =sizeof(BITMAPINFOHEADER);
InfoHeader->biPlanes =1;
InfoHeader->biBitCount =24;
InfoHeader->biCompression =0;
InfoHeader->biWidth =cinfo.image_width;  //设置信息头的参数之一---图片宽度
InfoHeader->biHeight =height;
InfoHeader->biSizeImage =height*cinfo.image_width*cinfo.num_components;

        //位图文件头参数相关设置
memset(fileheader,0,sizeof(BITMAPFILEHEADER));
fileheader->bfType =0x4D42;
fileheader->bfSize =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+height*cinfo.image_width*cinfo.num_components;
fileheader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); /********************************************************/
FILE *fp;
char *path="E:\\VC++\\project\\ferrograph\\temp.bmp";
if((fp=fopen(path,"wb"))==0)//输入要打开的文件
{
return;
}
fwrite(fileheader,1,sizeof(BITMAPFILEHEADER),fp);
fwrite(InfoHeader,1,sizeof(BITMAPINFOHEADER),fp);
fwrite(m_pData,sizeof(BYTE),height*cinfo.image_width*cinfo.num_components,fp);//m_pData是图像数据,这个绝对没有问题,我用它跟matlab读取的像素值对照过了
/********************************************************/

解决方案 »

  1.   

    自已顶一下,height为图像的高度,cinfo.image_width为图像的宽度,fileheader已经在别处定义过了
      

  2.   

     
    wjqzzzy
     
    (天华) 等 级: 
    结帖率:0.00% 
    先贴个图看看吧?
    是否有图形错位现象?
    还是仅仅颜色对应有问题?
    代码太少,看不出来。
      

  3.   

    InfoHeader->biSizeImage =height*cinfo.image_width*cinfo.num_components;
    这句应该有问题
      

  4.   

    获取高宽 CImage读取硬盘数据 BitBlt到内存Image 调用Save指定格式搞定
      

  5.   

    同意楼上的看法
    好像m_pData里的数据都是32位的

    InfoHeader->biBitCount =24;
    改成
    InfoHeader->biBitCount =32;
    试试
      

  6.   

    谢谢各位,我最昨天发现在问题的地方了,jpg图片读进来的时候R、G、B排列位位置与bmp图片读进来的不一样,要将每个像素的R与B对换一下就行了,不过不是感谢各位,2楼分析得很全面