迅雷Bolt庫中的圖像拉伸的效果鋸齒比較嚴重,常見的致使鋸齒的狀況:算法
一、在使用ImageObject時,drawmode爲1拉伸模式下;函數
二、使用Bitmap類的Stretch函數拉伸圖像;優化
雖然ImageObject有antialias屬性支持反走樣,不過設置後沒有特別明顯的優化效果。lua
解決鋸齒的辦法就是用C++編寫拉伸函數,你們在處理時能夠參考我寫的處理函數:spa
int CXLuaCImpl::StretchBitmap(lua_State* luaState) { XL_BITMAP_HANDLE hXLBitmap = NULL; if (XLUE_CheckBitmap(luaState, 2, &hXLBitmap)) { int nWidth = lua_tointeger(luaState,3); int nHeight = lua_tointeger(luaState,4); CImage oldImage; CImage newImage; HBITMAP hBitmap = TransparentImage(XLGP_ConvertXLBitmapToDIB(hXLBitmap, 32)); oldImage.Attach(hBitmap); if(!newImage.CreateEx(nWidth, nHeight, 24, BI_RGB)) { oldImage.Detach(); return 0; } int nPreMode = ::SetStretchBltMode(newImage.GetDC(), HALFTONE); newImage.ReleaseDC(); oldImage.Draw(newImage.GetDC(), 0, 0, nWidth, nHeight, 0, 0, oldImage.GetWidth(), oldImage.GetHeight()); newImage.ReleaseDC(); ::SetBrushOrgEx(newImage.GetDC(), 0, 0, NULL); newImage.ReleaseDC(); ::SetStretchBltMode(newImage.GetDC(), nPreMode); newImage.ReleaseDC(); oldImage.Detach(); hXLBitmap = XLGP_ConvertDDBToXLBitmap(CClientDC(NULL), newImage.Detach(), XLGRAPHIC_CT_ARGB32); XLUE_PushBitmap(luaState,hXLBitmap); return 1; } return 0; }
函數沒有使用專業的處理算法,不過鋸齒明顯有改善,能知足平常需求。blog
記錄,爲更好的本身!it