⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myimage.h

📁 电子监控的网络编程实例
💻 H
字号:
// MyImage.h: interface for the CMyImage class.
/********************************************************************************
//图像处理类--主要是图像读取显示保存
// Written by: YiJian Feng
// Email: netfyee@hotmail.com
// Last Edit: 2003-9-5 
**********************************************************************************/

#if !defined(AFX_MYIMAGE_H__FD2FFBF4_E57D_48DF_807E_39C051A3C379__INCLUDED_)
#define AFX_MYIMAGE_H__FD2FFBF4_E57D_48DF_807E_39C051A3C379__INCLUDED_

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

// Handle to a DIB 
//DECLARE_HANDLE(HDIB);
// DIB constants 
//#define PALVERSION   0x300
#define DIB_HEADER_MARKER   ((WORD) ('M' << 8) | 'B')
// DIB Macros
#define IS_WIN30_DIB(lpbi)  ((*(LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER))
#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)
#define CHANGEFLAG	24

#include "ImageLoad.h"
#pragma comment(lib, ".\\ImageLoad.lib ")

typedef enum tagMyImage_ERROR {
	IMAGE_OK = 0,             /* 00 */ //没有错误
		IMAGE_NULL,					//图像为空
		IMAGE_ERR_CREATE,			//创建图像Image失败			
		IMAGE_ERR_FREE,				//释放图像Image失败
		IMAGE_ERR_LOCK,				//锁定图像Image失败
		IMAGE_ERR_UNLOCK,           //解锁图像Image失败
		IMAGE_ERR_READFILE,			//读图像文件失败
		IMAGE_ERR_FILENOTEXIST,		//文件不存在
		IMAGE_ERR_RGB,				//图像格式不对//目前只能处理24位真彩色
		IMAGE_ERR_IMAGELOAD_SAVE,		//调用ImageLoad读写JPG图像失败
		IMAGE_ERR_IMAGELOAD_READ,
		IMAGE_ERR_INFOHEADER,		//没有指定BITMAPINFOHEADER(m_bih)
		IMAGE_ERR_WRITEFILE,		//写文件失败()
		IMAGE_ERR_NOTSUPPORTFILE,	//不支持的图像格式(只支持BMP和JPG)
		IMAGE_ERR_SIZE,				//缓冲大小不正确
		IMAGE_ERR_NOFILENAME,		//文件名称为空
		IMAGE_ERR_DRAW,				//用StretchDIBits或SetDIBitsToDevice绘制图像时失败

		IMAGE_ERR_UNKOWN = 255           /* FF */
} IMAGE_ERROR;

class CMyImage  
{
public:

	//显示错误信息
	static void ShowErr(IMAGE_ERROR err);

	//	static HBITMAP CopyDDB(HBITMAP hBitmap);
	//复制DIB对象
	static HDIB CopyDIB(HDIB hDib);

	//得到DDB或DIB的参数
	static BOOL GetBih(HBITMAP hBitmap, int &width, int &height, int& bitscount);
	static BOOL GetBih(HDIB hDib, int& width, int& height, int & bitscount );

	//从文件获得DDB或DIB位图
	static HBITMAP LoadDDB(CString FileName);
	static HDIB LoadDIB(CString FileName);
	static HDIB LoadDibJPG(CString FileName);//禁止直接调用
	static HDIB LoadDIB(CFile& file);//禁止直接调用
	

	//保存DDB到文件//根据FileName后缀名决定存储格式
	static BOOL SaveDDB(HBITMAP hBitmap, CString FileName, int nQulity=40);
//	static BOOL SaveDDB(HBITMAP hBitmap, CFile& file);
	
	//保存DIB到文件//根据FileName后缀名决定存储格式
	static BOOL SaveDIB(HDIB hDib, CString FileName, int nQulity=40);
	static BOOL SaveDIB(HDIB hDib, CFile& file);//禁止直接调用
	static BOOL SaveJPG(HDIB hDib, CString FileName, int nQulity=40);//禁止直接调用

	//DDB和DIB相互转换
	static HBITMAP DIBtoDDB(HDIB hDib);
	static HDIB DDBtoDIB(HBITMAP hBitmap, HPALETTE hPal = NULL);
	static HDIB DDBtoDIB(CBitmap* pBitmap, CPalette* pPalette = NULL);

