吃青苔的鱼及图片:如何在MFC中加载真彩色的图像资源啊

来源:百度文库 编辑:高考问答 时间:2024/04/30 21:08:51
在Bitmap中最大只能加载256色的图片,但我需要加载的真彩色图片转化成256色后,会严重失真。
哪位高手来指点一下阿,如果能够实现的话愿将自己的全部积分赠送
能说得详细些吗?我要把一个真彩色的图片放到一个图画框里作为背景色,然后再在上面做实时操作
怎么没人回答阿,再加50分

看一看这个不错的算法:
http://topic.csdn.net/t/20030506/16/1746457.html

最主要就是操作DIB ,简化RGB的值更接近256色!

void ChangeTo256(LPSTR pDIB)
{
// TODO: Add your control notification handler code here
if(pDIB==NULL)
{
MessageBox("error");
return;
}
BeginWaitCursor();
BYTE ired,igreen,iblue;
long p,q;
LPBITMAPINFOHEADER pnewbmpinfo;//新图像信息头
long lineGrayBytes=WIDTHBYTES(Width*8);//256色每行字节数
// long lineGrayBytes=(Width+3)&~3;//也可以
BYTE* lpdest;//新位图指针
lpdest=(BYTE*)::malloc(Height*lineGrayBytes);
memset(lpdest,0,lineGrayBytes*Height);//初始化为0
int n=0;
for(p=0;p<Height;p++)
for(q=0;q<Width;n++,q++)
{
ired=*(lpNewDIBBits+p*lineNewBytes+q*3+2);
igreen=*(lpNewDIBBits+p*lineNewBytes+q*3+1);
iblue=*(lpNewDIBBits+p*lineNewBytes+q*3);
lpdest[p*lineGrayBytes+q]=(BYTE)((float)(0.299*ired)+(float)(0.587*igreen)+(float)(0.114*iblue));
}
pnewbmpinfo->biBitCount=8;
//设置调色板
RGBQUAD* lpRGBquad;
lpRGBquad=(RGBQUAD*)&pDIB[sizeof(BITMAPINFOHEADER)];//在信息头后
for(p=0;p<=256;p++)
{
lpRGBquad[p].rgbRed=(unsigned char)p;
lpRGBquad[p].rgbGreen=(unsigned char)p;
lpRGBquad[p].rgbBlue=(unsigned char)p;

lpRGBquad[p].rgbReserved=0;
}
lpGrayDIBBits=::FindDIBBits(pDIB);
BYTE* lpSrc;//原图像
for(p=0;p<Height*lineGrayBytes;p++)
{
lpSrc=(BYTE*)lpGrayDIBBits+p;
*lpSrc=lpdest[p];
}
::free((void*)lpdest);
CClientDC dc(this);
CDC* pDC=(CDC*)(&dc);
::StretchDIBits(pDC->m_hDC,/*START_POINT_X*/0,/*START_POINT_Y*/0,Width,Height,0,0,Width,Height,lpGrayDIBBits,(LPBITMAPINFO)pDIB,DIB_RGB_COLORS,SRCCOPY);
EndWaitCursor();

}

方法:1。在画图里复制过来。
方法 2。动态创建