CImage 类及其常用成员函数用法实例详解 一

Cimage类是一个用于处理图像的类,它的主要用途是方便地创建、编辑、保存和显示图像。Cimage类支持多种图像文件格式,包括BMPGIFJPGPNGTIF等。较CBitmap类使用起来更方便。其构造函数及成员函数如下:

下面详细说明CImage常用成员函数的用法。

加载图像

        CImage支持的图像类型包括 BMP、GIF、JPEG、PNG 和 TIFF。加载图像是将位图附加到CImage对象的过程。构造CImage对象后,调用 Create、CreateEx、Load、LoadFromResource 或 Attach 都可将位图附加到对象。要加载图像必须先声明一个CImage对象。

        Load 函数

        Load   加载图像。其原型如下:

HRESULT Load(LPCTSTR pszFileName) throw();

pszFileName 指向包含要加载的图像文件名称的字符串的指针。

HRESULT Load(IStream* pStream) throw();

pStream 指向包含要加载的图像文件名称的流的指针。

如果载入图像时发送异常,则会抛出异常。

返回值: 一个标准HRESULT 。它其实是一个32位的整数,用来表示函数执行的结果状态。如果函数的执行成功,则返回S_OK,其值为0x00000000。如果函数执行过程中遇到异常情况,则COM系统经过判断,会返回相应的错误值。

LoadFromResource函数

LoadFromResource 从  BITMAP 资源加载图像。其原型如下:

void LoadFromResource(HINSTANCE hInstance,

LPCTSTR pszResourceName) throw();

void LoadFromResource(HINSTANCE hInstance,

UINT nIDResource) throw();

参数:

hInstance 包含要加载的图像的模块实例的句柄。

pszResourceName 指向包含资源名称(其中包含要加载的图像)的字符串的指针。

nIDResource 要加载的资源的 ID。

如果载入图像时发生异常则会抛出异常。

创建位图

Create 函数

Create 创建CImage位图并将其附加到先前构造的CImage对象。其原型如下:

BOOL Create(

int nWidth,

int nHeight,

int nBPP,

DWORD dwFlags = 0) throw();

       参数:

              nWidth 位图的宽度(以像素为单位)。

nHeight CImage 位图的高度(以像素为单位)。 如果  nHeight 为正数,则位图为自下而上的DIB,其原点为左下角。 如果  nHeight 为负数,则位图为自上而下的 DIB,其原点为左上角。

nBPP 位图中的每像素位数。 通常为 4、8、16、24 或 32。 对于单色位图或蒙板,可以是 1。

dwFlags 指定位图对象是否有 alpha 通道。 可以是零个或多个以下值的组合:

createAlphaChannel 仅当  nBPP 为 32 且  eCompression 为  BI_RGB 时适用。 如果指定,所创建的图像对于每个像素都有一个 alpha(透明度)值,存储在每个像素的第 4 字节中(在非 alpha 32 位图像中未使用)。 此 alpha 通道在调用CImage::AlphaBlend 时自动使用。

       返回值:如果成功,则不为 0;否则为 0。

        CreateEx函数

       CreateEx 创建CImage位图并将其附加到先前构造的CImage对象。其原型如下:

       BOOL CreateEx(

int nWidth,

int nHeight,

int nBPP,

DWORD eCompression,

const DWORD* pdwBitmasks = NULL,

DWORD dwFlags = 0) throw();

       参数:

              nWidth 位图的宽度(以像素为单位)。

nHeight CImage 位图的高度(以像素为单位)。 如果  nHeight 为正数,则位图为自下而上的DIB,其原点为左下角。 如果  nHeight 为负数,则位图为自上而下的 DIB,其原点为左上角。

nBPP 位图中的每像素位数。 通常为 4、8、16、24 或 32。 对于单色位图或蒙板,可以是 1。

eCompression 指定压缩的自下而上位图的压缩类型(无法压缩自上而下的 DIB)。 可以是以下其中一个值:

BI_RGB 该格式未压缩。 调用  CImage::CreateEx 时指定此值等效于调用CImage::Create 。

