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

2024-03-29 04:36

本文主要是介绍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实例详解一就暂时到此结束,余下部分将在后续博文中介绍。

这篇关于CImage 类及其常用成员函数用法实例详解 一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857615

相关文章

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

Java中的record使用详解

《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友... 目录1. 什么是 record?2. 基本语法3. record 的核心特性4. 使用场景5. 自定

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我