当前位置:   article > 正文

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

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基于对话框的程序。对话框界面如下:

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

  1. void CCImageTest1Dlg::OnBnClickedLoadImage()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. CString m_Path, m_strEx, m_strName;
  5. CFileDialog fdlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All files(*.*)|*.*||"));
  6. if (fdlg.DoModal() == IDOK)
  7. {
  8. m_Path = fdlg.GetPathName();
  9. m_strEx = fdlg.GetFileExt();
  10. //m_strName = fdlg.GetFileName();
  11. m_Path.ReleaseBuffer();
  12. m_strEx.ReleaseBuffer();
  13. //m_strName.ReleaseBuffer();
  14. }
  15. HRESULT hsr;
  16. 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")
  17. hsr = mImage.Load(m_Path);
  18. if (hsr == S_OK)
  19. {
  20. MessageBox(L"加载图像成功!");
  21. }
  22. else
  23. {
  24. MessageBox(L"加载图像失败!");
  25. }
  26. }

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

  1. void CCImageTest1Dlg::OnBnClickedDisplayImage()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. if (!mImage.IsNull())
  5. {
  6. CClientDC dc(this);
  7. mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
  8. }
  9. else
  10. {
  11. MessageBox(L"还没加载图像!");
  12. }
  13. }

试运行,结果如下:

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

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

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

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

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

  1. HRESULT CCImageTest1Dlg::LoadImageIntoIStream(LPCTSTR lpszFileName, IStream** ppStream)
  2. {
  3. HRESULT hr = S_OK;
  4. HANDLE hFile = INVALID_HANDLE_VALUE;
  5. HANDLE hMapping = NULL;
  6. LPVOID pData = NULL;
  7. LARGE_INTEGER fileSize;
  8. // 打开图片文件
  9. hFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  10. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  11. if (hFile == INVALID_HANDLE_VALUE)
  12. {
  13. hr = HRESULT_FROM_WIN32(GetLastError());
  14. goto done;
  15. }
  16. // 获取文件大小
  17. if (!GetFileSizeEx(hFile, &fileSize))
  18. {
  19. hr = HRESULT_FROM_WIN32(GetLastError());
  20. goto done;
  21. }
  22. // 创建文件映射
  23. hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, fileSize.HighPart, fileSize.LowPart, NULL);
  24. if (hMapping == NULL)
  25. {
  26. hr = HRESULT_FROM_WIN32(GetLastError());
  27. goto done;
  28. }
  29. // 映射文件到内存
  30. pData = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
  31. if (pData == NULL)
  32. {
  33. hr = HRESULT_FROM_WIN32(GetLastError());
  34. goto done;
  35. }
  36. // 在内存上创建IStream
  37. HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, fileSize.LowPart);
  38. if (hGlobal == NULL)
  39. {
  40. hr = E_OUTOFMEMORY;
  41. goto done;
  42. }
  43. void* pGlobalData = GlobalLock(hGlobal);
  44. if (pGlobalData == NULL)
  45. {
  46. hr = E_FAIL;
  47. goto done;
  48. }
  49. CopyMemory(pGlobalData, pData, fileSize.LowPart);
  50. GlobalUnlock(hGlobal);
  51. // 创建IStream
  52. hr = CreateStreamOnHGlobal(hGlobal, TRUE, ppStream);
  53. if (FAILED(hr))
  54. {
  55. GlobalFree(hGlobal);
  56. goto done;
  57. }
  58. done:
  59. if (pData != NULL)
  60. {
  61. UnmapViewOfFile(pData);
  62. }
  63. if (hMapping != NULL)
  64. {
  65. CloseHandle(hMapping);
  66. }
  67. if (hFile != INVALID_HANDLE_VALUE)
  68. {
  69. CloseHandle(hFile);
  70. }
  71. return hr;
  72. }

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

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

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

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

  1. void CCImageTest1Dlg::OnBnClickedCreatebitmap()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. if (!mImage.IsNull())
  5. mImage.Destroy();
  6. /*
  7. mImage.Create(400, 400, 24);
  8. if(mImage.IsNull())
  9. MessageBox(L"生成位图失败!");
  10. */
  11. mImage.CreateEx(400, 400, 24, BI_RGB,0,0);
  12. if (mImage.IsNull())
  13. MessageBox(L"生成位图失败!");
  14. else
  15. {
  16. COLORREF red = RGB(255, 0, 0);
  17. for (int rows = 0; rows < 400; rows++)
  18. {
  19. for (int cols = 0; cols < 400; cols++)
  20. mImage.SetPixel(cols, rows, red);
  21. }
  22. }
  23. }

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

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

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

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

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号