BI_BITFIELDS 该格式未压缩,颜色表由三个  DWORD 颜色蒙板组成,分别指定每个像素的红色、绿色和蓝色组件。 这在使用 16 和 32-bpp 位图时有效。

pdwBitfields 仅当eCompression设置为BI_BITFIELDS时使用,否则必须为  NULL 。 指向三个DWOR位掩码数组的指针,指定每个像素的哪些位分别用于颜色的红色、绿色和蓝色组件。

dwFlags 指定位图对象是否有 alpha 通道。 可以是零个或多个以下值的组合:

createAlphaChannel 仅当  nBPP 为 32 且  eCompression 为  BI_RGB 时适用。 如果指定,所创建的图像对于每个像素都有一个 alpha(透明度)值,存储在每个像素的第 4 字节中(在非 alpha 32 位图像中未使用)。 此 alpha 通道在调用

CImage::AlphaBlend 时自动使用。

       返回值:TRUE如果成功。 否则为FALSE 。

        Cimage 对象附件位图句柄

        Attach 函数

       Attach 将hBitmap附加到CImage对象。其原型如下:

       void Attach(HBITMAP hBitmap, DIBOrientation eOrientation = DIBOR_DEFAULT)

throw();

       参数:HBITMAP 的句柄。

       eOrientation 指定位图的方向。 可以是以下值之一:

       DIBOR_DEFAULT 位图的方向由操作系统确定。

DIBOR_BOTTOMUP 位图的行按相反顺序排列。 这会导致 CImage::GetBits 返回位图缓冲区末端附近的指针,而 CImage::GetPitch 返回一个负数。

DIBOR_TOPDOWN 位图的行按从上到下的顺序排列。 这会导致 CImage::GetBits 返回指向位图第一个字节的指针,而 CImage::GetPitch 返回一个正数。

位图可以是非 DIB 节位图,也可以是 DIB 节位图。

        IsNull函数

IsNull 确定位图当前是否已加载。其原型如下:

bool IsNull() const throw();

返回值:如果当前未加载位图,则此方法返回TRUE ;否则返回FALSE 。

    显示图像

要用CImage对象显示位图图像,必须先将位图附加到该对象,然后可以调用AlphaBlend,BitBlt,Draw,MaskBlt,StretchBlt,TransparentBlt,PlgBlt等方法(函数)之一来实现。

        AlphaBlend函数

AlphaBlend 显示具有透明或半透明像素的位图,其原型如下:

BOOL AlphaBlend(

HDC hDestDC,

int xDest,

int yDest,

BYTE bSrcAlpha = 0xff,

BYTE bBlendOp = AC_SRC_OVER) const throw();

BOOL AlphaBlend(

HDC hDestDC,

const POINT& pointDest,

BYTE bSrcAlpha = 0xff,

BYTE bBlendOp = AC_SRC_OVER) const throw();

       BOOL AlphaBlend(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

int xSrc,

int ySrc,

int nSrcWidth,

int nSrcHeight,

BYTE bSrcAlpha = 0xff,

BYTE bBlendOp = AC_SRC_OVER);

       BOOL AlphaBlend(

HDC hDestDC,

const RECT& rectDest,

const RECT& rectSrc,

BYTE bSrcAlpha = 0xff,

BYTE bBlendOp = AC_SRC_OVER);

参数:

hDestDC 目标设备上下文的句柄。

xDest 目标矩形左上角的 x 坐标(以逻辑单元表示)。

yDest 目标矩形左上角的 y 坐标(以逻辑单元表示)。

bSrcAlpha 要在整个源位图上使用的 alpha 透明度值。 默认 0xff (255) 假定图像不透明,并且你只想使用每像素 alpha 值。

bBlendOp 源位图和目标位图的 alpha 混合函数、要应用于整个源位图的全局 alpha 值,以及源位图的格式信息。 源和目标混合函数目前仅限于  AC_SRC_OVER 。

pointDest 对标识目标矩形左上角(以逻辑单元表示)的 POINT 结构的引用。

nDestWidth 目标矩形的宽度(以逻辑单元表示)。

nDestHeight 目标矩形的高度(以逻辑单元表示)。

xSrc  源矩形左上角的逻辑 x 坐标。

ySrc  源矩形左上角的逻辑 y 坐标。

nSrcWidth 源矩形的宽度(以逻辑单元表示)。

nSrcHeight 源矩形的高度(以逻辑单元表示)。

rectDest 对 RECT 结构(标识目标)的引用。

rectSrc 对RECT 结构(标识源)的引用。

返回值:如果成功,则不为 0;否则为 0。

Alpha 混合位图支持按每像素进行颜色混合。当bBlendOp 设置为默认值  AC_SRC_OVER 时,源位图将基于源像素的 alpha 值放置在目标位图上。

        BitBlt 函数

BitBlt  将位图从源设备上下文复制到当前设备上下文。其原型如下:

BOOL BitBlt(

HDC hDestDC,

int xDest,

int yDest,

DWORD dwROP = SRCCOPY) const throw();  

BOOL BitBlt(

HDC hDestDC,

const POINT& pointDest,

DWORD dwROP = SRCCOPY) const throw();

    BOOL BitBlt(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

int xSrc,

int ySrc,

DWORD dwROP = SRCCOPY) const throw();

BOOL BitBlt(

HDC hDestDC,

const RECT& rectDest,

const POINT& pointSrc,

DWORD dwROP = SRCCOPY) const throw();

参数

hDestDC 目标HDC 。

xDest 目标矩形左上角的逻辑 x 坐标。

yDest 目标矩形左上角的逻辑 y 坐标。

dwROP 要执行的光栅操作。 光栅操作代码确切地定义如何将源位、目标位和模式组合在一起(如当前所选画笔所定义的)以形成目标。

pointDest 指示目标矩形左上角的 POINT 结构。

nDestWidth 目标矩形的宽度(以逻辑单元表示)。

nDestHeight 目标矩形的高度(以逻辑单元表示)。

xSrc 源矩形左上角的逻辑 x 坐标。

ySrc 源矩形左上角的逻辑 y 坐标。

rectDest 指示目标矩形的 RECT 结构。

pointSrc 指示源矩形左上角的  POINT 结构。

返回值:如果成功,则不为零,否则为零。

        Draw函数

Draw 将位图从源设备上下文复制到当前设备上下文。其原型如下:

BOOL Draw(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

int xSrc,

int ySrc,

int nSrcWidth,

int nSrcHeight) const throw();

BOOL Draw(

HDC hDestDC,

const RECT& rectDest,

const RECT& rectSrc) const throw();

BOOL Draw(

HDC hDestDC,

int xDest,

int yDest) const throw();

BOOL Draw(

HDC hDestDC,

const POINT& pointDest) const throw();

BOOL Draw(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight) const throw();

BOOL Draw(

HDC hDestDC,

const RECT& rectDest) const throw();

参数:

       hDestDC 目标设备上下文的句柄。

       xDest  目标矩形左上角的 x 坐标(以逻辑单元表示)。

       yDest  目标矩形左上角的 y 坐标(以逻辑单元表示)。

       nDestWidth 目标矩形的宽度(以逻辑单元表示)。

       nDestHeight 目标矩形的高度(以逻辑单元表示)。

       xSrc 源矩形左上角的 x 坐标(以逻辑单元表示)。

       ySrc 源矩形左上角的 y 坐标(以逻辑单元表示)。

       nSrcWidth 源矩形的宽度(以逻辑单元表示)。

       nSrcHeight 源矩形的高度(以逻辑单元表示)。

       rectDest 对RECT 结构(标识目标)的引用。

       rectSrc 对RECT 结构(标识源)的引用。

       pointDest 对标识目标矩形左上角(以逻辑单元表示)的 POINT 结构的引用。

返回值:如果成功,则不为 0;否则为 0。

       Draw 执行与 StretchBlt 相同的操作,除非图像包含透明颜色或 alpha 通道。 在这种情况下, Draw 根据需要执行与 TransparentBlt 或 AlphaBlend 相同的操作。对于未指定源矩形的  Draw 版本,整个源图像为默认值。 对于未指定目标矩形大小的

Draw 版本,源图像的大小为默认值,不会发生拉伸或收缩。

        MaskBlt函数

       MaskBlt 使用指定的蒙板和光栅操作组合源位图和目标位图的颜色数据。其原型如下:

BOOL MaskBlt(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

int xSrc,

int ySrc,

HBITMAP hbmMask,

int xMask,

int yMask,

DWORD dwROP = SRCCOPY) const throw();

       BOOL MaskBlt(

HDC hDestDC,

const RECT& rectDest,

const POINT& pointSrc,

HBITMAP hbmMask,

const POINT& pointMask,

DWORD dwROP = SRCCOPY) const throw();

       BOOL MaskBlt(

HDC hDestDC,

const RECT& rectDest,

const POINT& pointSrc,

HBITMAP hbmMask,

const POINT& pointMask,

DWORD dwROP = SRCCOPY) const throw();

BOOL MaskBlt(

HDC hDestDC,

int xDest,

int yDest,

HBITMAP hbmMask,

DWORD dwROP = SRCCOPY) const throw();

       BOOL MaskBlt(

HDC hDestDC,

const POINT& pointDest,

HBITMAP hbmMask,

DWORD dwROP = SRCCOPY) const throw();

       参数:

              hDestDC 其可执行文件包含资源的模块的句柄。

              xDest 目标矩形左上角的 x 坐标(以逻辑单元表示)。

              yDest 目标矩形左上角的 y 坐标(以逻辑单元表示)。

              nDestWidth 目标矩形和源位图的宽度(以逻辑单元表示)。

              nDestHeight 目标矩形和源位图的高度(以逻辑单元表示)。

              xSrc 源位图左上角的逻辑 x 坐标。

              ySrc 源位图左上角的逻辑 y 坐标。

              hbmMask 与源设备上下文中的颜色位图组合的单色蒙板位图的句柄。

              xMask   hbmMask 参数指定的蒙板位图的水平像素偏移量。

              yMask  hbmMask 参数指定的蒙板位图的垂直像素偏移量。

              dwROP 指定前景和背景三元光栅操作代码,该方法使用这些操作代码来控制 源数据和目标数据的组合。背景光栅操作码存储在此值高位字的高位字节中;前景光栅操作码存储在此值高位字的低位字节中;此值的低位字被忽略,应为 0。

              rectDest 对RECT结构(标识目标)的引用。

              pointSrc 指示源矩形左上角的POINT 结构。

              pointMask 指示蒙板位图左上角的POINT 结构。

              pointDest  对标识目标矩形左上角(以逻辑单元表示)的  POINT 结构的引用。

              返回值:如果成功,则返回非零值;否则返回 0。

                PlgBlt 函数

       PlgBlt 执行从源设备上下文中的矩形到目标设备上下文中的平行四边形的位块传输。其原型如下:

       BOOL PlgBlt(

HDC hDestDC,

const POINT* pPoints,

HBITMAP hbmMask = NULL) const throw();

       BOOL PlgBlt(

HDC hDestDC,

const POINT* pPoints,

int xSrc,

int ySrc,

int nSrcWidth,

int nSrcHeight,

HBITMAP hbmMask = NULL,

int xMask = 0,

int yMask = 0) const throw();

       BOOL PlgBlt(

HDC hDestDC,

const POINT* pPoints,

const RECT& rectSrc,

HBITMAP hbmMask = NULL,

const POINT& pointMask = CPoint(0, 0)) const throw();

       参数:

              hDestDC 目标设备上下文的句柄。

pPoints 指向逻辑空间中三个点的数组的指针,该数组标识目标平行四边形的三个角。 源矩形的左上角映射到此数组的第一个点,右上角映射到此数组的第二个点,左下角映射到第三个点。 源矩形的右下角映射到平行四边形中隐含的第四个点。

