鄧振波
在Visual C++中,對圖象操作的功能所能提供的函數是比較弱的,我在實踐中收集掌握了一些圖象出來的方法與技巧,總結出一個COperateBitmap類,可以實現方便的對圖象的讀取、保存、剪貼板操作、DIB和DDB的轉換,下面列出頭文件,工程文件我把它寫成了一個MFC擴展DLL。可以點擊 這里 下載。 1、方便從磁盤裝載各種圖形格式(JPG、BMP、Gif等)文件,并得到圖象大小和相應位圖的句柄,從而可以方便的操作各種圖像格式, 無需了解各種圖象的格式,以及相應的壓縮解壓算法,得到的位圖句柄, 可以方便的在VC中進行各種操作。 2、把位圖畫到DC上,方便的把位圖畫到設備DC上,無需復雜的SelectObject等 3、通過位圖建立區域,可以生成各種形狀的窗口 4、方便的兩個位圖復制操作,支持部分區域拷貝 5、不用StretchBlt函數,直接改變位圖的大小,StretchBlt只改變顯示的大小,實際的數據并沒有發生變化,本類中的ScaleBitmap可以直接改變實際數據的大小,這將獲得一些有用的功能 6、DDB與DIB的轉換 7、保存位圖到文件,保存為JPEG文件
這個類沒有作過多的優化與功能擴充,如果要寫專業的圖象操作程序,本類可能不適用。
class COperateBitmap { public: BOOL CopyWindowToClipboard(CWnd* pWnd); //剪貼板操作 BOOL CopyDIBToClipboard(const CWnd* pWnd,HANDLE hDib,CPalette* pPal); BOOL CopyBitmapToClipboard(const CWnd* pWnd,CBitmap& bitmap,CPalette* pPal); //建立調色版,根據DIB BOOL CreateDIBPalette(HANDLE hDIB, CPalette* pPal); //DDB和DIB的轉換 HANDLE DDBToDIB(HBITMAP hBmp, DWORD dwCompression, CPalette *pPal); HBITMAP DIBToDDB( HANDLE hDIB ); HANDLE DDBToDIB( CBitmap& bitmap, DWORD dwCompression, CPalette* pPal ); int SaveBmp(HANDLE hDib,LPSTR filename); //從文件裝載各種圖形格式(JPG、BMP、Gif等),并得到大小和位圖的句柄 void LoadPictureFromFile(HDC hdc, LPCTSTR szFile, CBitmap* pBitmap, CSize& mSize); //把位圖畫到DC上 void DrawBitmap(CDC* dc, HBITMAP hbmp, RECT r, BOOL Stretch); //建立區域 BOOL CreateRegion (RECT r, CRgn *pRgn, CBitmap *pBitmap, COLORREF keycol); //兩個位圖對拷 void CopyBitmap(CDC* dc, CBitmap& mRes, const CBitmap& hbmp, RECT r); //由位圖到區域 HRGN BitmapToRegion (HBITMAP hBmp, COLORREF cTransparentColor = 0, COLORREF cTolerance = 0x101010); COperateBitmap(); //縮放圖象主函數,由Ivaylo Byalko編寫 HBITMAP ScaleBitmap(HBITMAP hBmp, WORD wNewWidth, WORD wNewHeight); //保存DIB為JPEG文件 BOOL JpegFromDib(HANDLE hDib, //Handle to DIB int nQuality, //JPEG quality (0-100) CString strJpegFileName, //Pathname to target jpeg file CString* strMsg); //Error msg to return virtual ~COperateBitmap(); protected: //下面三個縮放圖象輔助函數,由Ivaylo Byalko編寫 BITMAPINFO *PrepareRGBBitmapInfo(WORD wWidth, WORD wHeight); void ShrinkData(BYTE *pInBuff, WORD wWidth, WORD wHeight, BYTE *pOutBuff, WORD wNewWidth, WORD wNewHeight); void EnlargeData(BYTE *pInBuff, WORD wWidth, WORD wHeight, BYTE *pOutBuff, WORD wNewWidth, WORD wNewHeight); WORD DIBNumColors(LPSTR lpbi); WORD PaletteSize(LPSTR lpbi); float *CreateCoeff(int nLen, int nNewLen, BOOL bShrink); //操作JPEG文件 BOOL BuildSamps(HANDLE hDib, int nSampsPerRow, struct jpeg_compress_struct cinfo, JSAMPARRAY jsmpArray, CString* pcsMsg); RGBQUAD QuadFromWord(WORD b16); BOOL DibToSamps(HANDLE hDib, int nSampsPerRow, struct jpeg_compress_struct cinfo, JSAMPARRAY jsmpPixels, CString* pcsMsg); };
|