#ifndef _CDIBUTIL #define _CDIBUTIL class CDIBUtil { public: CDIBUtil(); ~CDIBUtil(); BOOL SetupBmpHeader(BITMAPINFOHEADER *pbiHeader, int width, int height, int bits, BOOL TopDown, int Resolution) { BOOL bSuccess = TRUE; int WidthBytes = 0; pbiHeader->biSize = sizeof(BITMAPINFOHEADER); pbiHeader->biWidth = width; pbiHeader->biHeight = height * ((TopDown==TRUE)?-1:1); pbiHeader->biPlanes = 1; pbiHeader->biBitCount = (BYTE)bits; pbiHeader->biCompression = 0; pbiHeader->biXPelsPerMeter = int(Resolution * 39.37); pbiHeader->biYPelsPerMeter = int(Resolution * 39.37); pbiHeader->biClrUsed = 0; pbiHeader->biClrImportant = 0; switch (bits) { case 1: WidthBytes = (width+7)/8; pbiHeader->biClrUsed = 2; break; case 8: WidthBytes = width; pbiHeader->biClrUsed = 256; break; case 24: WidthBytes = width*3; pbiHeader->biClrUsed = 0; break; default: WidthBytes = 0; bSuccess = FALSE; break; } pbiHeader->biSizeImage = WidthToDIBWidth(WidthBytes)*height; // not used for compression return bSuccess; } void FillPalette (int NumPaletteEntries, tagRGBQUAD* pPal) { if (NumPaletteEntries>1) { for (int i=0; irgbRed = (BYTE)Val; pPal->rgbGreen = (BYTE)Val; pPal->rgbBlue = (BYTE)Val; pPal->rgbReserved = 0; pPal++; } } } void FillLogPalette (int NumPaletteEntries, LOGPALETTE* pPal) { if (NumPaletteEntries>2) { for (int i=0; ipalPalEntry[i].peRed = (BYTE)i; pPal->palPalEntry[i].peGreen = (BYTE)i; pPal->palPalEntry[i].peBlue = (BYTE)i; pPal->palPalEntry[i].peFlags = 0; } } else { // B/W Palette pPal->palPalEntry[0].peRed = (BYTE)255; pPal->palPalEntry[0].peGreen = (BYTE)255; pPal->palPalEntry[0].peBlue = (BYTE)255; pPal->palPalEntry[0].peFlags = 0; pPal->palPalEntry[1].peRed = (BYTE)0; pPal->palPalEntry[1].peGreen = (BYTE)0; pPal->palPalEntry[1].peBlue = (BYTE)0; pPal->palPalEntry[1].peFlags = 0; } } BOOL RawColorToDIB(int BitsPerPixel, BYTE* pDest, BYTE* pSrc, int Width, int Height) { BOOL bSuccess = FALSE; switch (BitsPerPixel) { case 1: bSuccess = RawColorToBinaryDIB (pDest, pSrc, Width, Height); break; case 8: bSuccess = RawColorToGrayDIB (pDest, pSrc, Width, Height); break; case 24: bSuccess = RawColorToColorDIB(pDest, pSrc, Width, Height); break; default: break; } return bSuccess; } BOOL RawColorToBinaryDIB(BYTE* pDest, BYTE* pSrc, int Width, int Height) { BOOL bSuccess = TRUE; BYTE* ptDest = NULL; BYTE* ptSrc = NULL; int BitIdx = 0; BYTE Bits = 0; BYTE GrayByte = 0; for (int i=0; i < Height; i++) { ptDest = pDest + (i*WidthToDIBWidth((Width+7)/8)); ptSrc = pSrc + i*Width*3; BitIdx = 0; Bits = 0; for (int j=0; j < Width; j++) { GrayByte = (BYTE)((ptSrc[0] * 11 + ptSrc[1] * 59 + ptSrc[2] * 30)/100); Bits *= 2; if (GrayByte > 128) Bits += 1; BitIdx++; if (BitIdx >= 8) { BitIdx = 0; *ptDest++ = Bits; } ptSrc += 3; } // Write out the last byte if matters if (BitIdx) *ptDest = Bits; } return bSuccess; } BOOL RawColorToGrayDIB(BYTE* pDest, BYTE* pSrc, int Width, int Height) { BOOL bSuccess = TRUE; BYTE* ptDest = NULL; BYTE* ptSrc = NULL; for (int i=0; ibmiHeader.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nNumPaletteEntries; bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nNumPaletteEntries; // write to disk // Write(&bmfHeader,sizeof(BITMAPFILEHEADER)); // Write(pDIB,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nNumPaletteEntries+pBitmap->bmiHeader.biSizeImage); // unlock memory GlobalUnlock(hDIB); bSuccess = TRUE; } return bSuccess; } void GrayTo24bitColorDIB(BYTE* pSrc, int WidthPixels, int Height) { BYTE* pTemp = NULL; DWORD dwSizeBits = (WidthPixels * Height); pTemp = (BYTE*)GlobalAlloc(GPTR,dwSizeBits + 1024); if (pTemp) { CopyMemory(pTemp,pSrc,dwSizeBits); DWORD MemIndex = 0; DWORD SrcIndex = 0; while (MemIndex <= dwSizeBits) { for (int i = 0;i<=2;i++) { pSrc[SrcIndex] = pTemp[MemIndex]; SrcIndex++; } MemIndex++; } GlobalFree(pTemp); } } private: }; #endif