📄 myimage.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 + -