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

相关文章

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

详解Java中的敏感信息处理

《详解Java中的敏感信息处理》平时开发中常常会遇到像用户的手机号、姓名、身份证等敏感信息需要处理,这篇文章主要为大家整理了一些常用的方法,希望对大家有所帮助... 目录前后端传输AES 对称加密RSA 非对称加密混合加密数据库加密MD5 + Salt/SHA + SaltAES 加密平时开发中遇到像用户的

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初