hbmMask 用于屏蔽源矩形颜色的可选单色位图的句柄。

xSrc 源矩形左上角的 x 坐标(以逻辑单元表示)。

              ySrc 源矩形左上角的 y 坐标(以逻辑单元表示)。

              nSrcWidth 源矩形的宽度(以逻辑单元表示)。

              nSrcHeight 源矩形的高度(以逻辑单元表示)。

              xMask 单色位图左上角的 x 坐标。

              yMask 单色位图左上角的 y 坐标。

              rectSrc 对指定源矩形坐标的 RECT 结构的引用。

              pointMask 指示蒙板位图左上角的 POINT 结构。

       返回值:如果成功,则返回非零值;否则返回 0。

        StretchBlt函数

        StretchBlt 将位图从源矩形复制到目标矩形(将位图从源设备上下文复制到当前设备上下文),必要时可拉伸或压缩位图以符合目标矩形的尺寸。其原型如下:

     BOOL StretchBlt(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

DWORD dwROP = SRCCOPY) const throw();

       BOOL StretchBlt(

HDC hDestDC,

const RECT& rectDest,

DWORD dwROP = SRCCOPY) const throw();

       BOOL StretchBlt(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

int xSrc,

int ySrc,

int nSrcWidth,

int nSrcHeight,

DWORD dwROP = SRCCOPY) const throw();

BOOL StretchBlt(

HDC hDestDC,

const RECT& rectDest,

const RECT& rectSrc,

DWORD dwROP = SRCCOPY) const throw();

参数:

       hDestDC 目标设备上下文的句柄。

       xDest 目标矩形左上角的 x 坐标(以逻辑单元表示)。

       yDest 目标矩形左上角的 y 坐标(以逻辑单元表示)。

       nDestWidth 目标矩形的宽度(以逻辑单元表示)。

       nDestHeight 目标矩形的高度(以逻辑单元表示)。

       dwROP 要执行的光栅操作。 光栅操作代码确切地定义如何将源位、目标位和模式组合在一起(如当前所选画笔所定义的)以形成目标。

       rectDest 对 RECT 结构(标识目标)的引用。

       xSrc 源矩形左上角的 x 坐标(以逻辑单元表示)。

       ySrc 源矩形左上角的 y 坐标(以逻辑单元表示)。

       nSrcWidth 源矩形的宽度(以逻辑单元表示)。

       nSrcHeight 源矩形的高度(以逻辑单元表示)。

rectSrc 对 RECT结构(标识源)的引用。

返回值:如果成功,则返回非零值;否则返回 0。

        TransparentBlt函数

        TransparentBlt将位图从源设备上下文复制到当前设备上下文。TransparentBlt 支持每像素 4 位和每像素 8 位的源位图。其原型如下:

BOOL TransparentBlt(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

UINT crTransparent = CLR_INVALID) const throw();

      BOOL TransparentBlt(

HDC hDestDC,

const RECT& rectDest,

UINT crTransparent = CLR_INVALID) const throw();

  BOOL TransparentBlt(

HDC hDestDC,

int xDest,

int yDest,

int nDestWidth,

int nDestHeight,

int xSrc,

int ySrc,

int nSrcWidth,

int nSrcHeight,

UINT crTransparent = CLR_INVALID) const throw();

       BOOL TransparentBlt(

HDC hDestDC,

const RECT& rectDest,

const RECT& rectSrc,

UINT crTransparent = CLR_INVALID) const throw();

       参数:

              hDestDC 目标设备上下文的句柄。

              xDest 目标矩形左上角的 x 坐标(以逻辑单元表示)。

              yDest 目标矩形左上角的 y 坐标(以逻辑单元表示)。

              nDestWidth 目标矩形的宽度(以逻辑单元表示)。

              nDestHeight 目标矩形的高度(以逻辑单元表示)。

       crTransparent 源位图中要视为透明的颜色。 默认情况下为  CLR_INVALID ,表示应使用当前设置为图像透明颜色的颜色。

       rectDest 对 RECT 结构(标识目标)的引用。

       xSrc 源矩形左上角的 x 坐标(以逻辑单元表示)。

       ySrc 源矩形左上角的 y 坐标(以逻辑单元表示)。

       nSrcWidth 源矩形的宽度(以逻辑单元表示)。

       nSrcHeight 源矩形的高度(以逻辑单元表示)。

       rectSrc 对RECT结构(标识源)的引用。

