📄 dibhelp.c
字号:
iNumColors = DibNumColors (hdib) ;
for (i = 0 ; i < iNumColors ; i++)
DibGetColor (hdib, i, prgb + i) ;
return pbmi ;
}
/*-------------------------------------------------------------------
DibCopy: Creates a new DIB section from an existing DIB section,
possibly swapping the DIB width and height.
-------------------------------------------------------------------*/
HDIB DibCopy (HDIB hdibSrc, BOOL fRotate)
{
BITMAPINFO * pbmi ;
BYTE * pBitsSrc, * pBitsDst ;
HDIB hdibDst ;
if (!DibIsValid (hdibSrc))
return NULL ;
if (NULL == (pbmi = DibCopyToInfo (hdibSrc)))
return NULL ;
if (fRotate)
{
pbmi->bmiHeader.biWidth = DibHeight (hdibSrc) ;
pbmi->bmiHeader.biHeight = DibWidth (hdibSrc) ;
}
hdibDst = DibCreateFromInfo (pbmi) ;
free (pbmi) ;
if (hdibDst == NULL)
return NULL ;
// Copy the bits
if (!fRotate)
{
pBitsSrc = DibBitsPtr (hdibSrc) ;
pBitsDst = DibBitsPtr (hdibDst) ;
CopyMemory (pBitsDst, pBitsSrc, DibBitsSize (hdibSrc)) ;
}
return hdibDst ;
}
/*----------------------------------------------------------------------
DibCopyToPackedDib is generally used for saving DIBs and for
transferring DIBs to the clipboard. In the second case, the second
argument should be set to TRUE so that the memory is allocated
with the GMEM_SHARE flag.
----------------------------------------------------------------------*/
BITMAPINFO * DibCopyToPackedDib (HDIB hdib, BOOL fUseGlobal)
{
BITMAPINFO * pPackedDib ;
BYTE * pBits ;
DWORD dwDibSize ;
HDC hdcMem ;
HGLOBAL hGlobal ;
int iNumColors ;
PDIBSTRUCT pdib = hdib ;
RGBQUAD * prgb ;
if (!DibIsValid (hdib))
return NULL ;
// Allocate memory for packed DIB
dwDibSize = DibTotalSize (hdib) ;
if (fUseGlobal)
{
hGlobal = GlobalAlloc (GHND | GMEM_SHARE, dwDibSize) ;
pPackedDib = GlobalLock (hGlobal) ;
}
else
{
pPackedDib = malloc (dwDibSize) ;
}
if (pPackedDib == NULL)
return NULL ;
// Copy the information header
CopyMemory (pPackedDib, &pdib->ds.dsBmih, sizeof (BITMAPINFOHEADER)) ;
prgb = (RGBQUAD *) ((BYTE *) pPackedDib + sizeof (BITMAPINFOHEADER)) ;
// Copy the possible color masks
if (pdib->ds.dsBmih.biCompression == BI_BITFIELDS)
{
CopyMemory (prgb, pdib->ds.dsBitfields, 3 * sizeof (DWORD)) ;
prgb = (RGBQUAD *) ((BYTE *) prgb + 3 * sizeof (DWORD)) ;
}
// Copy the color table
if (iNumColors = DibNumColors (hdib))
{
hdcMem = CreateCompatibleDC (NULL) ;
SelectObject (hdcMem, pdib->hBitmap) ;
GetDIBColorTable (hdcMem, 0, iNumColors, prgb) ;
DeleteDC (hdcMem) ;
}
pBits = (BYTE *) (prgb + iNumColors) ;
// Copy the bits
CopyMemory (pBits, pdib->pBits, DibBitsSize (pdib)) ;
// If last argument is TRUE, unlock global memory block and
// cast it to pointer in preparation for return
if (fUseGlobal)
{
GlobalUnlock (hGlobal) ;
pPackedDib = (BITMAPINFO *) hGlobal ;
}
return pPackedDib ;
}
/*------------------------------------------------------------------
DibCopyFromPackedDib is generally used for pasting DIBs from the
clipboard.
------------------------------------------------------------------*/
HDIB DibCopyFromPackedDib (BITMAPINFO * pPackedDib)
{
BYTE * pBits ;
DWORD dwInfoSize, dwMaskSize, dwColorSize ;
int iBitCount ;
PDIBSTRUCT pdib ;
// Get the size of the information header and do validity check
dwInfoSize = pPackedDib->bmiHeader.biSize ;
if (dwInfoSize != sizeof (BITMAPCOREHEADER) &&
dwInfoSize != sizeof (BITMAPINFOHEADER) &&
dwInfoSize != sizeof (BITMAPV4HEADER) &&
dwInfoSize != sizeof (BITMAPV5HEADER))
{
return NULL ;
}
// Get the possible size of the color masks
if (dwInfoSize == sizeof (BITMAPINFOHEADER) &&
pPackedDib->bmiHeader.biCompression == BI_BITFIELDS)
{
dwMaskSize = 3 * sizeof (DWORD) ;
}
else
{
dwMaskSize = 0 ;
}
// Get the size of the color table
if (dwInfoSize == sizeof (BITMAPCOREHEADER))
{
iBitCount = ((BITMAPCOREHEADER *) pPackedDib)->bcBitCount ;
if (iBitCount <= 8)
{
dwColorSize = (1 << iBitCount) * sizeof (RGBTRIPLE) ;
}
else
dwColorSize = 0 ;
}
else // all non-OS/2 compatible DIBs
{
if (pPackedDib->bmiHeader.biClrUsed > 0)
{
dwColorSize = pPackedDib->bmiHeader.biClrUsed * sizeof (RGBQUAD);
}
else if (pPackedDib->bmiHeader.biBitCount <= 8)
{
dwColorSize = (1 << pPackedDib->bmiHeader.biBitCount) *
sizeof (RGBQUAD) ;
}
else
{
dwColorSize = 0 ;
}
}
// Finally, get the pointer to the bits in the packed-DIB
pBits = (BYTE *) pPackedDib + dwInfoSize + dwMaskSize + dwColorSize ;
// Create the HDIB from the packed DIB pointer
pdib = DibCreateFromInfo (pPackedDib) ;
// Copy the pixel bits
CopyMemory (pdib->pBits, pBits, DibBitsSize (pdib)) ;
return pdib ;
}
/*-----------------------------------------------------
DibFileLoad: Creates a DIB section from a DIB file
-----------------------------------------------------*/
HDIB DibFileLoad (const TCHAR * szFileName)
{
BITMAPFILEHEADER bmfh ;
BITMAPINFO * pbmi ;
BOOL bSuccess ;
DWORD dwInfoSize, dwBitsSize, dwBytesRead ;
HANDLE hFile ;
HDIB hDib ;
// Open the file: read access, prohibit write access
hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
return NULL ;
// Read in the BITMAPFILEHEADER
bSuccess = ReadFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER),
&dwBytesRead, NULL) ;
if (!bSuccess || (dwBytesRead != sizeof (BITMAPFILEHEADER))
|| (bmfh.bfType != * (WORD *) "BM"))
{
CloseHandle (hFile) ;
return NULL ;
}
// Allocate memory for the information structure & read it in
dwInfoSize = bmfh.bfOffBits - sizeof (BITMAPFILEHEADER) ;
if (NULL == (pbmi = malloc (dwInfoSize)))
{
CloseHandle (hFile) ;
return NULL ;
}
bSuccess = ReadFile (hFile, pbmi, dwInfoSize, &dwBytesRead, NULL) ;
if (!bSuccess || (dwBytesRead != dwInfoSize))
{
CloseHandle (hFile) ;
free (pbmi) ;
return NULL ;
}
// Create the DIB
hDib = DibCreateFromInfo (pbmi) ;
free (pbmi) ;
if (hDib == NULL)
{
CloseHandle (hFile) ;
return NULL ;
}
// Read in the bits
dwBitsSize = bmfh.bfSize - bmfh.bfOffBits ;
bSuccess = ReadFile (hFile, ((PDIBSTRUCT) hDib)->pBits,
dwBitsSize, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
if (!bSuccess || (dwBytesRead != dwBitsSize))
{
DibDelete (hDib) ;
return NULL ;
}
return hDib ;
}
/*---------------------------------------------
DibFileSave: Saves a DIB section to a file
---------------------------------------------*/
BOOL DibFileSave (HDIB hdib, const TCHAR * szFileName)
{
BITMAPFILEHEADER bmfh ;
BITMAPINFO * pbmi ;
BOOL bSuccess ;
DWORD dwTotalSize, dwBytesWritten ;
HANDLE hFile ;
hFile = CreateFile (szFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
if (hFile == INVALID_HANDLE_VALUE)
return FALSE ;
dwTotalSize = DibTotalSize (hdib) ;
bmfh.bfType = * (WORD *) "BM" ;
bmfh.bfSize = sizeof (BITMAPFILEHEADER) + dwTotalSize ;
bmfh.bfReserved1 = 0 ;
bmfh.bfReserved2 = 0 ;
bmfh.bfOffBits = bmfh.bfSize - DibBitsSize (hdib) ;
// Write the BITMAPFILEHEADER
bSuccess = WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER),
&dwBytesWritten, NULL) ;
if (!bSuccess || (dwBytesWritten != sizeof (BITMAPFILEHEADER)))
{
CloseHandle (hFile) ;
DeleteFile (szFileName) ;
return FALSE ;
}
// Get entire DIB in packed DIB format
if (NULL == (pbmi = DibCopyToPackedDib (hdib, FALSE)))
{
CloseHandle (hFile) ;
DeleteFile (szFileName) ;
return FALSE ;
}
// Write out the packed-DIB
bSuccess = WriteFile (hFile, pbmi, dwTotalSize, &dwBytesWritten, NULL) ;
CloseHandle (hFile) ;
free (pbmi) ;
if (!bSuccess || (dwBytesWritten != dwTotalSize))
{
DeleteFile (szFileName) ;
return FALSE ;
}
return TRUE ;
}
/*---------------------------------------------------
DibCopyToDdb: For more efficient screen displays
---------------------------------------------------*/
HBITMAP DibCopyToDdb (HDIB hdib, HWND hwnd, HPALETTE hPalette)
{
BITMAPINFO * pbmi ;
HBITMAP hBitmap ;
HDC hdc ;
if (!DibIsValid (hdib))
return NULL ;
if (NULL == (pbmi = DibCopyToInfo (hdib)))
return NULL ;
hdc = GetDC (hwnd) ;
if (hPalette)
{
SelectPalette (hdc, hPalette, FALSE) ;
RealizePalette (hdc) ;
}
hBitmap = CreateDIBitmap (hdc, DibInfoHeaderPtr (hdib), CBM_INIT,
DibBitsPtr (hdib), pbmi, DIB_RGB_COLORS) ;
ReleaseDC (hwnd, hdc) ;
free (pbmi) ;
return hBitmap ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -