比如24色降成8色是这样:Code:
void   CMainDoc::Convert24to8(HDIB   hdib)   
{   
  DWORD   dwLen;   
  BYTE   *ptr1;   
  BYTE   *ptr2;   
  BITMAPINFOHEADER   bi;           
  LPBITMAPINFOHEADER   lpbi;   
  HANDLE   hTempImage   =   NULL;   
  LPRGBQUAD   lprgb;   
  register   int   j,i;  
 
  if(   hdib   ==   0   )   
   return   ;     dwLen   =   GlobalSize   (hdib);   
  DibInfo   (hdib,   &bi);   
  if(bi.biBitCount!=24)   
   return;     bi.biWidth   =   (WORD)(   (bi.biWidth   +   3)   /4   )   *   4;   
  dwLen   =   bi.biSize   +   1024+bi.biHeight*bi.biWidth;   
  hTempImage   =   ::GlobalAlloc(GHND,   dwLen);   
  ptr1   =   (BYTE   *)GlobalLock(hdib);   
  ptr2   =   (BYTE   *)GlobalLock(hTempImage);   
  lpbi   =   (LPBITMAPINFOHEADER)ptr2;   
  lpbi->biSizeImage   =   bi.biHeight*bi.biWidth;   
  lpbi->biPlanes   =   bi.biPlanes;   
  lpbi->biSize   =   bi.biSize;   
  lpbi->biWidth   =   bi.biWidth;   
  lpbi->biHeight   =   bi.biHeight;   
  lpbi->biClrUsed   =   256;   
  lpbi->biBitCount   =   8;     ptr2   +=   bi.biSize   ;   
  lprgb   =   (LPRGBQUAD)ptr2;   
  for(   j=0;j<256;j++,lprgb++   )   
  {   
      lprgb->rgbBlue   =   j;             //   fill   in   256   gray   
      lprgb->rgbGreen   =   j;   
      lprgb->rgbRed   =   j;   
      lprgb->rgbReserved   =   0;   
  }     ptr1   +=   bi.biSize;   
  ptr2   +=   1024;   
  //Y   =   0.299*R   +   0.587*G   +   0.114*B     for(   j=0;j<bi.biHeight*bi.biWidth;j++   )   
  {         
   *ptr2   =   (int)((*ptr1)*0.114   +   (*(ptr1+1))*0.587   +   (*(ptr1+2))*0.299);       
  ptr1+=3 ;   
  ptr2++;   
  }   
  GlobalUnlock(hTempImage);   
  GlobalFree(hdib); 
  
  hdib   =   (HDIB)CopyHandle(hTempImage   );   
  GlobalFree(hTempImage);   
  }   下面这一行不明白,为什么?
降色的时候只是调色盘变了,为什么图片数据也要更改呢?而且为什么是0.114,0.587,0.299?
*ptr2   =   (int)((*ptr1)*0.114   +   (*(ptr1+1))*0.587   +   (*(ptr1+2))*0.299);   知道了帮忙解释下?谢谢!!!!!    

解决方案 »

  1.   

    我想是因为高于256色的DIB位图,每一个象素中就有颜色信息,不需要调色板,而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.至于具体公式我也不知道为什么,你可能可以从相关书上看到.
      

  2.   

    to:
    我想是因为高于256色的DIB位图,每一个象素中就有颜色信息,不需要调色板,而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.至于具体公式我也不知道为什么,你可能可以从相关书上看到.
    而低于256色的DIB象素的颜色需要和调色板对应,两者象素不一样的性质,所以要改变图象数据.我认为底于256色的DIB图象仅需调整调色板就可以!
      

  3.   

    4色的图象的数据是索引值,并不是RGB的值!底于256色的DIB图象转化为其他小于256色的图象仅需调整调色板就可以?
    是不是这样呀?大家知道的说下呀?谢谢!
      

  4.   

    你的代码应该是转灰度。
    0.114,0.587,0.299 是RGB转会度的经验参数。24位转256色,不是那么容易。需要计算如何取色,如何转换...