返回值:如果成功,则为  TRUE ;否则为  FALSE 。

实例演示        

用VS2022新建一个MFC基于对话框的程序。对话框界面如下:

为“加载图像”按钮添加事件处理函数  代码如下:

void CCImageTest1Dlg::OnBnClickedLoadImage()
{
	// TODO: 在此添加控件通知处理程序代码
	CString m_Path, m_strEx, m_strName;
	CFileDialog fdlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All files(*.*)|*.*||"));
	if (fdlg.DoModal() == IDOK)
	{
		m_Path = fdlg.GetPathName();
		m_strEx = fdlg.GetFileExt();
		//m_strName = fdlg.GetFileName();

		m_Path.ReleaseBuffer();
		m_strEx.ReleaseBuffer();
		//m_strName.ReleaseBuffer();
	}
	HRESULT hsr;
	if (m_strEx == "BMP" || m_strEx == "bmp" || m_strEx == "TIFF" || m_strEx == "tiff" || m_strEx == "PNG" || m_strEx == "png" || m_strEx == "jpeg" || m_strEx == "JPEG")
		hsr = mImage.Load(m_Path);
	if (hsr == S_OK)
	{
		MessageBox(L"加载图像成功!");
	}
	else
	{ 
		
		MessageBox(L"加载图像失败!");
	}
		
}

为“显示图像”按钮添加事件处理函数如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}
}

试运行,结果如下:

点击加载图像按钮,选择加载图像:

 点击打开,弹出图像加载成功信息,点击确定,关闭弹窗。

点击显示图像按钮,结果如下:

说名该程序成功实现了图像加载及显示。

        加载图像也可用Load(IStream* pStream),要演示这个函数的使用,需先将图像装载到Istream,下面是将图像装载到IStream对象,装载图像装载到IStream对象的函数代码如下:

HRESULT CCImageTest1Dlg::LoadImageIntoIStream(LPCTSTR lpszFileName, IStream** ppStream)
{
	HRESULT hr = S_OK;
	HANDLE hFile = INVALID_HANDLE_VALUE;
	HANDLE hMapping = NULL;
	LPVOID pData = NULL;
	LARGE_INTEGER fileSize;
	// 打开图片文件  
	hFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		hr = HRESULT_FROM_WIN32(GetLastError());
		goto done;
	}

	// 获取文件大小  
	if (!GetFileSizeEx(hFile, &fileSize))
	{
		hr = HRESULT_FROM_WIN32(GetLastError());
		goto done;
	}

	// 创建文件映射  
	hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, fileSize.HighPart, fileSize.LowPart, NULL);
	if (hMapping == NULL)
	{
		hr = HRESULT_FROM_WIN32(GetLastError());
		goto done;
	}

	// 映射文件到内存  
	pData = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
	if (pData == NULL)
	{
		hr = HRESULT_FROM_WIN32(GetLastError());
		goto done;
	}

	// 在内存上创建IStream  
	HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, fileSize.LowPart);
	if (hGlobal == NULL)
	{
		hr = E_OUTOFMEMORY;
		goto done;
	}

	void* pGlobalData = GlobalLock(hGlobal);
	if (pGlobalData == NULL)
	{
		hr = E_FAIL;
		goto done;
	}

	CopyMemory(pGlobalData, pData, fileSize.LowPart);
	GlobalUnlock(hGlobal);

	// 创建IStream  
	hr = CreateStreamOnHGlobal(hGlobal, TRUE, ppStream);
	if (FAILED(hr))
	{
		GlobalFree(hGlobal);
		goto done;
	}

