?? myimage.cpp
字號:
// GlobalReAlloc(hDib,dwDIBSize,GMEM_MODIFY);
LPVOID pS=GlobalLock(tmpHDIB);
if(!pS)
{
GlobalFree(tmpHDIB);
return;
}
LPVOID pD=GlobalLock(hImage);
if(!pS){
GlobalUnlock(tmpHDIB);
GlobalFree(tmpHDIB);
return;
}
if (start<widths )
widths=start;
int heights=sz.cy;
// if(text2.GetLength()>1)
// heights=2*sz.cy;
// for(int i=99;i>99-heights;i--)
// memcpy(LPBYTE(pD)+40+(h-1-(99-i))*start/*+start-300*3*/,LPBYTE(pS)+40+i*720*3/*+(720-300)*3*/,widths);
for(int i=sz.cy-1;i>0;i--)
memcpy(LPBYTE(pD)+54+(h-1-i)*start/*+start-300*3*/,LPBYTE(pS)+40+(99-i)*dibWidth*3/*+(720-300)*3*/,widths);
if(widths2>0)
{
if(start<widths2)
widths2=start;
for(int i=sz.cy*2-1;i>sz.cy;i--)
memcpy(LPBYTE(pD)+54+(h-1-i)*start/*+start-300*3*/,LPBYTE(pS)+40+(99-i)*dibWidth*3/*+(720-300)*3*/,widths2);
}
if(hBitmap)
{
//繪制號牌圖片
HDIB tmpHDIB2 = DDBtoDIB(hBitmap, NULL);
if(!tmpHDIB2)
{
GlobalUnlock(tmpHDIB);
GlobalUnlock(hImage);
GlobalFree(tmpHDIB);
return;
}
PBYTE ph = NULL;
ph = (PBYTE)::GlobalLock(tmpHDIB2);
if(!ph)
{
GlobalUnlock(tmpHDIB);
GlobalUnlock(hImage);
GlobalFree(tmpHDIB);
GlobalFree(tmpHDIB2);
return;
}
int cx=0,cy=0;
LPBITMAPINFOHEADER lp = (LPBITMAPINFOHEADER)ph;
cx = lp->biWidth;
cy = lp->biHeight;
if (cx + xstart>dibWidth)
cx = dibWidth - xstart;
if (cy + ystart>dibHeight)
cy = dibHeight - ystart;
for(i=0;i<cy;i++)
memcpy(LPBYTE(pD)+54+(dibHeight-ystart-cy+i)*start+xstart*3, LPBYTE(ph)+40+ (lp->biHeight-cy+i)*lp->biWidth*3 , cx * 3);
// memcpy(pD,pS,dwDIBSize);
GlobalUnlock(tmpHDIB2);
GlobalFree(tmpHDIB2);
}
GlobalUnlock(tmpHDIB);
GlobalUnlock(hImage);
GlobalFree(tmpHDIB);
}
IMAGE_ERROR CMyImage::SaveImage(CString FileName, int nQulity)
{
ASSERT(!FileName.IsEmpty());
if(FileName.IsEmpty())
return IMAGE_ERR_NOFILENAME;
if(!hImage)
return IMAGE_NULL;
IMAGE_ERROR err = IMAGE_OK;
CFile file;
CFileException fe;
CString m_strName=FileName;
CString m_strFileExt=FileName.Right(3);
m_strFileExt.MakeUpper();
if(m_strFileExt=="BMP")
{
// TRY
// {
// file.Open(csFileName, CFile::modeCreate | CFile::modeWrite,NULL))
// }
// CATCH( CFileException, e )
// {
// if( e->m_cause == CFileException::fileNotFound )
// printf( "ERROR: File not found\n");
// }
// END_CATCH
if (!file.Open(FileName, CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone, &fe))
{
// fe.ReportError();
return IMAGE_ERR_WRITEFILE;
}
TRY
{
IMAGE_ERROR err = SaveImage(file);
if(err != IMAGE_OK)
return err;
}
CATCH (CFileException, eLoad)
{
file.Abort(); // will not throw an exception
return IMAGE_ERR_WRITEFILE;
}
END_CATCH
}
else if(m_strFileExt=="JPG")
{
if (nQulity<10 || nQulity>100)
nQulity = 40;
err = SaveJPG(FileName, nQulity);
if(err!=IMAGE_OK)
return err;
}
else
{
return IMAGE_ERR_NOTSUPPORTFILE;
}
return IMAGE_OK;
}
//保存Image到文件CFile
IMAGE_ERROR CMyImage::SaveImage(CFile &file)
{
if (!hImage)
return IMAGE_NULL;
// Write the file header
DWORD dwSize = GlobalSize(hImage);
PBYTE ps = (PBYTE) GlobalLock(hImage);
if ( !ps )
return IMAGE_ERR_LOCK;
TRY
{
file.WriteHuge(ps, dwSize);
}
CATCH (CFileException, e)
{
BOOL b = ::GlobalUnlock(hImage);
/*win98下禁用
if(!p)
return IMAGE_ERR_UNLOCK;
*/
return IMAGE_ERR_WRITEFILE;
THROW_LAST();
}
END_CATCH
BOOL b = ::GlobalUnlock(hImage);
/*win98下禁用
if(!p)
return IMAGE_ERR_UNLOCK;
*/
return IMAGE_OK;
}
IMAGE_ERROR CMyImage::SaveJPG(CString FileName, int nQulity)
{
if(FileName.IsEmpty())
return IMAGE_ERR_NOFILENAME;
if (::SaveJPG(FileName.GetBuffer(0), hImage ,nQulity))
return IMAGE_OK;
else
return IMAGE_ERR_IMAGELOAD_SAVE;
}
HDIB CMyImage::GetDIB()
{
if(!hImage)
return NULL;
HDIB hDib = NULL;
DWORD dwSize = GlobalSize(hImage);
hDib = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize - 14);
if(!hDib)
return NULL;
PBYTE ps=NULL,pd=NULL;
ps = (PBYTE)GlobalLock(hImage);
if(!ps)
{
GlobalFree(hDib);
hDib=NULL;
return NULL;
}
pd = (PBYTE)GlobalLock(hDib);
if(!pd)
{
BOOL b = GlobalUnlock(hImage);
/*win98下禁用
if(!p)
return IMAGE_ERR_UNLOCK;
*/
GlobalFree(hDib);
hDib=NULL;
return NULL;
}
memcpy(pd, ps+14, dwSize -14);
BOOL b = GlobalUnlock(hImage);
/*win98下禁用
if(!p)
return IMAGE_ERR_UNLOCK;
*/
b = GlobalUnlock(hDib);
/*win98下禁用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
return hDib;
}
HBITMAP CMyImage::GetDDB()
{
HDIB hDib = NULL;
hDib = GetDIB();
if(!hDib)
return NULL;
HBITMAP hBitmap = NULL;
hBitmap = DIBtoDDB(hDib);
GlobalFree(hDib);
return hBitmap;
}
IMAGE_ERROR CMyImage::GetBuf(PBYTE pImage, DWORD &dwSize, int iMode)
{
if(!hImage)
return IMAGE_NULL;
DWORD dwGlobal = 0;
PBYTE lp = NULL;
BOOL b = FALSE;
switch(iMode) {
case 0:
dwGlobal = GlobalSize(hImage);
if(dwSize != dwGlobal)
return IMAGE_ERR_SIZE;
lp = (PBYTE)GlobalLock(hImage);
if(!lp)
return IMAGE_ERR_LOCK;
memcpy(pImage, lp, dwSize);
b = GlobalUnlock( hImage );
/*win98下禁用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
break;
case 1:
dwGlobal = GlobalSize(hImage);
if(dwSize + 14 != dwGlobal)
return IMAGE_ERR_SIZE;
lp = (PBYTE)GlobalLock(hImage);
if(!lp)
return IMAGE_ERR_LOCK;
memcpy(pImage, lp+14, dwSize);
b = GlobalUnlock( hImage );
/*win98下禁用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
break;
default:
dwGlobal = GlobalSize(hImage);
if(dwSize + 54 != dwGlobal)
return IMAGE_ERR_SIZE;
lp = (PBYTE)GlobalLock(hImage);
if(!lp)
return IMAGE_ERR_LOCK;
memcpy(pImage, lp + 54, dwSize);
b = GlobalUnlock( hImage );
/*win98下禁用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
}
return IMAGE_OK;
}
void CMyImage::DdbAdd(HBITMAP &hDib, CString text, CString text2, LPLOGFONT plf, HBITMAP hBitmap, int xstart, int ystart)
{
if(!hDib)
return;
LOGFONT lf;
if(!plf)
{
::ZeroMemory(&lf,sizeof(lf));
lf.lfHeight=160;
lf.lfWeight=FW_BOLD;
// lf.lfItalic=TRUE;
::lstrcpy(lf.lfFaceName,_T("宋體"));
}
else
{
memcpy(&lf, plf, sizeof(LOGFONT));
}
HDC dcMemory;
HDC pDC=::GetDC(NULL);
dcMemory=CreateCompatibleDC(pDC);
CDC* pMemory=new CDC();
pMemory->Attach(dcMemory);
// CBitmap bitmap;
// bitmap.CreateCompatibleBitmap(pMemory,dibWidth,100);
CBitmap* pOldBitmap =(CBitmap*)::SelectObject(dcMemory,hDib);
// ::SetBkMode(dcMemory,TRANSPARENT);
::SetBkColor(dcMemory,RGB(0,0,0));
::SetTextColor(dcMemory,RGB(255,255,255));
CFont font;
font.CreatePointFontIndirect(&lf);
::SelectObject(dcMemory,font.GetSafeHandle());
CSize sz=pMemory->GetTextExtent(text);
CSize sz2=pMemory->GetTextExtent(text2);
DWORD widths=sz.cx*3;
DWORD widths2=0;
::TextOut(dcMemory,0,0,text,text.GetLength());
if(text2.GetLength()>1)
{
::TextOut(dcMemory,0,sz.cy,text2,text2.GetLength());
widths2=sz2.cx*3;
}
if(hBitmap)
{
BITMAP bitmap;
::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
HDC dcMemory2 = NULL;
dcMemory2 = CreateCompatibleDC(pDC);
::SelectObject(dcMemory2, hBitmap);
::StretchBlt(dcMemory, xstart, ystart, bitmap.bmWidth, bitmap.bmHeight, dcMemory2, 0, 0, bitmap.bmWidth, bitmap.bmHeight ,SRCCOPY);
DeleteDC(dcMemory2);
}
pMemory->Detach();
// ReleaseDC(NULL,dcMemory);
DeleteDC(dcMemory);
ReleaseDC(NULL,pDC);
DeleteDC(pMemory->GetSafeHdc());
// ReleaseDC(NULL,pMemory->GetSafeHdc());
delete pMemory;
}
BOOL CMyImage::SaveDIB(HDIB hDib, CString FileName, int nQulity)
{
ASSERT(!FileName.IsEmpty());
if(FileName.IsEmpty())
return FALSE;
if(!hDib)
return FALSE;
CFile file;
CFileException fe;
CString m_strName=FileName;
CString m_strFileExt=FileName.Right(3);
m_strFileExt.MakeUpper();
if(m_strFileExt=="BMP")
{
// TRY
// {
// file.Open(csFileName, CFile::modeCreate | CFile::modeWrite,NULL))
// }
// CATCH( CFileException, e )
// {
// if( e->m_cause == CFileException::fileNotFound )
// printf( "ERROR: File not found\n");
// }
// END_CATCH
if (!file.Open(FileName, CFile::modeCreate | CFile::modeWrite |CFile::shareDenyNone, &fe))
{
// fe.ReportError();
return FALSE;
}
TRY
{
if(!SaveDIB(hDib, file))
return FALSE;
}
CATCH (CFileException, eLoad)
{
file.Abort(); // will not throw an exception
return FALSE;
}
END_CATCH
}
else if(m_strFileExt=="JPG")
{
if (nQulity<10 || nQulity>100)
nQulity = 40;
if(!SaveJPG(hDib, FileName, nQulity))
return FALSE;
}
else
{
return FALSE;
}
return TRUE;
}
//保存DIB 為BMP文件
BOOL CMyImage::SaveDIB(HDIB hDib, CFile &file)
{
if (!hDib)
return FALSE;
BITMAPFILEHEADER bfh;
memset(&bfh, 0, sizeof(bfh));
bfh.bfType = 'MB';
bfh.bfOffBits = 54;
bfh.bfSize = GlobalSize(hDib)+14;
// Write the file header
DWORD dwSize = bfh.bfSize - 14;
PBYTE ps = (PBYTE) GlobalLock(hDib);
if ( !ps )
return FALSE;
TRY
{ file.Write(&bfh, 14);
file.WriteHuge(ps, dwSize);
}
CATCH (CFileException, e)
{
BOOL b = ::GlobalUnlock(hDib);
/*win98下禁用
if(!p)
return IMAGE_ERR_UNLOCK;
*/
return FALSE;
THROW_LAST();
}
END_CATCH
BOOL b = ::GlobalUnlock(hDib);
/*win98下禁用
if(!b)
return FALSE;
*/
return TRUE;
}
//保存 DIB為JPG文件
BOOL CMyImage::SaveJPG(HDIB hDib, CString FileName, int nQulity)
{
if(FileName.IsEmpty())
return FALSE;
if(!hDib)
return FALSE;
HGLOBAL h = NULL;
DWORD dwSize = GlobalSize(hDib);
h = ::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize + 14);
if(!h)
return FALSE;
PBYTE ps=NULL,pd=NULL;
pd=(PBYTE)GlobalLock(h);
if(!pd)
{
GlobalFree(h);
return FALSE;
}
ps=(PBYTE)GlobalLock(hDib);
if(!ps)
{
GlobalUnlock(h);
GlobalFree(h);
return FALSE;
}
BITMAPFILEHEADER bfh;
memset(&bfh, 0, sizeof(bfh));
bfh.bfType = 'MB';
bfh.bfOffBits = 54;
bfh.bfSize = dwSize + 14;
memcpy(pd, &bfh, sizeof(bfh));
memcpy(pd + 14, ps, dwSize);
GlobalUnlock(h);
if(!(::SaveJPG(FileName.GetBuffer(0), h, nQulity)))
{
GlobalFree(h);
return FALSE;
}
GlobalFree(h);
return TRUE;
}
BOOL CMyImage::SaveDDB(HBITMAP hBitmap, CString FileName, int nQulity)
{
ASSERT(!FileName.IsEmpty());
if(FileName.IsEmpty())
return FALSE;
if(!hBitmap)
return FALSE;
HDIB hDib = NULL;
hDib = DDBtoDIB(hBitmap);
if(!hDib)
return FALSE;
if(!SaveDIB(hDib, FileName, nQulity))
{
GlobalFree(hDib);
return FALSE;
}
GlobalFree(hDib);
return TRUE;
}
//繪制Image對象
IMAGE_ERROR CMyImage::DrawImage(HDC hDC, CRect sRect, CRect dRect)
{
LPBYTE lp=NULL;
LPSTR lpDIBHdr=NULL; // Pointer to BITMAPINFOHEADER
LPSTR lpDIBBits=NULL; // Pointer to DIB bits
BOOL bSuccess=FALSE; // Success/fail flag
HPALETTE pOldPal=NULL; // Previous palette
// Check for valid DIB handle
if (!hImage)
return IMAGE_NULL;
// Lock down the DIB, and get a pointer to the beginning of the bit
// buffer
lp = (LPBYTE)::GlobalLock(hImage);
if(!lp)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -