24位真彩色位图转换成8位灰度图片的代码实现
2011-10-13 18:00
771 查看
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;
}
}
{
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;
}
}
相关文章推荐
- 24位真彩色位图转换成8位灰度图片的代码实现
- 24位真彩色位图和8位灰度位图相互转换(C语言实现)
- Java实现24位真彩转换为8位灰度图片
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩色转换为8位灰度图片(完整代码)
- 将24位真彩色图转换为8位灰度图片
- 实现1位,4位,8位,24位BMP位图的互相转换的方法,32位转24位
- RGB彩色图像与灰度图像转换 opencv实现 代码及分析
- 8位位图和24位位图的相互转换
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- 24位转8位位图,不是灰度,有颜色的,尽量减少失真
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- android图片类型之间相互转换实现代码
- YUV序列下采样以及彩色4:2:0与灰度4:0:0转换---基于matlab实现
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- ios 彩色图片转换成灰度图片
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果