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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql80-DBA数据库学习1-数据库安装

掌握能力 核心技能 核心技能 mysql部署 官网地址www.mysql.com 或者www.oracle.com https://dev.mysql.com/downloads/repo/yum/ Install the RPM you downloaded for your system, for example: yum install mysql80-community-release-{platform}-{version-number}.noarch…

String类相关oj练习

1.第一次只出现一次的字符 做题首先看清要求和提示&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 提示&#xff1a; 1 < s.length < 105s 只包含小写字母 这就要用到我们所学…

如祺出行冲刺上市:三年被罚款270万元,销售费用远高于研发开支

3月26日&#xff0c;Chenqi Technology Limited&#xff08;如祺出行&#xff09;再次递交招股书&#xff0c;准备在港交所主板上市&#xff0c;中金公司、华泰国际、农银国际为其联席保荐人。据贝多财经了解&#xff0c;如祺出行曾于2023年8月递表。 相较于此前招股书&#xf…

蓝桥杯 java 凑算式 16年省赛Java组真题

题目 思路&#xff1a; 求有多少种解法 比如:68/3952/714就是一种解法&#xff0c;53/1972/486 是另一种解法 8/3952/714是可以除尽的 但是后面一个不行 所以我们也要通分 代码&#xff1a; public class 凑算式 {static int[] a {1, 2, 3, 4, 5, 6, 7, 8, 9};static int c…

Docker常见软件部署2

1 docker 安装redis集群 docker 安装redis集群&#xff0c;3主3从的配置。 1 创建一个redis通信网卡 #创建一个redis集群使用的网卡 docker network create redis --subnet 172.38.0.0/16 2 创建6个redis的配置文件 #通过脚本创建六个redis配置&#xff0c;复制下面命令直接…

DBRX: A New State-of-the-Art Open LLM——基于专家LLM

刷知乎的时候&#xff0c;发现最近开源了一个新的大模型DBRX&#xff0c;同样是基于专家的大模型。之前找MOE的源码没找到&#xff0c;仅仅找到了一些博主写的博客内容&#xff0c;简单了解了一下内容。之前写的模型&#xff1a;Mixtral MOE代码理解添加链接描述。简单看了一下…

Kubernetes 知识体系 系列一

多年前&#xff0c;大多数软件应用程序都是大型的单体&#xff0c;要么作为单个进程运行&#xff0c;要么作为少数服务器上的少量进程运行。这种过时的系统一直延续很久。 它们的发布周期较慢&#xff0c;更新相对较少。 在每个发布周期结束时&#xff0c;开发人员将整个系统…

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 …

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

Portainer的替代Dockge?又一个Docker Compose管理器?

Dockge&#xff1a;让Docker Compose管理触手可及&#xff0c;一图胜千言&#xff0c;轻松构建与管控您的容器服务栈&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Docker&#xff0c;这一开放源代码的创新平台&#xff0c;旨在实现应用程序部署、扩展与运维的自动化…

分享两种电流检测电路设计方案

大家好我是砖一。 在研发设计电路项目时&#xff0c;依据需要实现的功能指标&#xff0c;进行详细的电路方案开发与验证&#xff1b;面对项目的功能电路研发&#xff0c;工程师一般采用的做法是化整为零&#xff0c;化繁为简&#xff0c;也就是将项目的需要实现的整体功能逐一…

幻兽帕鲁Palworld游戏服务器多少钱?价格表来了,建议收藏

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

如何把PNG图片转换成CAD图纸DWG格式

环境&#xff1a; CAD2021 PNG图片 问题描述&#xff1a; 如何把PNG图片转换成CAD图纸DWG格式 解决方案&#xff1a; 将PNG图像转换为CAD文件&#xff08;如DXF或DWG格式&#xff09;是设计和工程领域中常见的需求之一。幸运的是&#xff0c;有几种工具和软件可以帮助完成…

【考研数学】跟张宇,一看就会,一做就废,换老师有用吗?

宇哥的1000题其实很多同学在刷的时候都会觉得有点吃力&#xff0c;特别是基础不是很牢固一类的 我的感觉是如果基础很差的按照宇哥的做法可能会没有什么思路&#xff0c;基础题可能有的都分析不出来 张宇的30讲还是不太适合零基础的考研党去听...因为宇哥整体节奏较快&#x…

阿里云CentOS7安装ZooKeeper单机模式

前提条件 阿里云CentOS7安装好jdk&#xff0c;可参 hadoop安装 的jdk安装部分 下载 [hadoopnode1 ~]$ cd softinstall [hadoopnode1 softinstall]$ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz 解压 [hadoopnode1 …

全网最全的幻兽帕鲁服务器价格表查询系统,一键报价

2024年全网最全的幻兽帕鲁服务器租用价格表&#xff0c;阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月&#xff0c;阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全&#xff1a; 阿里云幻…

智驾芯片“独角兽”地平线流血冲刺上市,三年累计亏损47亿元

3月26日&#xff0c;Horizon Robotics&#xff08;下称“地平线”&#xff09;向港交所递交招股书&#xff0c;高盛、摩根士丹利、中信建投国际为其联席保荐人。 据介绍&#xff0c;成立于2015年的地平线是一家人工智能计算平台公司&#xff0c;专注于为智能汽车提供高级辅助驾…

算法---动态规划练习-8(打家劫舍2)

打家劫舍2 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;给定一个非负整数数组 nums&#xff0c;其中 nums[i] 表示第 i 家的财物价值。 定义两个辅助数组 f 和 g&#xff0c;长度都为 n&#xff08;n 是…

【FedCoin: A Peer-to-Peer Payment System for Federated Learning】

在这篇论文中&#xff0c;我们提出了FedCoin&#xff0c;一个基于区块链的点对点支付系统&#xff0c;专为联邦学习设计&#xff0c;以实现基于Shapley值的实际利润分配。在FedCoin系统中&#xff0c;区块链共识实体负责计算SV&#xff0c;并且新的区块是基于“Shapley证明”&a…

自定义类型:【结构体】

我们知道C语言中有许多的类型&#xff0c;比如char&#xff0c;short&#xff0c;int等等类型。像是这些C语言本身就支持的类型叫做内置类型&#xff0c;但是有一些复杂对象&#xff0c;只有这些类型是完全不够的。比如人&#xff0c;或者一本书。那么我们就可以自己定义一些类…