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

本博客介绍了一种将图像从灰度转换为8位彩色的方法,包括内存分配、颜色值计算、调色板设置及图像显示的过程。
部署运行你感兴趣的模型镜像

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;

}

}

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值