以下是将32位真彩色转换成16色的部分代码,转换后得到图形基本正确,但有点模糊,文字棱角不清
是不是下面代码中存在运算误差?请大侠们帮帮看看,谢了!(注:不是因为颜色丢失,源图本身只用到了16种颜色) //源位图数据已经存放在srcBuffer1缓冲区中
//转换后存放在dstBuffer缓冲区中
int r,g,b;
for(int y=0;y<270;y++)//源图共270行,每行640个像素点
{
for(int x=0;x<640;x+=2)
{
//转换前1个颜色值
r=srcBuffer1[y*640*4 +x*4 +2];
g=srcBuffer1[y*640*4 +x*4 +1];
b=srcBuffer1[y*640*4 +x*4 +0];
COLORREF c=(b<<16) | (g<<8) | r;
BYTE H=mypalette.GetNearestPaletteIndex(c);//mypalette是已定义好的16色调色板 //转换后1个颜色值
r=srcBuffer1[y*640*4 +x*4 +6];
g=srcBuffer1[y*640*4 +x*4 +5];
b=srcBuffer1[y*640*4 +x*4 +4];
c=(b<<16) | (g<<8) | r; //两个颜色值合并赋给目标缓冲区
BYTE L=mypalette.GetNearestPaletteIndex(c);
BYTE en=H<<4 | L;
dstBuffer[y*320+x/2]=en;
}
}

解决方案 »

  1.   

    //我的16色调色板是这样定义的,不知对不对,或还缺少点什么?
        CClientDC dc(this);
        LOGPALETTE *pLogPalette;
        pLogPalette=(LOGPALETTE*) new char[sizeof(LOGPALETTE)+16*sizeof(PALETTEENTRY)];
        pLogPalette->palVersion=0x300;
        pLogPalette->palNumEntries=16;
        for(int i=0;i<16;i++)
        {
            pLogPalette->palPalEntry[i].peRed=(unsigned char)(i*16);
            pLogPalette->palPalEntry[i].peGreen=(unsigned char)(i*12);
            pLogPalette->palPalEntry[i].peBlue=(unsigned char)(i*8);
            pLogPalette->palPalEntry[i].peFlags=0;
        }
        CPalette mypalette;
        mypalette.CreatePalette(pLogPalette);
        delete []pLogPalette;
        CPalette* pOldPalette=dc.SelectPalette(&mypalette,FALSE);
        dc.RealizePalette();