您的位置:首页 > 编程语言

24位真彩色位图转换成8位灰度图片的代码实现

2011-10-13 18:00 841 查看
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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: