📄 dibhelp.c
字号:
/*------------------------------------------
DIBHELP.C -- DIB Section Helper Routines
(c) Charles Petzold, 1998
------------------------------------------*/
#define WINVER 0x0500
#include <windows.h>
#include "dibhelp.h"
#define HDIB_SIGNATURE (* (int *) "Dib ")
typedef struct
{
PBYTE * ppRow ; // must be first field for macros!
int iSignature ;
HBITMAP hBitmap ;
BYTE * pBits ;
DIBSECTION ds ;
int iRShift[3] ;
int iLShift[3] ;
}
DIBSTRUCT, * PDIBSTRUCT ;
/*---------------------------------------------------------------
DibIsValid: Returns TRUE if hdib points to a valid DIBSTRUCT
---------------------------------------------------------------*/
BOOL DibIsValid (HDIB hdib)
{
PDIBSTRUCT pdib = hdib ;
if (pdib == NULL)
return FALSE ;
if (IsBadReadPtr (pdib, sizeof (DIBSTRUCT)))
return FALSE ;
if (pdib->iSignature != HDIB_SIGNATURE)
return FALSE ;
return TRUE ;
}
/*-----------------------------------------------------------------------
DibBitmapHandle: Returns the handle to the DIB section bitmap object
-----------------------------------------------------------------------*/
HBITMAP DibBitmapHandle (HDIB hdib)
{
if (!DibIsValid (hdib))
return NULL ;
return ((PDIBSTRUCT) hdib)->hBitmap ;
}
/*-------------------------------------------
DibWidth: Returns the bitmap pixel width
-------------------------------------------*/
int DibWidth (HDIB hdib)
{
if (!DibIsValid (hdib))
return 0 ;
return ((PDIBSTRUCT) hdib)->ds.dsBm.bmWidth ;
}
/*---------------------------------------------
DibHeight: Returns the bitmap pixel height
---------------------------------------------*/
int DibHeight (HDIB hdib)
{
if (!DibIsValid (hdib))
return 0 ;
return ((PDIBSTRUCT) hdib)->ds.dsBm.bmHeight ;
}
/*----------------------------------------------------
DibBitCount: Returns the number of bits per pixel
----------------------------------------------------*/
int DibBitCount (HDIB hdib)
{
if (!DibIsValid (hdib))
return 0 ;
return ((PDIBSTRUCT) hdib)->ds.dsBm.bmBitsPixel ;
}
/*--------------------------------------------------------------
DibRowLength: Returns the number of bytes per row of pixels
--------------------------------------------------------------*/
int DibRowLength (HDIB hdib)
{
if (!DibIsValid (hdib))
return 0 ;
return 4 * ((DibWidth (hdib) * DibBitCount (hdib) + 31) / 32) ;
}
/*----------------------------------------------------------------
DibNumColors: Returns the number of colors in the color table
----------------------------------------------------------------*/
int DibNumColors (HDIB hdib)
{
PDIBSTRUCT pdib = hdib ;
if (!DibIsValid (hdib))
return 0 ;
if (pdib->ds.dsBmih.biClrUsed != 0)
{
return pdib->ds.dsBmih.biClrUsed ;
}
else if (DibBitCount (hdib) <= 8)
{
return 1 << DibBitCount (hdib) ;
}
return 0 ;
}
/*------------------------------------------
DibMask: Returns one of the color masks
------------------------------------------*/
DWORD DibMask (HDIB hdib, int i)
{
PDIBSTRUCT pdib = hdib ;
if (!DibIsValid (hdib) || i < 0 || i > 2)
return 0 ;
return pdib->ds.dsBitfields[i] ;
}
/*---------------------------------------------------
DibRShift: Returns one of the right-shift values
---------------------------------------------------*/
int DibRShift (HDIB hdib, int i)
{
PDIBSTRUCT pdib = hdib ;
if (!DibIsValid (hdib) || i < 0 || i > 2)
return 0 ;
return pdib->iRShift[i] ;
}
/*--------------------------------------------------
DibLShift: Returns one of the left-shift values
--------------------------------------------------*/
int DibLShift (HDIB hdib, int i)
{
PDIBSTRUCT pdib = hdib ;
if (!DibIsValid (hdib) || i < 0 || i > 2)
return 0 ;
return pdib->iLShift[i] ;
}
/*---------------------------------------------------------------
DibCompression: Returns the value of the biCompression field
---------------------------------------------------------------*/
int DibCompression (HDIB hdib)
{
if (!DibIsValid (hdib))
return 0 ;
return ((PDIBSTRUCT) hdib)->ds.dsBmih.biCompression ;
}
/*--------------------------------------------------------------
DibIsAddressable: Returns TRUE if the DIB is not compressed
--------------------------------------------------------------*/
BOOL DibIsAddressable (HDIB hdib)
{
int iCompression ;
if (!DibIsValid (hdib))
return FALSE ;
iCompression = DibCompression (hdib) ;
if (iCompression == BI_RGB || iCompression == BI_BITFIELDS)
return TRUE ;
return FALSE ;
}
/*---------------------------------------------------------------------------
These functions return the sizes of various components of the DIB section
AS THEY WOULD APPEAR in a packed DIB. These functions aid in converting
the DIB section to a packed DIB and in saving DIB files.
---------------------------------------------------------------------------*/
DWORD DibInfoHeaderSize (HDIB hdib)
{
if (!DibIsValid (hdib))
return 0 ;
return ((PDIBSTRUCT) hdib)->ds.dsBmih.biSize ;
}
DWORD DibMaskSize (HDIB hdib)
{
PDIBSTRUCT pdib = hdib ;
if (!DibIsValid (hdib))
return 0 ;
if (pdib->ds.dsBmih.biCompression == BI_BITFIELDS)
return 3 * sizeof (DWORD) ;
return 0 ;
}
DWORD DibColorSize (HDIB hdib)
{
return DibNumColors (hdib) * sizeof (RGBQUAD) ;
}
DWORD DibInfoSize (HDIB hdib)
{
return DibInfoHeaderSize(hdib) + DibMaskSize(hdib) + DibColorSize(hdib) ;
}
DWORD DibBitsSize (HDIB hdib)
{
PDIBSTRUCT pdib = hdib ;
if (!DibIsValid (hdib))
return 0 ;
if (pdib->ds.dsBmih.biSizeImage != 0)
{
return pdib->ds.dsBmih.biSizeImage ;
}
return DibHeight (hdib) * DibRowLength (hdib) ;
}
DWORD DibTotalSize (HDIB hdib)
{
return DibInfoSize (hdib) + DibBitsSize (hdib) ;
}
/*----------------------------------------------------------------------
These functions return pointers to the various components of the DIB
section.
----------------------------------------------------------------------*/
BITMAPINFOHEADER * DibInfoHeaderPtr (HDIB hdib)
{
if (!DibIsValid (hdib))
return NULL ;
return & (((PDIBSTRUCT) hdib)->ds.dsBmih) ;
}
DWORD * DibMaskPtr (HDIB hdib)
{
PDIBSTRUCT pdib = hdib ;
if (!DibIsValid (hdib))
return 0 ;
return pdib->ds.dsBitfields ;
}
void * DibBitsPtr (HDIB hdib)
{
if (!DibIsValid (hdib))
return NULL ;
return ((PDIBSTRUCT) hdib)->pBits ;
}
/*------------------------------------------------------
DibSetColor: Obtains entry from the DIB color table
------------------------------------------------------*/
BOOL DibGetColor (HDIB hdib, int index, RGBQUAD * prgb)
{
PDIBSTRUCT pdib = hdib ;
HDC hdcMem ;
int iReturn ;
if (!DibIsValid (hdib))
return 0 ;
hdcMem = CreateCompatibleDC (NULL) ;
SelectObject (hdcMem, pdib->hBitmap) ;
iReturn = GetDIBColorTable (hdcMem, index, 1, prgb) ;
DeleteDC (hdcMem) ;
return iReturn ? TRUE : FALSE ;
}
/*----------------------------------------------------
DibGetColor: Sets an entry in the DIB color table
----------------------------------------------------*/
BOOL DibSetColor (HDIB hdib, int index, RGBQUAD * prgb)
{
PDIBSTRUCT pdib = hdib ;
HDC hdcMem ;
int iReturn ;
if (!DibIsValid (hdib))
return 0 ;
hdcMem = CreateCompatibleDC (NULL) ;
SelectObject (hdcMem, pdib->hBitmap) ;
iReturn = SetDIBColorTable (hdcMem, index, 1, prgb) ;
DeleteDC (hdcMem) ;
return iReturn ? TRUE : FALSE ;
}
/*-----------------------------------------------------------------
DibPixelPtr: Returns a pointer to the pixel at position (x, y)
-----------------------------------------------------------------*/
BYTE * DibPixelPtr (HDIB hdib, int x, int y)
{
if (!DibIsAddressable (hdib))
return NULL ;
if (x < 0 || x >= DibWidth (hdib) || y < 0 || y >= DibHeight (hdib))
return NULL ;
return (((PDIBSTRUCT) hdib)->ppRow)[y] + (x * DibBitCount (hdib) >> 3) ;
}
/*-----------------------------------------------
DibGetPixel: Obtains a pixel value at (x, y)
-----------------------------------------------*/
DWORD DibGetPixel (HDIB hdib, int x, int y)
{
PBYTE pPixel ;
if (!(pPixel = DibPixelPtr (hdib, x, y)))
return 0 ;
switch (DibBitCount (hdib))
{
case 1: return 0x01 & (* pPixel >> (7 - (x & 7))) ;
case 4: return 0x0F & (* pPixel >> (x & 1 ? 0 : 4)) ;
case 8: return * pPixel ;
case 16: return * (WORD *) pPixel ;
case 24: return 0x00FFFFFF & * (DWORD *) pPixel ;
case 32: return * (DWORD *) pPixel ;
}
return 0 ;
}
/*--------------------------------------------
DibSetPixel: Sets a pixel value at (x, y)
--------------------------------------------*/
BOOL DibSetPixel (HDIB hdib, int x, int y, DWORD dwPixel)
{
PBYTE pPixel ;
if (!(pPixel = DibPixelPtr (hdib, x, y)))
return FALSE ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -