DstBi bi ClrUsed=O DstBi bi BitCount=8 ∥ OrbIts为到实际位图数据的偏移值 OffBits-bf. bfOffBits-sizeof( BITMAPFILEHEADER) ∥ SrcBufsize为原图缓冲区的大小 SrcBufsize=offBits+bi bi Height "Line Bytes if(hTemplmg Data=LocalAlloc(LHND, Dst BufSize))==NULL) Message Box(hWnd, Error alloc memory! ", "Error Message", MB OK MB ICONEXCLAMATION return False. Iplmg Data=(LPBITMAPINFOHEADER)GlobalLock(hlmg Data) lpTemplmg Data=(LPBITMAPINFOHEADER)LocalLock(h Data ∥拷考贝位图数据 memcpy(lp Templmg Data, lplmg Data, OffBits) )新的头信息取代旧的头信息 memcpy(lp Templmg Data, (char *)&Dst Bi, sizeof( BITMAPINFOHEADER)) ∥ ColorHits为记录颜色使用频率的数组, Colorindex为记录颜色索引值的 ∥数组 ∥,全部清零 nemset( Color Hits, 0, 4096*sizeof(DWORD)) memset( ColorIndex, 0, 4096*sizeof( WORD)) for(y=0; y<bi. biHeight; y++) lpPtr=(unsigned char *)Iplmg Data+(SrcBufSize-Line Bytes-y* Line Bytes) for(x=0 X<bi bi Width; x++) G,B各取4位 Blue=(int )(*(pPtr++)& Oxf0) Green=(int)(*(IpPtr++)& Oxf0); Red=(int )(*(IpPtr++)& Oxfo); 拼成一个12位整数 ClrIndex=( Blue<<4)+ Green +(Red >>4); ∥相应的数组元素加 Color Hits( CIrlndex + PalCounts=O ∥将为零的元素清除出去
DstBi.biClrUsed=0; DstBi.biBitCount=8; //OffBits 为到实际位图数据的偏移值 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); //SrcBufSize 为原图缓冲区的大小 SrcBufSize=OffBits+bi.biHeight*LineBytes; if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL) { MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK| MB_ICONEXCLAMATION); return FALSE; } lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); //拷贝位图数据 memcpy(lpTempImgData,lpImgData,OffBits); //用新的头信息取代旧的头信息 memcpy(lpTempImgData,(char *)&DstBi,sizeof(BITMAPINFOHEADER)); //ColorHits 为记录颜色使用频率的数组,ColorIndex 为记录颜色索引值的 //数组 //先全部清零 memset(ColorHits,0,4096*sizeof(DWORD)); memset(ColorIndex,0,4096*sizeof(WORD)); for(y=0;y<bi.biHeight;y++){ lpPtr=(unsigned char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes); for(x=0;x<bi.biWidth;x++){ //R,G,B 各取 4 位 Blue=(int)(*(lpPtr++) & 0xf0); Green=(int)(*(lpPtr++) & 0xf0); Red=(int)(*(lpPtr++) & 0xf0); //拼成一个 12 位整数 ClrIndex=(Blue<<4) + Green +(Red >>4); //相应的数组元素加 1 ColorHits[ClrIndex]++; } } PalCounts=0; //将为零的元素清除出去
for(CIrlndex =0; ClrIndex <4096; ClrIndex++) if( Color Hits(ClrIndex =0) ColorHits( Pal Counts]=Color Hits[ ClrIndex] ∥/注意调整相应的索引值 ColorIndex PalCounts]=ClrIndex Acounts++;∥颜色数加1 )起泡排序将 PalCounts种颜色按从大到小的顺序排列 for(i=0; 1< PalCounts-1; 1++) for(=i+ 1; j< PalCounts: j++)1 if Color[L> ColorHitsiDi Color Hits[]=ColorHits[I Color Hits[]=temp: ∥注意调整相应的索引值 temp=ColorIndex[] ColorIndex[i]=ColorIndex ColorIndex[]=(WORD)temp ∥.新的调色板分配内存 hPal=LocalAlloc(LHND, sizeof(LOGPALETTE)+ 256* sizeof( PALETTEENTRY)) pPal =(LOGPALETTE *)LocalLock(hPal); pPal->palNum Entries=(WORD)256 Pal->pal Version =0x30 IpTempPtr=(char *)lp Templmg Datatsizeof( BITMAPINFOHEADER) for(i=0,1<256;计++){ ∥由12位索引值得到R,G,B的最高4位值 oPal->palPal Entry i]. peRed=(BYTE)((ColorIndex[i]& 0x00f)<<4); pPal->palPal[] pe Green=(BYTE)((ColorIndex[i]& Oxofo)) pPal->palPal[i] peBlue=(BYTE ((ColorIndex[i]& Oxf00)>>4); pPal->palPalEntry[i]-peFlagS=(BYTE)O *(IpTempPtr++ =(unsigned char ) ColorIndex[]& Oxf00)>>4) "(pTempPtr++)=(unsigned char )((ColorIndex[i]& Oxof0)); *(IpTempPtr++)=(unsigned char)((ColorIndex[i]& Oxo0f)<< 4)
for (ClrIndex = 0; ClrIndex < 4096; ClrIndex++) { if(ColorHits[ClrIndex]!=0){ ColorHits[PalCounts]=ColorHits[ClrIndex]; //注意调整相应的索引值 ColorIndex[PalCounts]=ClrIndex; PalCounts++; //颜色数加 1 } } //用起泡排序将 PalCounts 种颜色按从大到小的顺序排列 for (i = 0; i < PalCounts-1; i++) for (j = i + 1; j < PalCounts; j++){ if (ColorHits[j] > ColorHits[i]){ temp = ColorHits[i]; ColorHits[i] = ColorHits[j]; ColorHits[j] = temp; //注意调整相应的索引值 temp = ColorIndex[i]; ColorIndex[i] = ColorIndex[j]; ColorIndex[j] = (WORD)temp; } } //为新的调色板分配内存 hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + 256* sizeof(PALETTEENTRY)); pPal =(LOGPALETTE *)LocalLock(hPal); pPal->palNumEntries =(WORD) 256; pPal->palVersion = 0x300; lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER); for (i = 0; i < 256; i++) { //由 12 位索引值得到 R,G,B 的最高 4 位值 pPal->palPalEntry[i].peRed=(BYTE)((ColorIndex[i] & 0x00f) << 4); pPal->palPalEntry[i].peGreen=(BYTE)((ColorIndex[i] & 0x0f0)); pPal->palPalEntry[i].peBlue=(BYTE)((ColorIndex[i] & 0xf00) >> 4); pPal->palPalEntry[i].peFlags=(BYTE)0; *(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0xf00) >> 4); *(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x0f0)); *(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x00f) << 4);