我是靠谱客的博主 负责飞鸟,最近开发中收集的这篇文章主要介绍构造自己的DIB类,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 
查看文章
   
构造自己的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

最后

以上就是负责飞鸟为你收集整理的构造自己的DIB类的全部内容,希望文章能够帮你解决构造自己的DIB类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部