)创建新的 BITMAPFILEHEADER和 BITMAPINFOHEADER memset(char *)&bf, O, sizeof( BI TMAPFILEHEADER)); memset((char *)&bi, 0, sizeof( BITMAPINFOHEADER)); ∥填写 BITMAPINFOHEADER头信息 bi. biSize=sizeof( BITMAPINFOHEADER) ∥|到图象的宽和高 bi bi Width=header xmax-header xmin+1 bi. biHeight=header. ymax-header ymin+ bi bi planes=l bi bi BitCount=8 bi bi Img Width=bi bi Width ImgHeight=bi. biHeight Num Colors=25 Line Bytes=(DWORD)WIDTHBYTES(bibi Width*bi. biBitCount) ImgSize=(DWORD)Line Bytes* bi. biHeight; ∥填写 BITMAPFILEHEADER头信息 bf bf Type=0x4d42 bf. bfSize=sizeof(BITMAPFILEHEADER+sizeof( BI TMAPINFOHEADER)+ NumColors*sizeof( RGBQUAD)+ImgSize, bf. bfoffBits=(DWORD )(Num Colors*sizeof( RGBQUAD)+ sizeof(BITMAPFILEHEADER)+sizeof( BITMAPINFOHEADER)) ∥.为新图分配缓冲区 if((hmg Data=GlobalAlloc(GHND, (DWORD) (sizeof( BI TMAPINFOHEADER)+ Num Colors*sizeof( RGBQUAD)+ImgSize))==NULL) Message Box(hWnd, Error alloc memory! ","Error Message MB OKJMB ICONEXCLAMATION): fclose(PCXfp) return False. Iplmg Data=(LPBITMAPINFOHE ADER)Global Lock(hlmg Data) ∥拷考贝头信息 memcpy(lplmg Data, (char *)&bi, sizeof( BITMAPINFOHEADER)) IpPtr=(char *)lplmg Datatsizeof(BITMAPINFOHEADER); ∥.256色调色板分配内存
} //创建新的 BITMAPFILEHEADER 和 BITMAPINFOHEADER memset((char *)&bf,0,sizeof(BITMAPFILEHEADER)); memset((char *)&bi,0,sizeof(BITMAPINFOHEADER)); //填写 BITMAPINFOHEADER 头信息 bi.biSize=sizeof(BITMAPINFOHEADER); //得到图象的宽和高 bi.biWidth=header.xmax-header.xmin+1; bi.biHeight=header.ymax-header.ymin+1; bi.biPlanes=1; bi.biBitCount=8; bi.biCompression=BI_RGB; ImgWidth=bi.biWidth; ImgHeight=bi.biHeight; NumColors=256; LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); ImgSize=(DWORD)LineBytes*bi.biHeight; //填写 BITMAPFILEHEADER 头信息 bf.bfType=0x4d42; bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ NumColors*sizeof(RGBQUAD)+ImgSize; bf.bfOffBits=(DWORD)(NumColors*sizeof(RGBQUAD)+ sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)); //为新图分配缓冲区 if((hImgData=GlobalAlloc(GHND,(DWORD) (sizeof(BITMAPINFOHEADER)+ NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL) { MessageBox(hWnd,"Error alloc memory!","ErrorMessage", MB_OK|MB_ICONEXCLAMATION); fclose(PCXfp); return FALSE; } lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); //拷贝头信息 memcpy(lpImgData,(char *)&bi,sizeof(BITMAPINFOHEADER)); lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER); //为 256 色调色板分配内存
hPal=LocalAlloc(lhnd, sizeof(LOGPALETTE)+ Num Colors* sizeof(PALETTEENTRY)) pPal =(LOGPALETTE *)LocalLock(hPal) pPal->pal Version=0X300 for(i=0,1<256;计++){ ∥读取调色板中的RGB值 Pal->palPal Entry[]. peRed=(BYTE)fgetc(PCXfp); pPal->palPal[i]. pe Green=(BYTE)fgetc( PCXfp) pPal->palPalEntry[i]- peBlue=(BYTE)fgetc( PCXfp); pPal->palPal[i] peFlags=(BYTE)0; *(IpPtr++=(unsigned char)pPal->palPalEntry[ i]- pe Blue (IpPtr++)(unsigned char)pPal->palPal Entry [i]- pe Green *(IpPtr++ =(unsigned char)pPal->palPalEntry[ i]- peRed *(lpPt++)=0 ∥产生新的逻辑调色板 hPalette=CreatePalette(pPal Local Unlock(hPal) Local Free(hPal) hDc=GetDC(hWnd) if(pAlette) hPrevPalette=SelectPalette(hDc, hPalette, FALSE) RealizePalette(hDc) ∥解码行所占的字节数 PexBytesPer Line=(unsigned int) header, bytes per line ∥将文件指针指向图象数据的开始处 seek(PCXfp, (LONG)Sizeof( PCXHEAD), SEEK SET) ∥缓冲区大小 OffBits=bf. bfoffBits-sizeof(BI TMAPFILEHEADER) BufSize为缓冲区大小 BufSize=OffBits+bi. biHeight*Line Bytes; for(y=0; y<bi. biHeight; y++) ∥指向新图中相应的位置 lpPtr=(char *)lplmg Data+ BufSize-Line Bytes-y*Line Bytes ∥解码该行,放在数组 LineBuffer中 ReadPcxLine(line Buffer, PCXfp)
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE)+ NumColors* sizeof(PALETTEENTRY)); pPal =(LOGPALETTE *)LocalLock(hPal); pPal->palNumEntries =256; pPal->palVersion = 0x300; for (i = 0; i < 256; i++) { //读取调色板中的 RGB 值 pPal->palPalEntry[i].peRed=(BYTE)fgetc(PCXfp); pPal->palPalEntry[i].peGreen=(BYTE)fgetc(PCXfp); pPal->palPalEntry[i].peBlue=(BYTE)fgetc(PCXfp); pPal->palPalEntry[i].peFlags=(BYTE)0; *(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peBlue; *(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peGreen; *(lpPtr++)=(unsigned char)pPal->palPalEntry[i].peRed; *(lpPtr++)=0; } //产生新的逻辑调色板 hPalette=CreatePalette(pPal); LocalUnlock(hPal); LocalFree(hPal); hDc=GetDC(hWnd); if(hPalette){ hPrevPalette=SelectPalette(hDc,hPalette,FALSE); RealizePalette(hDc); } //解码行所占的字节数 PcxBytesPerLine=(unsigned int)header.bytes_per_line; //将文件指针指向图象数据的开始处 fseek(PCXfp,(LONG)sizeof(PCXHEAD),SEEK_SET); //缓冲区大小 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); //BufSize 为缓冲区大小 BufSize=OffBits+bi.biHeight*LineBytes; for(y=0;y<bi.biHeight;y++){ //指向新图中相应的位置 lpPtr=(char *)lpImgData+BufSize-LineBytes-y*LineBytes; //解码该行,放在数组 LineBuffer 中 ReadPcxLine(LineBuffer,PCXfp);