邓振波
在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 dwComdivssion, CPalette *pPal); HBITMAP DIBToDDB( HANDLE hDIB ); HANDLE DDBToDIB( CBitmap& bitmap, DWORD dwComdivssion, 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_comdivss_struct cinfo, JSAMPARRAY jsmpArray, CString* pcsMsg); RGBQUAD QuadFromWord(WORD b16); BOOL DibToSamps(HANDLE hDib, int nSampsPerRow, struct jpeg_comdivss_struct cinfo, JSAMPARRAY jsmpPixels, CString* pcsMsg); }; |