我取得 HBITMAP 如下;
HBITMAP hbm=(HBITMAP)LoadImage(NULL,"c:\\8.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);如何通过HBITMAP得到BMP图的BITMAPINFOHEADER 信息
HBITMAP hbm=(HBITMAP)LoadImage(NULL,"c:\\8.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);如何通过HBITMAP得到BMP图的BITMAPINFOHEADER 信息
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits; // Retrieve the bitmap's color format, width, and height.
if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp))
errhandler("GetObject", hwnd); // Convert the color format to a count of bits.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32; // Allocate memory for the BITMAPINFO structure. (This structure
// contains a BITMAPINFOHEADER structure and an array of RGBQUAD
// data structures.) if (cClrBits != 24)
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1<< cClrBits)); // There is no RGBQUAD array for the 24-bit-per-pixel format. else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER)); // Initialize the fields in the BITMAPINFO structure. pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits); // If the bitmap is not compressed, set the BI_RGB flag.
pbmi->bmiHeader.biCompression = BI_RGB; // Compute the number of bytes in the array of color
// indices and store the result in biSizeImage.
// For Windows NT/2000, the width must be DWORD aligned unless
// the bitmap is RLE compressed. This example shows this.
// For Windows 95/98, the width must be WORD aligned unless the
// bitmap is RLE compressed.
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
* pbmi->bmiHeader.biHeight;
// Set biClrImportant to 0, indicating that all of the
// device colors are important.
pbmi->bmiHeader.biClrImportant = 0;
return pbmi;
}
The following example code defines a function that initializes the remaining structures, retrieves the array of palette indices, opens the file, copies the data, and closes the file. void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,
HBITMAP hBMP, HDC hDC)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memory pointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp; pbih = (PBITMAPINFOHEADER) pbi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage); if (!lpBits)
errhandler("GlobalAlloc", hwnd); // Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.
if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
DIB_RGB_COLORS))
{
errhandler("GetDIBits", hwnd);
} // Create the .BMP file.
hf = CreateFile(pszFile,
GENERIC_READ | GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
errhandler("CreateFile", hwnd);
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0; // Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD); // Copy the BITMAPFILEHEADER into the .BMP file.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
{
errhandler("WriteFile", hwnd);
} // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL))
errhandler("WriteFile", hwnd); // Copy the array of color indices into the .BMP file.
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
errhandler("WriteFile", hwnd); // Close the .BMP file.
if (!CloseHandle(hf))
errhandler("CloseHandle", hwnd); // Free memory.
GlobalFree((HGLOBAL)lpBits);
}
{
// this function opens a bitmap file and loads the data into bitmapint file_handle, // the file handle
index; // looping indexUCHAR *temp_buffer = NULL; // used to convert 24 bit images to 16 bit
OFSTRUCT file_data; // the file data information// open the file if it exists
if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)
return(0);// now load the bitmap file header
_lread(file_handle, &bitmap->LHxxBitmapFileHeader,sizeof(BITMAPFILEHEADER));// test if this is a bitmap file
if (bitmap->LHxxBitmapFileHeader.bfType!=LHxxBITMAP_ID)
{
// close the file
_lclose(file_handle); // return error
// return(0);
} // end if// now load the bitmap file header
_lread(file_handle, &bitmap->LHxxBitmapInfoHeader,sizeof(BITMAPINFOHEADER));// now load the color palette if there is one
if (bitmap->LHxxBitmapInfoHeader.biBitCount == 8)
{
_lread(file_handle, &bitmap->LHxxPalette,LHxxMAX_COLORS_PALETTE*sizeof(PALETTEENTRY)); // now set all the flags in the palette correctly and fix the reversed
// BGR RGBQUAD data format
for (index=0; index < LHxxMAX_COLORS_PALETTE; index++)
{
// reverse the red and green fields
int temp_color = bitmap->LHxxPalette[index].peRed;
bitmap->LHxxPalette[index].peRed = bitmap->LHxxPalette[index].peBlue;
bitmap->LHxxPalette[index].peBlue = temp_color;
// always set the flags word to this
bitmap->LHxxPalette[index].peFlags = PC_NOCOLLAPSE;
} // end for index } // end if// finally the image data itself
_lseek(file_handle,-(int)(bitmap->LHxxBitmapInfoHeader.biSizeImage),SEEK_END);// now read in the imageif (bitmap->LHxxBitmapInfoHeader.biBitCount==8 || bitmap->LHxxBitmapInfoHeader.biBitCount==16 ||
bitmap->LHxxBitmapInfoHeader.biBitCount==24)
{
// delete the last image if there was one
if (bitmap->LHxxBuffer)
free(bitmap->LHxxBuffer); // allocate the memory for the image
if (!(bitmap->LHxxBuffer = (UCHAR *)malloc(bitmap->LHxxBitmapInfoHeader.biSizeImage)))
{
// close the file
_lclose(file_handle); // return error
return(0);
} // end if // now read it in
_lread(file_handle,bitmap->LHxxBuffer,bitmap->LHxxBitmapInfoHeader.biSizeImage); } // end if
else
{
// serious problem
return(0); } // end else#if 0
// write the file info out
printf("\nfilename:%s \nsize=%d \nwidth=%d \nheight=%d \nbitsperpixel=%d \ncolors=%d \nimpcolors=%d",
filename,
bitmap->LHxxBitmapInfoHeader.biSizeImage,
bitmap->LHxxBitmapInfoHeader.biWidth,
bitmap->LHxxBitmapInfoHeader.biHeight,
bitmap->LHxxBitmapInfoHeader.biBitCount,
bitmap->LHxxBitmapInfoHeader.biClrUsed,
bitmap->LHxxBitmapInfoHeader.biClrImportant);
#endif// close the file
_lclose(file_handle);// flip the bitmap
Flip_Bitmap(bitmap->LHxxBuffer,
bitmap->LHxxBitmapInfoHeader.biWidth*(bitmap->LHxxBitmapInfoHeader.biBitCount/8),
bitmap->LHxxBitmapInfoHeader.biHeight);/*FILE *fp2;
fp2=fopen(filename2,"wb");
for (int index_y=0; index_y<bitmap->bitmapinfoheader.biHeight; index_y++)
{
fwrite(bitmap->buffer,bitmap->bitmapinfoheader.biWidth,1,fp2);
bitmap->buffer += bitmap->bitmapinfoheader.biWidth;
}
fclose(fp2);*/
// return successLHxxSET_PALETTE( bitmap->LHxxPalette );
//MessageBox(DrawHwnd, "okok", "FREE_OK", MB_OK);
return(1);
} // end Load_Bitmap_File