我想实现灰度图的伪彩色处理,不过不知道我写的代码哪里出现了问题,希望各位大神能帮我看看!
//写入另一个文件
fp=fopen(sfilename1,"wb");
//以下定义中带“3”的都是新图像信息。
BITMAPFILEHEADER bf3;
BITMAPINFOHEADER bi3;
int nBytesPerLine3 = (bi.biWidth*3+3)/4*4;//(bi.biWidth*3+3)/4*4是24位真彩图每一行占的实际字节数
int nImageSize3 = nBytesPerLine3 * bi.biHeight;
memcpy( &bi3, &bi, sizeof(BITMAPINFOHEADER) );
bi3.biBitCount=24;//修改头文件以及数据结构信息
bi3.biClrImportant=0;
bi3.biClrUsed=0;
bi3.biCompression=BI_RGB;
bi3.biHeight=bi2.biHeight;
bi3.biWidth=bi2.biWidth;
bf3.bfSize = sizeof(BITMAPINFOHEADER);
bi3.biXPelsPerMeter=0;
bi3.biYPelsPerMeter=0;
bi2.biSizeImage=nImageSize2;
fwrite(&bf3,sizeof(BITMAPFILEHEADER),1,fp);//写入位图头信息以及数据结构信息
fwrite(&bi3,sizeof(BITMAPINFOHEADER),1,fp);
for(i=0;i<bi.biHeight;i++)//实现灰度到彩色变换
{
nLineStart2 = nBytesPerLine2 * i;//nBytesPerLine2是灰度图每一行的字节数
for(j=0;j<nBytesPerLine2;j++)
{
if(ImgData2[nLineStart2+j]<=64)//ImgData2[nLineStart2+j]是对应灰度图的灰度值
{
R=0;
G=(int)4*(ImgData2[nLineStart2+j]);
B=255;
}
if(ImgData2[nLineStart2+j]>64
&& ImgData2[nLineStart2+j]<=128)
{
R=0;
G=255;
B=(int)4*(128-ImgData2[nLineStart2+j]);
}
if(ImgData2[nLineStart2+j]>128
&& ImgData2[nLineStart2+j]<=192)
{
R=(int)4*(ImgData2[nLineStart2+j]-128);
G=255;
B=0;
}
if(ImgData2[nLineStart2+j]>192
&& ImgData2[nLineStart2+j]<=255)
{
R=255;
G=(int)4*(255-ImgData2[nLineStart2+j]);
B=0;
}
Imgdata[i][3*j]=R;
Imgdata[i][3*j+1]=G;
Imgdata[i][3*j+2]=B;
}
}
CStringstr4;
str4.Format("%d",Imgdata[100][50]);
MessageBox(str4);
for(i=0;i<bi.biHeight;i++)
{
nLineStart2 = nBytesPerLine2 * i;
for(j=0;j<3*nBytesPerLine2;j++)
{
fwrite(&Imgdata[i][j],1,1,fp); //写入位图信息
}
}
free(Imgdata);
fclose(fp);
这是我写的部分代码,前面有将图片转换为灰度图的代码,后面则是显示处理后的图片,不知道哪里出现问题,这个图片一直都显示的是没有,希望各位大神帮我看看 图片 伪彩色处理 MFC C++
[解决办法]
先不管灰度转换,直接写一个RGB的BMP文件看看正常不?