void CGrayDlg::OnToEignt()
{
if(date==NULL)
{
MessageBox("图像内容为空");
return;
}
memcpy(&eightfile,&fileheader,sizeof(fileheader));
eightinfo=(BITMAPINFO *)newBYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];//特别注意,重新分配调色板的BITMAPINF需要动态开辟内存空间,这样调色板才可以被赋值进去
memcpy(eightinfo,&bitinfo,sizeof(bitinfo));//先初始化信息头文件
intl=bitinfo.bmiHeader.biWidth*bitinfo.bmiHeader.biHeight;//计算新的文件大小
if(eight!=NULL)
{
delete []eight;
eight=NULL;
}
//开辟内存并且初始化
eight=new BYTE[l];
memset(eight,255,l);
BYTE temp,r,g,b;
temp=r=g=b=0;
int line=bitinfo.bmiHeader.biWidth*3;
//一下进行赋值操作
for(inti=0;i<bitinfo.bmiHeader.biHeight;i++)
for(intj=0;j<bitinfo.bmiHeader.biWidth;j++)
{
r=date[i*line+3*j];g=date[i*line+3*j+1];b=date[i*line+3*j+2];//获得rgb的值
temp=(BYTE)((77*r+151*g+28*b)>>8);
eight[i*line/3+j]=temp;
}
//以下对调色板进行处理
CGrayDlg::SetRGBQUAD(rgbquad);
memcpy((BYTE*)eightinfo+sizeof(BITMAPINFOHEADER),rgbquad,256*sizeof(RGBQUAD));//对调色板进行赋值,注意eightinfo的指针应该向后移动到指定位置
eightinfo->bmiHeader.biClrUsed=256;
eightinfo->bmiHeader.biSizeImage=l;
eightinfo->bmiHeader.biBitCount=8;
eightfile.bfSize=sizeof(eightfile)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)+l;
eightfile.bfOffBits=eightfile.bfSize-l;
int w=eightinfo->bmiHeader.biWidth;
int y=eightinfo->bmiHeader.biHeight;
StretchDIBits(GetDC()->GetSafeHdc(),200,100,w,y,0,0,w,y,eight,eightinfo,DIB_RGB_COLORS,SRCCOPY);
}
void CGrayDlg::SetRGBQUAD(RGBQUAD *rgbquad)
{
inti=0;
for(i=0;i<=255;i++)
{
rgbquad[i].rgbBlue=i;
rgbquad[i].rgbGreen=i;
rgbquad[i].rgbRed=i;
rgbquad[i].rgbReserved=0;
}
}