常用的图象处理函数的整理 邓振波
在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);//建立调色版,根据DIBBOOL 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 DIBint nQuality, //JPEG quality (0-100)CString strJpegFileName, //Pathname to target jpeg fileCString* strMsg); //Error msg to returnvirtual ~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);};
下载工程源文件
更多文章请访问http://seesi.51.net