迅雷Bolt圖像拉伸不清晰的解決辦法

迅雷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

相關文章
相關標籤/搜索