首页 > 代码库 > CIMAGE mfc(转)

CIMAGE mfc(转)

一、图片的载入

如果需要在界面上显示的是已经存在的图片,那么需要将待显示的图片载入至CImage对象之中,CImage提供了四个载入函数:

HRESULT Load(LPCTSTR pszFileName) throw( );

HRESULT Load(IStream* pStream) throw();

void LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName) throw( );

void LoadFromResource(HINSTANCE hInstance, UINT nIDResource) throw( );

如果需要显示的图片在程序运行时需要更换则通常使用第一个函数Load(LPCTSTR pszFileName)载入图片,参数pszFileName指定要载入的图片文件;如果需要显示的图片是固定不变的,则通常使用第三个LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName)或第四个函数LoadFromResource(HINSTANCE hInstance, UINT nIDResource)载入图片,这两个函数是从资源中取得图片信息,每一个参数是包含有待载入图片的模块实例句柄,第二个参数是资源的ID或名称。

LPCTSTR类型可以理解为 const char*

但是我在使用时需要加上 (LPCTSTR)"XX.jpg"

以下代码分别通过Load和LoadFromResource载入了图片:

CImage m_image1;        // 实际代码中,被声明成了类成员

CImage m_image2;        // 实际代码中,被声明成了类成员

m_image1.Load("G:\\xxx.jpg");

m_image2.LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));

在实际中,第一种方法会出现无法载入图片的情况,目前我还不太清楚原因,希望知道的网友指教

 

二、图片的显示

将图片载入CImage对象的目的是将其在界面之中显示出来,显示图像用到的核心函数是Draw,Draw提供了6个重载函数,通过参数名称,很容易了解参数的含义,其原型如下:

 

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( );

 

如果要以控件的大小来显示图片,可以通过以下代码实现:

if(m_image2.IsNull())    //判断有无图像  
        return;   
// 取得客户区尺寸  
CRect zcRect;  
GetDlgItem(IDC_STATIC_PIC2)->GetClientRect(&zcRect);   
// 将图像显示在界面之上  
m_image2.Draw(GetDlgItem(IDC_STATIC_PIC2)->GetDC()->m_hDC,  
                            zcRect.left,  
                            zcRect.top,  
                            zcRect.Width(),  
                            zcRect.Height());
 

当然,可以十分简单的用

image->Draw(this->GetDC()->m_hDC,0,0);即可

 

可以通过image->SetPixel(10,10,RGB(255,0,0));对图片上的(10,10)像素修改为红色