常用的图象处理函数的整理
邓振波
在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);
};
更多文章请访问http://seesi.51.net