done:
	if (pData != NULL)
	{
		UnmapViewOfFile(pData);
	}
	if (hMapping != NULL)
	{
		CloseHandle(hMapping);
	}
	if (hFile != INVALID_HANDLE_VALUE)
	{
		CloseHandle(hFile);
	}

	return hr;
}

        加载图像还可用LoadFromResource函数,使用LoadFromResource函数相对比较简单,但需先在资源文件中添加位图资源,本示例中添加的位图资源如下:

  Cimage对象还可以用Attach函数附加一个资源,使用下面代码可以将张位图附加·到CImage对象上。

HMODULE hint = AfxGetInstanceHandle();
HANDLE hbitmap = LoadImageW(hint, m_Path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //只支持BMP格式。
mImage.Attach((HBITMAP)hbitmap);
if(mImage.IsNull())
				MessageBox(L"加载图像失败!");

为“创建位图”添加事件处理函数,代码如下:

void CCImageTest1Dlg::OnBnClickedCreatebitmap()
{
	// TODO: 在此添加控件通知处理程序代码
	if (!mImage.IsNull())
		mImage.Destroy();
	/*
	mImage.Create(400, 400, 24);
	if(mImage.IsNull())
		MessageBox(L"生成位图失败!");
	*/
	mImage.CreateEx(400, 400, 24, BI_RGB,0,0);
	if (mImage.IsNull())
		MessageBox(L"生成位图失败!");
	else
	{
		COLORREF red = RGB(255, 0, 0);
		for (int rows = 0; rows < 400; rows++)
		{
			for (int cols = 0; cols < 400; cols++)
				mImage.SetPixel(cols, rows, red);
		}
	}
}

        该段代码用包含create与createEX函数的用法,先创建位图,然后用SetPixel函数填充颜色数据。

        试运行程序,然后点击对话框程序中创建位图按钮,再点击显示图像,结果如下:

对话框中显示出新建的位图,说明创建成功。

由于篇幅关系CImage实例详解一就暂时到此结束,余下部分将在后续博文中介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496588.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决Animate.css动画效果无法在浏览器运行问题

背景 在开发官方网站的时候&#xff0c;临时更换了电脑&#xff0c;发现原本正常的动画效果突然不动了。 经过 chrome、Microsoft Edge都无法运行。 Animate.css | A cross-browser library of CSS animations. 问题排查 通过审查元素后发现类名是注入并且生效的。 验证 然…

【漏洞复现】企互联-FE企业运营管理平台uploadAttachmentServlet接口存在任意文件上传漏洞

漏洞描述 FE企业运营管理平台(以下简称FE6.5)是基于互联企业云工作台,以移动技术、云计算、大数据处理技术、传感技术等信息技术为支撑,和各类业务系统全面融合的移动化云平台,分为企业版和集团版,能满足各种规模企业的信息化建设需求。FE6.5以移动、平台、社交、云及大…

OpenHarmony实战开发-List组件的使用之设置项

介绍 在本篇CodeLab中&#xff0c;我们将使用List组件、Toggle组件以及Router接口&#xff0c;实现一个简单的设置页&#xff0c;点击将跳转到对应的详细设置页面。效果图如下&#xff1a; 相关概念 CustomDialog&#xff1a;CustomDialog装饰器用于装饰自定义弹窗。List&…

Apifox 新版发布:多分支升级、Query 参数支持枚举、自定义快捷键全面解读

看看本次版本更新主要涵盖的重点内容&#xff0c;有没有你所关注的功能特性&#xff1a; 多分支能力持续升级Query 参数支持枚举等高级配置支持自定义快捷键支持全局设置是否允许返回响应里有额外字段支持导入非 API 的 Markdown 文件更多 CI/CD 平台集成环境变量支持实时协作…

基于springboot+vue+Mysql的“智慧食堂”设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

查找总价格为目标值的两个商品【双指针】

这道题实际上跟本专栏上一题属于同一类型&#xff0c;是上一题的简单版&#xff0c;可以点击跳跃。 ⬇ 有效三角形的个数【双指针】 法一&#xff1a;暴力求解 class Solution { public:vector<int> twoSum(vector<int> &nums, int target){int n nums.size()…

Numpy 初体验

文章目录 第1关&#xff1a;Numpy 创建数组第2关&#xff1a;Numpy 数组的基本运算第3关&#xff1a;Numpy 数组的切片与索引第4关&#xff1a;Numpy 数组的堆叠第5关&#xff1a;Numpy 的拆分 第1关&#xff1a;Numpy 创建数组 编程要求 本关的任务是&#xff0c;补全右侧编辑…

用docker在局域网虚拟一个docker虚拟机,支持单独ip,gpu,systemd,在docker里面安装docker

可以实现局域网内虚拟一台linux服务器&#xff0c;效果类似虚拟机&#xff0c;用docker实现&#xff0c;需要注意&#xff0c;这种方式和宿主机是不能通讯的&#xff0c;但是可以和局域网内的设备通讯 觉得好用可以加作者wx: lx-ivan 编写dockerfile vim Dockerfile FROM u…

飞鸟写作怎么用 #经验分享#学习方法#学习方法

飞鸟写作是一款非常好用的论文写作工具&#xff0c;它不仅能够帮助用户写作论文&#xff0c;还可以检测论文的原创性和查重率&#xff0c;是许多学生和研究人员的首选工具。 使用飞鸟写作非常方便&#xff0c;用户只需将论文复制粘贴到工具中&#xff0c;就能够快速得到论文的原…

【Hello,PyQt】控件拖拽

在 PyQt 中实现控件拖拽功能的详细介绍 拖拽功能是现代用户界面设计中常见的交互方式之一&#xff0c;它可以提高用户体验&#xff0c;增加操作的直观性。在 PyQt 中&#xff0c;我们可以很容易地实现控件之间的拖拽功能。本文将介绍如何在 PyQt 中实现控件的拖拽功能。 如何实…

初识C++ · 入门(1)

目录 前言&#xff1a; 1 命名空间 2 输入和输出 3 缺省参数 5 函数重载 前言&#xff1a; C与C语言是有一定交集的&#xff0c;可以理解为本贾尼在使用C语言的时候认为有缺陷&#xff0c;于是加了一些小语法进行改良&#xff0c;后来经过委员会的修改&#xff0c;C98问世…

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 医院手麻系统源码

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 手术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统&#xff0c;其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配&#xff0c;再到术前访视、术中记录及术后…

在Linux搭建Emlog博客结合内网穿透实现公网访问本地个人网站

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

如何使用Python读取、旋转和和创建空白的PDF文件

试想象一下&#xff0c;你正在处理一堆PDF文件&#xff0c;需要从中提取一些信息或者修改其中的内容。如果你不使用Python&#xff0c;你可能需要手动打开每个文件&#xff0c;复制粘贴你需要的内容&#xff0c;然后再保存为一个新的文件。这简直是一场噩梦&#xff01;但是&am…

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…

手写启动类(start)

为什么要手写一个start&#xff1f; 简化代码&#xff0c;仅使用一个注解就可以实现分页功能(以下以分页为例)。 1.定义一个pageX注解 Documented Retention(RetentionPolicy.RUNTIME)//运行时可以通过反射API获取到注解信息 Target({ElementType.METHOD, ElementType.TYPE})…

redis的设计与实现(四)——单机数据库特性

1. 前言 我们前面了解了redis的数据结构&#xff0c;对象。但是redis对于这些对象的使用和管理策略需要也熟记于心&#xff0c;这篇文章我们就了解一下吧。 2. 类型检查和命令多态 DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行SET,GET,APPEND,STRLEN&#xff0c;等…

【opencv】教程代码 —ImgProc (10)图像平滑处理

10. Smoothing.cpp 图像平滑处理 演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用&#xff0c;并显示滤波后的效果。 /*** 文件 Smoothing.cpp* 简单滤镜的样例代码* 作者 OpenCV团队*///引入所需库文件 #includ…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

一周学会Django5 Python Web开发-Django5模型查询(上)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计41条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…