构造自己的DIB类

本文介绍了如何在Windows环境下构建一个自定义的DIB类,包括处理颜色、文件操作和析构函数的相关细节。
摘要由CSDN通过智能技术生成
 
查看文章
   
构造自己的DIB类
2007-05-05 11:44

MFC没有封装DIB,我们可以自己构造自己的DIB类,在这里我用的类名是CDibImage。里面我还添加了部分常用的图像处理函数。如点运算中的阈值变换函数ThresholdTrans()等等。希望对大家有所帮助。更重要的是理解,否则你是不会用的。

头文件DibImage.h代码

#if !defined(AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)
#define AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

DECLARE_HANDLE(HDIB);   // DIB句柄
#define PALVERSION    0x300 // DIB常量

/* DIB宏 */
// 判断是否是Win 3.0的DIB
#define IS_WIN30_DIB(lpbi)   ((*(LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER))
// 计算矩形区域的宽度
#define RECTWIDTH(lpRect)      ((lpRect)->right - (lpRect)->left)
// 计算矩形区域的高度
#define RECTHEIGHT(lpRect)     ((lpRect)->bottom - (lpRect)->top)

// 在计算图像大小时,采用公式:biSizeImage = biWidth' × biHeight。
// 是biWidth',而不是biWidth,这里的biWidth'必须是4的整倍数,表示
// 大于或等于biWidth的,离4最近的整倍数。WIDTHBYTES就是用来计算
// biWidth'
#define WIDTHBYTES(bits)     (((bits) + 31) / 32 * 4)

// Dib文件头标志(字符串"BM",写DIB时用到该常数)
#define DIB_HEADER_MARKER    ((WORD) ('M' << 8) | 'B')

class CDibImage  
{
// Constructor and Destructor ///
public:
CDibImage();
virtual ~CDibImage();

// function /
public:
//DIB函数
BOOL     PaintDIB (HDC, LPRECT, HDIB, LPRECT, CPalette* pPal);
BOOL     CreateDIBPalette(HDIB hDIB, CPalette* cPal);
LPSTR    FindDIBBits (LPSTR lpbi);
DWORD    DIBWidth (LPSTR lpDIB);
DWORD    DIBHeight (LPSTR lpDIB);
WORD     PaletteSize (LPSTR lpbi);
WORD     DIBNumColors (LPSTR lpbi);
HGLOBAL CopyHandle (HGLOBAL h);

BOOL     SaveDIB (HDIB hDib, CFile& file);
HDIB     ReadDIBFile(CFile& file);
//点运算函数
BOOL ThresholdTrans(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BYTE bThre);

};


#endif // !defined(AFX_DIBIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)

/***************************************************************************************************************/

实现部分DibImage.cpp代码

#include "stdafx.h"
#include "Image.h"
#include "DibImage.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

CDibImage::CDibImage()
{

}

CDibImage::~CDibImage()
{

}

//
// DIB函数
//

/*************************************************************************
* 函数名称:
*    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 CDibImage::PaintDIB(HDC      hDC,
      LPRECT   lpDCRect,
      HDIB     hDIB,
      LPRECT   lpDIBRect,
      CPalette* pPal)
{
LPSTR     lpDIBHdr;             // BITMAPINFOHEADER指针
LPSTR     lpDIBBits;            // DIB象素指针
BOOL      bSuccess=FALSE;       // 成功标志
HPALETTE hPal=NU

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值