	//绘制DDB和DIB位图到设备场景
	static BOOL DrawDIB(HDIB hDib, HDC hDc, CRect sRect, CRect dRect);
	static BOOL DrawDDB(HBITMAP hBitmap, HDC hDc, CRect sRect, CRect dRect);
	
	//在DDB或DIB位图上叠加两行文字 + HBITMAP小位图
	static void DdbAdd(HBITMAP &hDib, CString text="", CString text2="", LPLOGFONT plf=NULL, HBITMAP hBitmap = NULL, int xstart = 0, int ystart=0);
	static void DibAdd(HDIB &hDib, CString text="", CString text2="", LPLOGFONT plf=NULL, HBITMAP hBitmap=NULL, int xstart=0, int ystart=0);

	//在设备场景上绘制透明图像(精灵图像)
	static void DrawTransparentBitmap(CDC *pDC, UINT IDImage, CRect &rect, COLORREF rgbMask);
	
public:
	
	CMyImage();
	//根据HBITMAP(DDB位图)产生Image
	CMyImage(HBITMAP hBitmap);
	//根据HDIB(DIB位图)产生Image
	CMyImage(HDIB hDib);
	//根据 图像字节流 产生Image/
	//其中iMode有三种方式 =0 包括BITMAPFILEHEADER+BITMAPINFOHEADER+图像字节;
	//1包括BITMAPINFOHEADER+图像字节;
	//2图像字节;但这时必须调用Setbih()来设置位图信息;
	CMyImage(PBYTE pImage, DWORD dwSize, int iMode = 0);
	//根据 文件来 产生 Image
	CMyImage(CString FileName);	
	virtual ~CMyImage();
	
		
	//创建MyImage对象内存空间
	IMAGE_ERROR CreateObject(DWORD dwSize);
	
	//判断Image对象是否为空
	BOOL IsEmpty();

	//获得MyImage对象大小
	DWORD GetImageSize(CMyImage* pImage);
	
		
	//复制MyImage对象
	CMyImage* CopyImage(CMyImage* pImage);
	
	//清空MyImage图像内容
	IMAGE_ERROR DeleteObject();
	
	//绘制MyImage图像到屏幕
	IMAGE_ERROR DrawImage(HDC hDc, CRect sRect, CRect dRect);

	//获取-设置 图像信息头参数BITMAPINFOHEADER
	IMAGE_ERROR GetBih(int& width, int& height, int& bitcount);
	IMAGE_ERROR SetBih(int width = 768, int height = 576, int bitcount = 24);

	//保存MyImage对象到图像文件
	IMAGE_ERROR SaveImage(CString FileName, int nQulity=40);	
	
	//在MyImage上叠加两行文字 和 号牌HBITMAP
	void ImageAdd(CString text="", CString text2="", LPLOGFONT plf=NULL, HBITMAP hBitmap=NULL, int xstart=0, int ystart=0);
	
	//从CMyImage类中获得图像数据
	HBITMAP GetDDB();
	HDIB GetDIB();
	IMAGE_ERROR GetBuf(PBYTE pImage, DWORD& dwSize, int iMode=0);	

	//将图像数据填充到MyImage中
	IMAGE_ERROR LoadBuf(PBYTE pImage, DWORD dwSize, int iMode);
	IMAGE_ERROR LoadFile(CString FileName);
	IMAGE_ERROR LoadDIB(HDIB hDib);
	IMAGE_ERROR LoadDDB(CBitmap* pBitmap);
	IMAGE_ERROR LoadDDB(HBITMAP hBitmap);

private:
	BITMAPINFOHEADER m_bih;
	HGLOBAL hImage;
	//将图像数据填充到MyImage中
	//由LoadFile调用FileName的后缀名决定文件格式
	IMAGE_ERROR LoadJPG(CString FileName);
	IMAGE_ERROR LoadFile(CFile& file);

	//保存MyImage对象到图像文件
	IMAGE_ERROR SaveJPG(CString FileName, int nQulity=40);	
	IMAGE_ERROR SaveImage(CFile& file);

	//获取-设置 图像信息头参数BITMAPINFOHEADER
	IMAGE_ERROR ImageSize(int& dwWidth, int &dwHeight);
};

#endif // !defined(AFX_MYIMAGE_H__FD2FFBF4_E57D_48DF_807E_39C051A3C379__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -