wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:1461回复:3

几个私人定义的对DIB位图进行操作的函数。

楼主#
更多 发布于:2015-03-10 17:04
对于DIB位图 ,微软的开发人员提供可一些函数(见:http://www.ihalcon.com/read-2927.html
不过自己也可以写一些函数对DIB位图进行操作。
以下内容主要来自:《Visual C++ 数字图像处理 》这本书。
这本书的源代码如下:
VisualC++数字图像处理配套光盘.zip

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

合计 十一个:

 PaintDIB()          - 绘制DIB对象
//  CreateDIBPalette()  - 创建DIB对象调色板
//  FindDIBBits()       - 返回DIB图像象素起始位置
//  DIBWidth()          - 返回DIB宽度
//  DIBHeight()         - 返回DIB高度
//  PaletteSize()       - 返回DIB调色板大小
//  DIBNumColors()      - 计算DIB调色板颜色数目
//  CopyHandle()        - 拷贝内存块
//
//  SaveDIB()           - 将DIB保存到指定文件中
//  ReadDIBFile()       - 重指定文件中读取DIB对象
//
//  DIBToPCX256() - 将指定的256色DIB对象保存为256色PCX文件
//  ReadPCX256() - 读取256色PCX文件

最新喜欢:

wh64zzwh64zz
wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2015-03-10 17:04
 /*************************************************************************
 *
 * 函数名称:
 *   PaintDIB()
 *
 * 参数:
 *   HDC hDC            - 输出设备DC
 *   LPRECT lpDCRect    - 绘制矩形区域
 *   HDIB hDIB          - 指向DIB对象的指针
 *   LPRECT lpDIBRect   - 要输出的DIB区域
 *   CPalette* pPal     - 指向DIB对象调色板的指针
 *
 * 返回值:
 *   BOOL               - 绘制成功返回TRUE,否则返回FALSE。
 *
 * 说明:
 *   该函数主要用来绘制DIB对象。其中调用了StretchDIBits()或者
 * SetDIBitsToDevice()来绘制DIB对象。输出的设备由由参数hDC指
 * 定;绘制的矩形区域由参数lpDCRect指定;输出DIB的区域由参数
 * lpDIBRect指定。
 *
 ************************************************************************/


BOOL WINAPI PaintDIB(HDC     hDC,
 LPRECT  lpDCRect,
 HDIB    hDIB,
 LPRECT  lpDIBRect,
 CPalette* pPal)
{
 LPSTR    lpDIBHdr;            // BITMAPINFOHEADER指针
 LPSTR    lpDIBBits;           // DIB象素指针
 BOOL     bSuccess=FALSE;      // 成功标志
 HPALETTE hPal=NULL;           // DIB调色板
 HPALETTE hOldPal=NULL;        // 以前的调色板


 // 判断DIB对象是否为空
 if (hDIB == NULL)
 {
 // 返回
 return FALSE;
 }


 // 锁定DIB
 lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);


 // 找到DIB图像象素起始位置
 lpDIBBits = ::FindDIBBits(lpDIBHdr);


 // 获取DIB调色板,并选中它
 if (pPal != NULL)
 {
 hPal = (HPALETTE) pPal->m_hObject;


 // 选中调色板
 hOldPal = ::SelectPalette(hDC, hPal, TRUE);
 }


 // 设置显示模式
 ::SetStretchBltMode(hDC, COLORONCOLOR);


 // 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
 if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) &&
    (RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
 {
 // 原始大小,不用拉伸。
 bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
    lpDCRect->left,             // DestX
    lpDCRect->top,              // DestY
    RECTWIDTH(lpDCRect),        // nDestWidth
    RECTHEIGHT(lpDCRect),       // nDestHeight
    lpDIBRect->left,            // SrcX
    (int)DIBHeight(lpDIBHdr) -
   lpDIBRect->top -
   RECTHEIGHT(lpDIBRect),   // SrcY
    0,                          // nStartScan
    (WORD)DIBHeight(lpDIBHdr),  // nNumScans
    lpDIBBits,                  // lpBits
    (LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
    DIB_RGB_COLORS);            // wUsage
 }
    else
 {
 // 非原始大小,拉伸。
 bSuccess = ::StretchDIBits(hDC,                          // hDC
    lpDCRect->left,                 // DestX
    lpDCRect->top,                  // DestY
    RECTWIDTH(lpDCRect),            // nDestWidth
    RECTHEIGHT(lpDCRect),           // nDestHeight
    lpDIBRect->left,                // SrcX
    lpDIBRect->top,                 // SrcY
    RECTWIDTH(lpDIBRect),           // wSrcWidth
    RECTHEIGHT(lpDIBRect),          // wSrcHeight
    lpDIBBits,                      // lpBits
    (LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo
    DIB_RGB_COLORS,                 // wUsage
    SRCCOPY);                       // dwROP
 }
 
    // 解除锁定
 ::GlobalUnlock((HGLOBAL) hDIB);
 
 // 恢复以前的调色板
 if (hOldPal != NULL)
 {
 ::SelectPalette(hDC, hOldPal, TRUE);
 }
 
 // 返回
 return bSuccess;
}
wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
板凳#
发布于:2015-03-10 20:19
/*************************************************************************
 *
 * 函数名称:
 *   CreateDIBPalette()
 *
 * 参数:
 *   HDIB hDIB          - 指向DIB对象的指针
 *   CPalette* pPal     - 指向DIB对象调色板的指针
 *
 * 返回值:
 *   BOOL               - 创建成功返回TRUE,否则返回FALSE。
 *
 * 说明:
 *   该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,
 * 最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样
 * 可以用最好的颜色来显示DIB图像。
 *
 ************************************************************************/


BOOL WINAPI CreateDIBPalette(HDIB hDIB, CPalette* pPal)
{
        // 指向逻辑调色板的指针
        LPLOGPALETTE lpPal;
        
        // 逻辑调色板的句柄
        HANDLE hLogPal;
        
        // 调色板的句柄
        HPALETTE hPal = NULL;
        
        // 循环变量
        int i;
        
        // 颜色表中的颜色数目
        WORD wNumColors;
        
        // 指向DIB的指针
        LPSTR lpbi;
        
        // 指向BITMAPINFO结构的指针(Win3.0)
        LPBITMAPINFO lpbmi;
        
        // 指向BITMAPCOREINFO结构的指针
        LPBITMAPCOREINFO lpbmc;
        
        // 表明是否是Win3.0 DIB的标记
        BOOL bWinStyleDIB;
        
        // 创建结果
        BOOL bResult = FALSE;
        
        // 判断DIB是否为空
        if (hDIB == NULL)
        {
                // 返回FALSE
                return FALSE;
        }
        
        // 锁定DIB
        lpbi = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
        
        // 获取指向BITMAPINFO结构的指针(Win3.0)
        lpbmi = (LPBITMAPINFO)lpbi;
        
        // 获取指向BITMAPCOREINFO结构的指针
        lpbmc = (LPBITMAPCOREINFO)lpbi;
        
        // 获取DIB中颜色表中的颜色数目
        wNumColors = ::DIBNumColors(lpbi);
        
        if (wNumColors != 0)
        {
                // 分配为逻辑调色板内存
                hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
                                                                        + sizeof(PALETTEENTRY)
                                                                        * wNumColors);
                
                // 如果内存不足,退出
                if (hLogPal == 0)
                {
                        // 解除锁定
                        ::GlobalUnlock((HGLOBAL) hDIB);
                        
                        // 返回FALSE
                        return FALSE;
                }
                
                lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);
                
                // 设置版本号
                lpPal->palVersion = PALVERSION;
                
                // 设置颜色数目
                lpPal->palNumEntries = (WORD)wNumColors;
                
                // 判断是否是WIN3.0的DIB
                bWinStyleDIB = IS_WIN30_DIB(lpbi);

                // 读取调色板
                for (i = 0; i < (int)wNumColors; i++)
                {
                        if (bWinStyleDIB)
                        {
                                // 读取红色分量
                                lpPal->palPalEntry.peRed = lpbmi->bmiColors.rgbRed;
                                
                                // 读取绿色分量
                                lpPal->palPalEntry.peGreen = lpbmi->bmiColors.rgbGreen;
                                
                                // 读取蓝色分量
                                lpPal->palPalEntry.peBlue = lpbmi->bmiColors.rgbBlue;
                                
                                // 保留位
                                lpPal->palPalEntry.peFlags = 0;
                        }
                        else
                        {
                                // 读取红色分量
                                lpPal->palPalEntry.peRed = lpbmc->bmciColors.rgbtRed;
                                
                                // 读取绿色分量
                                lpPal->palPalEntry.peGreen = lpbmc->bmciColors.rgbtGreen;
                                
                                // 读取红色分量
                                lpPal->palPalEntry.peBlue = lpbmc->bmciColors.rgbtBlue;
                                
                                // 保留位
                                lpPal->palPalEntry.peFlags = 0;
                        }
                }
                
                // 按照逻辑调色板创建调色板,并返回指针
                bResult = pPal->CreatePalette(lpPal);
                
                // 解除锁定
                ::GlobalUnlock((HGLOBAL) hLogPal);
                
                // 释放逻辑调色板
                ::GlobalFree((HGLOBAL) hLogPal);
        }
        
        // 解除锁定
        ::GlobalUnlock((HGLOBAL) hDIB);
        
        // 返回结果
        return bResult;
}
wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
地板#
发布于:2015-03-10 20:22
其他函数源代码 请下载页首里面的附件 然后在 edgecontour.cpp 寻找。。
游客

返回顶部