123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574 |
- #include "StdAfx.h"
- #include "ImageEx.h"
- //////////////////////////////////////////////////////////////////////////////////
- //构造函数
- CImageEx::CImageEx()
- {
- //设置变量
- m_pImage=NULL;
- ZeroMemory(m_strImageName, sizeof(m_strImageName) );
- ::SetRect(&m_rcNinePart,0,0,0,0);
- return;
- }
- //析构函数
- CImageEx::~CImageEx()
- {
- //销毁图片
- DestroyImage();
- return;
- }
- //是否加载
- bool CImageEx::IsNull()
- {
- //加载判断
- if (m_pImage==NULL) return true;
- if (m_pImage->GetLastStatus()!=Ok) return true;
- return false;
- }
- //获取宽度
- INT CImageEx::GetWidth()
- {
- //加载判断
- ASSERT(IsNull()==false);
- if (IsNull()==true) return 0;
- //获取宽度
- return m_pImage->GetWidth();
- }
- //获取高度
- INT CImageEx::GetHeight()
- {
- //加载判断
- ASSERT(IsNull()==false);
- if (IsNull()==true) return 0;
- //获取高度
- return m_pImage->GetHeight();
- }
- //销毁图片
- bool CImageEx::DestroyImage()
- {
- //删除对象
- if (m_pImage!=NULL)
- {
- try {
- delete m_pImage;
- }
- catch (...)
- {
- ASSERT(FALSE);
- }
- m_pImage=NULL;
- }
- return true;
- }
- //加载图片
- bool CImageEx::LoadImage(LPCTSTR pszFileName)
- {
- //加载判断
- ASSERT(m_pImage==NULL);
- if (m_pImage!=NULL) return false;
- //加载文件
- CT2CW strFileName(pszFileName);
- m_pImage=Bitmap::FromFile((LPCWSTR)strFileName);
- //错误判断
- if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))
- {
- DestroyImage();
- return false;
- }
- return true;
- }
- //加载图片
- bool CImageEx::LoadImage(HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType/*=TEXT("IMAGE")*/)
- {
- //加载判断
- ASSERT(m_pImage==NULL);
- if (m_pImage!=NULL) return false;
- //查找资源
- HRSRC hResource=FindResource(hInstance,pszResourceName,pszResourceType);
- if (hResource==NULL) return false;
- //读取资源
- DWORD dwImageSize=SizeofResource(hInstance,hResource);
- LPVOID pImageBuffer=LoadResource(hInstance,hResource);
- //创建数据
- IStream * pIStream=NULL;
- if (CreateStreamOnHGlobal(NULL,TRUE,&pIStream)!=S_OK)
- {
- ASSERT(FALSE);
- return false;
- }
- //写入数据
- pIStream->Write(pImageBuffer,dwImageSize,NULL);
- //创建位图
- m_pImage=Bitmap::FromStream(pIStream);
- //释放资源
- if(pIStream)
- {
- pIStream->Release();
- pIStream = NULL;
- }
- //错误判断
- if ((m_pImage==NULL)||(m_pImage->GetLastStatus()!=Ok))
- {
- ASSERT(FALSE);
- return false;
- }
- return true;
- }
- //绘画图像
- bool CImageEx::DrawImage(CDC * pDC, INT nXPos, INT nYPos)
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- //创建屏幕
- ASSERT(pDC!=NULL);
- Graphics graphics(pDC->GetSafeHdc());
- //获取属性
- INT nImageWidth=m_pImage->GetWidth();
- INT nImageHeight=m_pImage->GetHeight();
- //构造位置
- RectF rcDrawRect;
- rcDrawRect.X=(REAL)nXPos;
- rcDrawRect.Y=(REAL)nYPos;
- rcDrawRect.Width=(REAL)nImageWidth;
- rcDrawRect.Height=(REAL)nImageHeight;
- //绘画图像
- graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)nImageWidth,(REAL)nImageHeight,UnitPixel);
- return true;
- }
- //绘画图像
- bool CImageEx::DrawImage( CDC * pDC, INT nXPos, INT nYPos, INT nDestWidth, INT nDestHeight )
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- //创建屏幕
- ASSERT(pDC!=NULL);
- Graphics graphics(pDC->GetSafeHdc());
- //构造位置
- RectF rcDrawRect;
- rcDrawRect.X=(REAL)nXPos;
- rcDrawRect.Y=(REAL)nYPos;
- rcDrawRect.Width=(REAL)nDestWidth;
- rcDrawRect.Height=(REAL)nDestHeight;
- //绘画图像
- graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)GetWidth(),(REAL)GetHeight(),UnitPixel);
- return true;
- }
- //绘画图像
- bool CImageEx::DrawImage( CDC * pDC, RECT &rc )
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
-
- //创建屏幕
- ASSERT(pDC!=NULL);
- Graphics graphics(pDC->GetSafeHdc());
- //构造位置
- RectF rcDrawRect;
- rcDrawRect.X=(REAL)rc.left;
- rcDrawRect.Y=(REAL)rc.top;
- rcDrawRect.Width=(REAL)(rc.right-rc.left);
- rcDrawRect.Height=(REAL)(rc.bottom-rc.top);
- //绘画图像
- graphics.DrawImage(m_pImage,rcDrawRect,0,0,(REAL)GetWidth(),(REAL)GetHeight(),UnitPixel);
- return true;
- }
- //绘画图像
- bool CImageEx::DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc)
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- //创建屏幕
- ASSERT(pDC!=NULL);
- Graphics graphics(pDC->GetSafeHdc());
- //构造位置
- RectF rcDrawRect;
- rcDrawRect.X=(REAL)nXDest;
- rcDrawRect.Y=(REAL)nYDest;
- rcDrawRect.Width=(REAL)nDestWidth;
- rcDrawRect.Height=(REAL)nDestHeight;
- //绘画图像
- graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYSrc,(REAL)nDestWidth,(REAL)nDestHeight,UnitPixel);
- return true;
- }
- //绘画图像
- bool CImageEx::DrawImage(CDC * pDC, INT nXDest, INT nYDest, INT nDestWidth, INT nDestHeight, INT nXScr, INT nYSrc, INT nSrcWidth, INT nSrcHeight)
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- //创建屏幕
- ASSERT(pDC!=NULL);
- Graphics graphics(pDC->GetSafeHdc());
- //构造位置
- RectF rcDrawRect;
- rcDrawRect.X=(REAL)nXDest;
- rcDrawRect.Y=(REAL)nYDest;
- rcDrawRect.Width=(REAL)nDestWidth;
- rcDrawRect.Height=(REAL)nDestHeight;
- //绘画图像
- graphics.DrawImage(m_pImage,rcDrawRect,(REAL)nXScr,(REAL)nYSrc,(REAL)nSrcWidth,(REAL)nSrcHeight,UnitPixel);
- return true;
- }
- //混合绘画
- bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, BYTE cbAlphaDepth)
- {
- //透明绘画
- AlphaDrawImage(pDestDC,xDest,yDest,GetWidth(),GetHeight(),0,0,cbAlphaDepth);
- return true;
- }
- //混合绘画
- bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, BYTE cbAlphaDepth)
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- //创建屏幕
- ASSERT(pDestDC!=NULL);
- Graphics graphics(pDestDC->GetSafeHdc());
- //构造位置
- RectF rcDrawRect;
- rcDrawRect.X=(REAL)xDest;
- rcDrawRect.Y=(REAL)yDest;
- rcDrawRect.Width=(REAL)cxDest;
- rcDrawRect.Height=(REAL)cyDest;
- //透明矩阵
- ColorMatrix Matrix=
- {
- 1.0f,0.0f,0.0f,0.0f,0.0f,
- 0.0f,1.0f,0.0f,0.0f,0.0f,
- 0.0f,0.0f,1.0f,0.0f,0.0f,
- 0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f,
- 0.0f,0.0f,0.0f,0.0f,1.0f
- };
- //设置属性
- ImageAttributes Attributes;
- Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
- //绘画图像
- graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxDest,(REAL)cyDest,UnitPixel,&Attributes);
- return true;
- }
- //混合绘画
- bool CImageEx::AlphaDrawImage(CDC * pDestDC, INT xDest, INT yDest, INT cxDest, INT cyDest, INT xSrc, INT ySrc, INT cxSrc, INT cySrc, BYTE cbAlphaDepth)
- {
- //创建缓冲
- if ((cxDest!=cxSrc)||(cyDest!=cySrc))
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- //创建屏幕
- ASSERT(pDestDC!=NULL);
- Graphics graphics(pDestDC->GetSafeHdc());
- //构造位置
- RectF rcDrawRect;
- rcDrawRect.X=(REAL)xDest;
- rcDrawRect.Y=(REAL)yDest;
- rcDrawRect.Width=(REAL)cxDest;
- rcDrawRect.Height=(REAL)cyDest;
- //透明矩阵
- ColorMatrix Matrix=
- {
- 1.0f,0.0f,0.0f,0.0f,0.0f,
- 0.0f,1.0f,0.0f,0.0f,0.0f,
- 0.0f,0.0f,1.0f,0.0f,0.0f,
- 0.0f,0.0f,0.0f,cbAlphaDepth/255.0f,0.0f,
- 0.0f,0.0f,0.0f,0.0f,1.0f
- };
- //设置属性
- ImageAttributes Attributes;
- Attributes.SetColorMatrix(&Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
- //绘画图像
- graphics.DrawImage(m_pImage,rcDrawRect,(REAL)xSrc,(REAL)ySrc,(REAL)cxSrc,(REAL)cySrc,UnitPixel,&Attributes);
- }
- else
- {
- //普通调用
- AlphaDrawImage(pDestDC,xDest,yDest,cxDest,cyDest,xSrc,ySrc,cbAlphaDepth);
- }
- return true;
- }
- bool CImageEx::Draw( CDC * pDC, INT x, INT y, INT cx, INT cy,INT nLeft,INT nTop,INT nRight,INT nBottom )
- {
- int cxImage = GetWidth();
- int cyImage = GetHeight();
- // 左上
- {
- RECT rcDest = {x, y, x+nLeft, y+nTop};
- RECT rcSrc = {0, 0, nLeft, nTop};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 左边
- {
- RECT rcDest = {x, y+nTop, x+nLeft, (y+nTop)+(cy-nTop-nBottom)};
- RECT rcSrc = {0, nTop, nLeft, nTop+(cyImage-nTop-nBottom)};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 上边
- {
- RECT rcDest = {x+nLeft, y,x+(cx-nRight), y+nTop};
- RECT rcSrc = {nLeft, 0, (cxImage-nLeft-nRight), nTop};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 右上
- {
- RECT rcDest = {x+(cx-nRight), y, (x+(cx-nRight))+nRight, y+nTop};
- RECT rcSrc = {cxImage-nRight, 0, (cxImage-nRight)+nRight, nTop};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 右边
- {
- RECT rcDest = {x+(cx-nRight), y+nTop, (x+(cx-nRight))+nRight, (y+nTop)+(cy-nTop-nBottom)};
- RECT rcSrc = {cxImage-nRight, nTop, (cxImage-nRight)+nRight, nTop+(cyImage-nTop-nBottom)};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 下边
- {
- RECT rcDest = {x+nLeft, y+(cy-nBottom), (x+nLeft)+(cx-nLeft-nRight), (y+(cy-nBottom))+nBottom};
- RECT rcSrc = {nLeft, cyImage-nBottom, nLeft+(cxImage-nLeft-nRight), (cyImage-nBottom)+nBottom};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 右下
- {
- RECT rcDest = {x+(cx-nRight), y+(cy-nBottom), (x+(cx-nRight))+nRight, (y+(cy-nBottom))+nBottom};
- RECT rcSrc = {cxImage-nRight, cyImage-nBottom, (cxImage-nRight)+nRight, (cyImage-nBottom)+nBottom};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 左下
- {
- RECT rcDest = {x, y+(cy-nBottom), x+nLeft, (y+(cy-nBottom))+nBottom};
- RECT rcSrc = {0, cyImage-nBottom, nLeft, (cyImage-nBottom)+nBottom};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- // 中间
- {
- RECT rcDest = {x+nLeft, y+nTop, x+(cx-nRight), y+(cy-nBottom)};
- RECT rcSrc = {nLeft, nTop, cxImage-nRight, cyImage-nBottom};
- if (!::IsRectEmpty(&rcDest) && !::IsRectEmpty(&rcSrc))
- DrawImage(pDC,rcDest.left, rcDest.top, rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
- rcSrc.left, rcSrc.top,rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top);
- }
- return TRUE;
- }
- bool CImageEx::Draw( CDC * pDC, const RECT& rectDest, const RECT& rectSrc )
- {
- return Draw(pDC,rectDest.left, rectDest.top, rectDest.right-rectDest.left, rectDest.bottom-rectDest.top,
- rectSrc.left, rectSrc.top,rectSrc.right, rectSrc.bottom);
- }
- bool CImageEx::Draw( CDC * pDC, const RECT& rectDest )
- {
- return Draw(pDC,rectDest,m_rcNinePart);
- }
- void CImageEx::SetNinePart( CONST LPRECT lprcNinePart )
- {
- if( lprcNinePart == NULL ) return;
- ::CopyRect(&m_rcNinePart,lprcNinePart);
- }
- HBITMAP CImageEx::ImageToBitmap(/*HDC hDC*/)
- {
- ASSERT(m_pImage != NULL);
- if(m_pImage == NULL) return NULL;
- // INT nHeight = GetHeight();
- // INT nWidth = GetWidth();
- //
- // if (nWidth <= 0 || nHeight <= 0)
- // {
- // return NULL;
- // }
- //
- // BITMAPINFO bmpInfo;
- // bmpInfo.bmiHeader.biHeight = -(LONG)nHeight;
- // bmpInfo.bmiHeader.biWidth = nWidth;
- // bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- // bmpInfo.bmiHeader.biPlanes = 1;
- // bmpInfo.bmiHeader.biBitCount = 32;
- // bmpInfo.bmiHeader.biCompression = BI_RGB;
- // bmpInfo.bmiHeader.biSizeImage = 0;
- // bmpInfo.bmiHeader.biXPelsPerMeter = 0;
- // bmpInfo.bmiHeader.biYPelsPerMeter = 0;
- // bmpInfo.bmiHeader.biClrUsed = 0;
- // bmpInfo.bmiHeader.biClrImportant = 0;
- //
- // BYTE* pbase = NULL;
- // HBITMAP hBitmap = ::CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, (void**)&pbase, 0, 0);
- //
- // if (!hBitmap) return NULL;
- //
- // return hBitmap;
- m_pImage->GetHBITMAP(Color(0,0,0),&m_hBitmap);
- return m_hBitmap;
- }
- bool CImageEx::DrawExtrude( CDC*pDC,const RECT& rectDest,bool bLeft,int nPixel )
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- //创建屏幕
- ASSERT(pDC!=NULL);
- Graphics graphics(pDC->GetSafeHdc());
- int nWidth = rectDest.right - rectDest.left;
- int nHeight = rectDest.bottom - rectDest.top;
- if ( bLeft )
- {
- DrawImage(pDC,rectDest.left,rectDest.top);
- if(nWidth>GetWidth())
- DrawImage(pDC,GetWidth(),rectDest.top,(nWidth-GetWidth()),GetHeight(),GetWidth()-nPixel,0,nPixel,GetHeight());
- }
- else
- {
- if ( nWidth <=GetWidth() )
- {
- DrawImage(pDC,rectDest.left,rectDest.top,nWidth,GetHeight(),GetWidth()-nWidth,0,nWidth,GetHeight());
- }
- else
- {
- DrawImage(pDC,rectDest.left,rectDest.top,nWidth-GetWidth(),GetHeight(),nPixel,0,nPixel,GetHeight());
- DrawImage(pDC,nWidth-GetWidth(),rectDest.top);
- }
- }
- return true;
- }
- bool CImageEx::SetGray()
- {
- //加载判断
- ASSERT(m_pImage!=NULL);
- if (m_pImage==NULL) return false;
- UINT nWidth = GetWidth();
- UINT nHeight = GetHeight();
- BitmapData bmpData;
- Rect rect(0, 0, nWidth, nHeight);
- m_pImage->LockBits(&rect, Gdiplus::ImageLockModeRead|Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &bmpData);
- int nValue = 0;
- BYTE * pArray = (BYTE *)bmpData.Scan0;
- UINT nBytes = (UINT)((nWidth * nHeight) << 2);
- for (UINT i = 0; i < nBytes; i += 4)
- {
- nValue = (int)(pArray[i] * 0.1 + pArray[i+1] * 0.2 + pArray[i+2] * 0.7);
- pArray[i] = nValue;
- pArray[i+1] = nValue;
- pArray[i+2] = nValue;
- }
- m_pImage->UnlockBits(&bmpData);
- return true;
- }
- //////////////////////////////////////////////////////////////////////////////////
|