如题,如何通过程序将位图转换为256色。

解决方案 »

  1.   

    BOOL   WINAPI   TruecolorTo256(LPSTR   lpDIB,   LONG   lWidth,   LONG   lHeight)   
      {   
      LONG i;   
      LONG j;   
        
      LPSTR lpDIBBits;   
      LPSTR lpTemplateDIBBits;   
        
        
      BYTE   * lpSrc;   
      BYTE   *   lpDst;   
        
      //ͼÏñÿÐеÄ×Ö½ÚÊý   
      LONG lSrcLineBytes;   
      LONG lDstLineBytes;   
        
      //Ö¸ÏòDIBµÄÖ¸Õë   
      LPSTR lpTemplateDIB;   
      HLOCAL hTemplateDIB;   
        
      //Ö¸ÏòBITMAPINFOHEADERµÄÖ¸Õë   
      LPBITMAPINFOHEADER lpBIH;   
        
      //Ö¸ÏòBITMAPINFOµÄÖ¸Õë   
      LPBITMAPINFO lpBI;   
        
      //¼ÆËãת»»Ç°DIB³¤¶È   
      DWORD dwSrcDIBSize = sizeof(BITMAPINFOHEADER)   +   lWidth   *   lHeight   *   3;   
      //¼ÆËãת»»ºóDIB³¤¶È   
      DWORD dwDesDIBSize =   sizeof(BITMAPINFOHEADER)   +   4   *   256     
      +   lWidth   *   lHeight;   
        
      //ΪDIB·ÖÅäÄÚ´æ   
      hTemplateDIB   =   GlobalAlloc(LHND,   dwDesDIBSize   *   8);   
        
      if(   hTemplateDIB   ==   NULL)   
      {   
      //ÄÚ´æ·ÖÅäʧ°Ü£¬·µ»ØFALSE   
      return   FALSE;   
      }   
        
      //Ëø¶¨ÄÚ´æ   
      lpTemplateDIB   =   (LPSTR)   ::GlobalLock((HGLOBAL)   hTemplateDIB);   
        
      //¼ÆËãͼÏñÿÐеÄ×Ö½ÚÊý   
      lSrcLineBytes   =   WIDTHBYTES(lWidth   *   8   *   3);   
      lDstLineBytes   =   WIDTHBYTES(lWidth   *   8);   
        
      //¸³³õÖµ   
      memcpy(lpTemplateDIB,   lpDIB,   sizeof(BITMAPINFOHEADER));   
      lpBIH   =   (LPBITMAPINFOHEADER)   lpTemplateDIB;   
      lpBI   =   (LPBITMAPINFO)   lpTemplateDIB;   
      lpBIH->biBitCount   =   8;   
        
      //ÕÒµ½DIBͼÏñµÄÏñËØÆðʼλÖà  
      lpDIBBits   =   ::FindDIBBits(lpDIB);   
      lpTemplateDIBBits   =   ::FindDIBBits(lpTemplateDIB);   
        
      for(i   =   0;   i   <   256;   i++)   
      {   
      lpBI->bmiColors[i].rgbRed =   (BYTE)i;   
      lpBI->bmiColors[i].rgbGreen =   (BYTE)i;   
      lpBI->bmiColors[i].rgbBlue =   (BYTE)i;   
      lpBI->bmiColors[i].rgbReserved =   0x00;   
      }   
        
      for(i   =   0;   i   <   lHeight;   i++)   
      {   
      for(j   =   0;   j   <   lWidth;   j++)   
      {   
      //&Ouml;&cedil;&Iuml;ò&Ocirc;&shy;&Iacute;&frac14;&Iuml;&ntilde;&ordm;&Iacute;&Auml;&iquest;&micro;&Auml;&Iacute;&frac14;&Iuml;&ntilde;&micro;&Auml;&micro;&Uacute;i&ETH;&ETH;&pound;&not;&micro;&Uacute;j&cedil;&ouml;&Iuml;&ntilde;&Euml;&Oslash;&micro;&Auml;&Ouml;&cedil;&Otilde;&euml;   
      lpSrc   =   (unsigned   char   *)lpDIBBits   +   lSrcLineBytes   *   i   +   j   *   3;   
      lpDst   =   (unsigned   char   *)lpTemplateDIBBits   +   lDstLineBytes   *   i   +   j;   
        
      //&cedil;&oslash;×&ordf;&raquo;&raquo;&ordm;ó&micro;&Auml;&Iacute;&frac14;&Iuml;&ntilde;&Iuml;&ntilde;&Euml;&Oslash;&cedil;&sup3;&Ouml;&micro;   
      *lpDst   =   (BYTE)(0.299   *   (*lpSrc)   +   0.587   *   (*(lpSrc+1))   
      +   0.114   *   (*(lpSrc+2)));   
      }   
      }   
      memset(lpDIB,   0,   dwSrcDIBSize);   
      memcpy(lpDIB,   lpTemplateDIB,   dwDesDIBSize);   
        
      //&Ecirc;&Iacute;·&Aring;&Auml;&Uacute;&acute;&aelig;   
      GlobalUnlock(hTemplateDIB);   
      GlobalFree(hTemplateDIB);   
        
      return   TRUE;   
      } 
    这个以前别人问过~~
      

  2.   

    http://www.lihuasoft.net/article/show.php?id=3013http://community.csdn.net/Expert/topic/4904/4904566.xml?temp=.357815
      

  3.   

    http://www-scf.usc.edu/~flv/ipbook/chap05.htm
    这个是真彩色转256的
    他用的是最小平方误差来取近似颜色
    //其余的颜色依据最小平方误差近似为前256中最接近的一种     if (PalCounts > 256){              for (i = 256; i < PalCounts; i++){                     //ColorError1记录最小平方误差,一开始赋一个很大的值                     ColorError1=1000000000;//由12位索引值得到R,G,B的最高4位值                     Blue = (long)((ColorIndex[i] & 0xf00) >> 4);                     Green = (long)((ColorIndex[i] & 0x0f0));                     Red = (long)((ColorIndex[i] & 0x00f) << 4);                     ClrIndex = 0;                     for (j = 0; j < 256; j++){                            //ColorError2计算当前的平方误差                            ColorError2=(long)(Blue-pPal->palPalEntry[j].peBlue)*(Blue-pPal->palPalEntry[j].peBlue)+ (long)(Green-pPal->palPalEntry[j].peGreen)*(Green-pPal->palPalEntry[j].peGreen)+                                  (long)(Red-pPal->palPalEntry[j].peRed)*(Red-pPal->palPalEntry[j].peRed); if (ColorError2 < ColorError1){ //找到更小的了                                   ColorError1 = ColorError2;                                   ClrIndex = j; //记录对应的调色板的索引值                  }                     }