?? myimage.cpp
字號:
return IMAGE_ERR_LOCK;
lpDIBHdr = (LPSTR)(lp+14);
LPBITMAPINFOHEADER lpbih = (LPBITMAPINFOHEADER)lpDIBHdr;
lpDIBBits = lpDIBHdr + *(LPDWORD)lpDIBHdr;/* + PaletteSize(lpDIBHdr);*///調色板長度
// Get the DIB's palette, then select it into DC
// Select as background since we have
// already realized in forground if needed
/* 設置調色板
if (m_pPal != NULL)
{
pOldPal = SelectPalette(pDC,(HPALETTE )m_pPal->m_hObject,TRUE);
RealizePalette(pDC);
}
*/
// Make sure to use the stretching mode best for color pictures
SetStretchBltMode(hDC,COLORONCOLOR);
// Determine whether to call StretchDIBits() or SetDIBitsToDevice()
if (dRect.Width()==sRect.Width()&&dRect.Height()==sRect.Height())
bSuccess = SetDIBitsToDevice(hDC,dRect.left,dRect.top,
dRect.Width(),dRect.Height(),sRect.left,
lpbih->biHeight-sRect.top-sRect.Height(),0,lpbih->biHeight,
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
else
bSuccess = ::StretchDIBits(hDC,dRect.left,dRect.top,dRect.Width(),
dRect.Height(),sRect.left,sRect.top,sRect.Width(),sRect.Height(),
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
::GlobalUnlock(hImage);
// Reselect old palette
if (pOldPal != NULL) SelectPalette(hDC,pOldPal, TRUE);
if(bSuccess)
return IMAGE_OK;
else return IMAGE_ERR_DRAW;
}
//繪制DDB位圖
BOOL CMyImage::DrawDDB(HBITMAP hBitmap, HDC hDC, CRect sRect, CRect dRect)
{
HBITMAP holdbitmap=NULL;
HDC hmemdc=NULL;
//hBitmap = (HBITMAP)::LoadImage(NULL, "d:\\111.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
hmemdc = ::CreateCompatibleDC(hDC);
holdbitmap = (HBITMAP)::SelectObject(hmemdc, hBitmap);
BOOL bSuccess = FALSE;
if (dRect.Width()==sRect.Width()&&dRect.Height()==sRect.Height())
bSuccess = BitBlt(hDC,dRect.left,dRect.top,
dRect.Width(),dRect.Height(),hmemdc,sRect.left,sRect.top,SRCCOPY);
else
bSuccess = ::StretchBlt(hDC,dRect.left,dRect.top,dRect.Width(),
dRect.Height(),hmemdc, sRect.left,sRect.top,sRect.Width(),sRect.Height(),SRCCOPY);
::SelectObject(hmemdc, holdbitmap);
::DeleteDC(hmemdc);
return bSuccess;
}
//繪制DIB位圖
BOOL CMyImage::DrawDIB(HDIB hDib, HDC hDC, CRect sRect, CRect dRect)
{
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 (hDib == NULL) return FALSE;
// Lock down the DIB, and get a pointer to the beginning of the bit
// buffer
lpDIBHdr = (LPSTR)::GlobalLock(hDib);
if(!lpDIBHdr)
return FALSE;
LPBITMAPINFOHEADER lpbih = (LPBITMAPINFOHEADER)lpDIBHdr;
lpDIBBits = lpDIBHdr + *(LPDWORD)lpDIBHdr;/* + PaletteSize(lpDIBHdr);*///調色板長度
// Get the DIB's palette, then select it into DC
// Select as background since we have
// already realized in forground if needed
/* 設置調色板
if (m_pPal != NULL)
{
pOldPal = SelectPalette(pDC,(HPALETTE )m_pPal->m_hObject,TRUE);
RealizePalette(pDC);
}
*/
// Make sure to use the stretching mode best for color pictures
SetStretchBltMode(hDC,COLORONCOLOR);
// Determine whether to call StretchDIBits() or SetDIBitsToDevice()
if (dRect.Width()==sRect.Width()&&dRect.Height()==sRect.Height())
bSuccess = SetDIBitsToDevice(hDC,dRect.left,dRect.top,
dRect.Width(),dRect.Height(),sRect.left,
lpbih->biHeight-sRect.top-sRect.Height(),0,lpbih->biHeight,
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
else
bSuccess = ::StretchDIBits(hDC,dRect.left,dRect.top,dRect.Width(),
dRect.Height(),sRect.left,sRect.top,sRect.Width(),sRect.Height(),
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
::GlobalUnlock(hDib);
// Reselect old palette
if (pOldPal != NULL) SelectPalette(hDC,pOldPal, TRUE);
return bSuccess;
}
/*
這是一個用來畫透明位圖的函數
CDC *pDC 需要畫位圖的CDC指針
UINT IDImage 位圖資源ID
CRect &rect 指定位圖在pDC中的位置
COLORREF rgbMask 位圖的透明色
*/
void CMyImage::DrawTransparentBitmap(CDC *pDC, UINT IDImage, CRect &rect, COLORREF rgbMask)
{
CDC ImageDC,MaskDC;
CBitmap Image,*pOldImage;
CBitmap maskBitmap,*pOldMaskDCBitmap ;
Image.LoadBitmap(IDImage);
ImageDC.CreateCompatibleDC(pDC);
pOldImage=ImageDC.SelectObject(&Image);
MaskDC.CreateCompatibleDC(pDC);
maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );
ImageDC.SetBkColor(rgbMask);
MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );
ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);
MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
}
//顯示錯誤信息
void CMyImage::ShowErr(IMAGE_ERROR err)
{
switch(err) {
case IMAGE_OK:
break;
case IMAGE_NULL:
AfxMessageBox("圖像Image為空--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_CREATE:
AfxMessageBox("創建圖像Image失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_FREE: //釋放圖像Image失敗
AfxMessageBox("釋放圖像Image失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_LOCK: //鎖定圖像Image失敗
AfxMessageBox("鎖定圖像Image失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_UNLOCK: //解鎖圖像Image失敗
AfxMessageBox("解鎖圖像Image失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_READFILE: //讀圖像文件失敗
AfxMessageBox("讀圖像文件失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_FILENOTEXIST: //文件不存在
AfxMessageBox("圖像文件不存在--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_RGB: //圖像格式不對//目前只能處理24位真彩色
AfxMessageBox("圖像格式不對|目前只能處理24位真彩色--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_IMAGELOAD_SAVE: //調用ImageLoad讀寫JPG圖像失敗
AfxMessageBox("調用ImageLoad寫JPG圖像失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_IMAGELOAD_READ:
AfxMessageBox("調用ImageLoad讀JPG圖像失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_INFOHEADER: //沒有指定BITMAPINFOHEADER(m_bih)
AfxMessageBox("沒有指定位圖頭信息--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_WRITEFILE: //寫文件失敗()
AfxMessageBox("寫文件失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_NOTSUPPORTFILE: //不支持的圖像格式(只支持BMP和JPG)
AfxMessageBox("不支持的圖像格式(只支持BMP和JPG)--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_SIZE: //緩沖大小不正確
AfxMessageBox("緩沖大小不正確--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_NOFILENAME: //文件名稱為空
AfxMessageBox("文件名稱為空--CMyImage", MB_OK | MB_ICONERROR);
break;
case IMAGE_ERR_DRAW: //用StretchDIBits或SetDIBitsToDevice繪制圖像時失敗
AfxMessageBox("用StretchDIBits或SetDIBitsToDevice繪制圖像時失敗--CMyImage", MB_OK | MB_ICONERROR);
break;
default:
AfxMessageBox("未知錯誤--CMyImage", MB_OK | MB_ICONERROR);
}
}
//從文件獲得DIB位圖
HDIB CMyImage::LoadDIB(CString FileName)
{
if(FileName.IsEmpty())
return NULL;
CFile file;
CFileException fe;
if (!file.Open(FileName, CFile::modeRead | CFile::shareDenyNone , &fe))
{
// MessageBox(NULL,"無法讀取文件!","錯誤",MB_ICONSTOP);
return NULL;
}
HDIB hDib = NULL;
CString m_strName=FileName;
CString m_strFileExt=FileName.Right(3);
m_strFileExt.MakeUpper();
if(m_strFileExt=="BMP")
{
TRY
{
hDib = LoadDIB(file);
if( !hDib )
{
file.Close();
return NULL;
}
}
CATCH (CFileException, eLoad)
{
file.Abort(); // will not throw an exception
return NULL;
}
END_CATCH
}
else if(m_strFileExt=="JPG")
{
// file.Close();
hDib = LoadDibJPG(FileName);
if( !hDib)
return NULL;
}
else
{
file.Close();
return NULL;
}
file.Close();
return hDib;
}
//從BMP文件中獲得DIB
HDIB CMyImage::LoadDIB(CFile &file)
{
BITMAPFILEHEADER bmfHeader;
LPBITMAPINFOHEADER lpbmi=NULL; // pointer to a Win 3.0-style DIB
LPBITMAPINFO lpbmifo=NULL;
BITMAPINFO BitmapInfo;
LPBYTE pDIB=NULL;
// Get length of DIB in bytes for use when reading
DWORD m_dwBitsSize = file.GetLength()-sizeof(BITMAPFILEHEADER);
// Go read the DIB file header and check if it's valid.
if(file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return NULL;
if (bmfHeader.bfType != DIB_HEADER_MARKER)
return NULL;
if(file.Read((LPSTR)&BitmapInfo, sizeof(BitmapInfo)) != sizeof(BitmapInfo))
return NULL;
if(BitmapInfo.bmiHeader.biBitCount!=24)
{
// MessageBox(NULL,"讀取圖像文件錯誤,目前只支持24位真彩色圖像。","讀取圖像文件錯誤",MB_OK|MB_ICONERROR);
return NULL;
}
DWORD dwWidth=BitmapInfo.bmiHeader.biWidth;
DWORD dwHeight=BitmapInfo.bmiHeader.biHeight;
DWORD dwWidthOfByte=WIDTHBYTES(dwWidth*24);
DWORD dwTemp=dwWidthOfByte*dwHeight+sizeof(BITMAPINFOHEADER);
if(dwTemp>m_dwBitsSize)
m_dwBitsSize=dwTemp;
DWORD dwDibOffset=bmfHeader.bfOffBits;
HDIB hDib = NULL;
hDib = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, m_dwBitsSize);
if(!hDib)
return NULL;
// Allocate memory for DIB
// m_hDIB = (HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,m_dwBitsSize );
//Allocate memory error
// if (m_hDIB == NULL) return FALSE;
PBYTE aa = NULL;
aa =(PBYTE)::GlobalLock(hDib);
if(!aa)
{
GlobalFree(hDib);
return NULL;
}
// memcpy(aa, &bmfHeader, 14);
// memcpy(aa + 14, &(BitmapInfo->bmiHeader), 40);
pDIB = aa;
//Point to BITMAPINFOHEADER structure
lpbmi=(LPBITMAPINFOHEADER)pDIB;
lpbmifo=(LPBITMAPINFO)pDIB;
// m_lpBitmapInfoHeader=(LPBITMAPINFOHEADER)pDIB;
file.Seek(sizeof(BITMAPFILEHEADER),CFile::begin);
// Go read the bits.
if(file.ReadHuge(pDIB, m_dwBitsSize)!=m_dwBitsSize)
{
BOOL b = ::GlobalUnlock(hDib);
/*win98下不能使用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
GlobalFree(hDib);
return NULL;
}
if(lpbmi->biCompression!=BI_RGB)
{
BOOL b = ::GlobalUnlock(hDib);
/*win98下不能使用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
GlobalFree(hDib);
return NULL;
}
BOOL b = ::GlobalUnlock(hDib);
/*win98下不能使用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
return hDib;
}
//從JPG文件中獲得DIB
HDIB CMyImage::LoadDibJPG(CString FileName)
{
if(FileName.IsEmpty())
return NULL;
HGLOBAL h = NULL;
h = ::LoadJPG(LPCTSTR(FileName));
if(h==NULL)
return NULL;
PBYTE lp = NULL;
DWORD dwSize = GlobalSize(h);
lp = (LPBYTE)::GlobalLock(h);
if(!lp)
{
GlobalFree(h);
return NULL;
}
HDIB hDib = NULL;
hDib = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize - 14);
if(!hDib)
return NULL;
PBYTE lpd = NULL;
lpd = (PBYTE)::GlobalLock(hDib);
if(!lpd)
{
GlobalUnlock(h);
GlobalFree(h);
return NULL;
}
memcpy(lpd, lp + 14, dwSize -14);
BOOL b = ::GlobalUnlock(h);
b = GlobalUnlock(hDib);
/*win98下不能使用
if(!b)
return IMAGE_ERR_UNLOCK;
*/
return hDib;
}
//從文件獲得DDB位圖
HBITMAP CMyImage::LoadDDB(CString FileName)
{
if(FileName.IsEmpty())
return NULL;
HDIB h = NULL;
h =LoadDIB(FileName);
if(!h)
return NULL;
HBITMAP hBitmap = NULL;
hBitmap = DIBtoDDB(h);
if(!hBitmap)
{
GlobalFree(h);
return NULL;
}
return hBitmap;
}
BOOL CMyImage::GetBih(HDIB hDib, int &width, int &height, int &bitscount)
{
width=0;
height=0;
bitscount=24;
if(!hDib)
return FALSE;
PBYTE lp = NULL;
lp = (PBYTE)GlobalLock(hDib);
if(!lp)
{
return FALSE;
}
LPBITMAPINFOHEADER lpbih = (LPBITMAPINFOHEADER)lp;
width = lpbih->biWidth;
height = lpbih->biHeight;
bitscount = lpbih->biBitCount;
BOOL b = GlobalUnlock(hDib);
return TRUE;
}
BOOL CMyImage::GetBih(HBITMAP hBitmap, int &width, int &height, int &bitscount)
{
width = 0;height=0;bitscount=24;
if(!hBitmap)
return FALSE;
BITMAP bitmap;
// 計算位圖文件每個像素所占字節數
::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
width = bitmap.bmWidth;
height = bitmap.bmHeight;
bitscount = bitmap.bmBitsPixel;
return TRUE;
}
//復制MyImage對象
CMyImage* CMyImage::CopyImage(CMyImage *pImage)
{
if(!pImage)
return NULL;
DWORD dwSize = 0;
dwSize = GetImageSize(pImage);
IMAGE_ERROR err=IMAGE_OK;
PBYTE ld=NULL, ls=NULL;
if(dwSize > 0 )
{
CMyImage* Image = new CMyImage();
if(!Image)
return NULL;
err = Image->CreateObject(dwSize);
if(err != IMAGE_OK)
return NULL;
ls = (PBYTE)::GlobalLock(pImage->hImage);
if(!ls)
{
delete Image;
Image = NULL;
return NULL;
}
ld = (PBYTE)::GlobalLock(Image->hImage);
if(!ld)
{
delete Image;
Image = NULL;
GlobalUnlock(pImage->hImage);
return NULL;
}
memcpy(ld, ls, dwSize);
GlobalUnlock(Image->hImage);
GlobalUnlock(pImage->hImage);
return Image;
}
else
return NULL;
}
//獲取MyImage對象的大小
DWORD CMyImage::GetImageSize(CMyImage* pImage)
{
if(!hImage)
return 0;
DWORD dwSize = GlobalSize(hImage);
return dwSize;
}
//復制DIB位圖
HDIB CMyImage::CopyDIB(HDIB hDib)
{
if(!hDib)
return NULL;
DWORD dwSize = GlobalSize(hDib);
HDIB h = NULL;
h = (HDIB)::GlobalAlloc(GHND/*GMEM_FIXED*/, dwSize);
if(!h)
return NULL;
PBYTE ls=NULL,ld=NULL;
ls = (PBYTE)::GlobalLock(hDib);
if(!ls)
{
return NULL;
}
ld = (PBYTE)::GlobalLock(h);
if(!ld)
{
::GlobalUnlock(hDib);
::GlobalFree(h);
return NULL;
}
memcpy(ld, ls, dwSize);
GlobalUnlock(hDib);
GlobalUnlock(h);
return h;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -