女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]這幾天放假在家無(wú)聊編一個(gè)程序,在加載png時(shí)遇到了麻煩,后來(lái)用了兩個(gè)方法解決了。一個(gè)是用GDI+,另外就是用vs.net MFC自帶的CImage。先看看GDI+的方法方法1:1.GDI+畫(huà)透明圖層

這幾天放假在家無(wú)聊編一個(gè)程序,在加載png時(shí)遇到了麻煩,后來(lái)用了兩個(gè)方法解決了。一個(gè)是用GDI+,另外就是用vs.net MFC自帶的CImage。

先看看GDI+的方法
方法1:

1.GDI+畫(huà)透明圖層(alpha)的png圖片


stdafx加入如下:


#include?//初始化一下com口
#include?"GdiPlus.h"
using?namespace?Gdiplus;
#pragma?comment(lib,"gdiplus.lib")



開(kāi)始初始化:
在app類(lèi)的聲明里(.h)加入:


ULONG_PTR?m_gdiplusToken;



InitInstance()里加入://若沒(méi)有usingnamespace Gdiplus; 就要在前面加Gdiplus::



GdiplusStartupInput?gdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken,?&gdiplusStartupInput,?NULL);



重載ExitInstance,加入GdiplusShutdown(m_gdiplusToken);


int?CxxxApp::ExitInstance()
{
	//?TODO:?在此添加專(zhuān)用代碼和/或調(diào)用基類(lèi)
	GdiplusShutdown(m_gdiplusToken);
	return?CWinApp::ExitInstance();
}



顯示圖片的過(guò)程如下

CClientDC?*pDC?=?new?CClientDC(GetDlgItem(IDC_STATIC_PIC));
CRect?rect;
GetDlgItem(IDC_STATIC_PIC)->GetWindowRect(&rect);
Graphics?graphics(pDC->m_hDC);?//?Create?a?GDI+?graphics?object
Image?image(_T("1.png"));?//?Construct?an?image
graphics.DrawImage(&image,?0,?0,?image.GetWidth(),?image.GetHeight());
delete?pDC;


這是用GDI+來(lái)顯示圖片。


2.CImage繪制帶alpha透明圖層的png圖片 用MFC自帶的CImage也可以顯示,不過(guò)要稍微進(jìn)行轉(zhuǎn)換才能得到正常的帶α通道的png圖片! 在畫(huà)圖前進(jìn)行一次轉(zhuǎn)換,其中Image是CImage的對(duì)象

if?(Image.GetBPP()?==?32)?//確認(rèn)該圖像包含Alpha通道
{
	int?i;
	int?j;
	for?(i?=?0;?i?<?Image.GetWidth();?i++)
	{
		for?(j?=?0;?j?<?Image.GetHeight();?j++)
		{
			byte?*pByte?=?(byte?*)Image.GetPixelAddress(i,?j);
			pByte[0]?=?pByte[0]?*?pByte[3]?/?255;
			pByte[1]?=?pByte[1]?*?pByte[3]?/?255;
			pByte[2]?=?pByte[2]?*?pByte[3]?/?255;
		}
	}
}


具體方法如下:


HWND?hwnd?=?GetSafeHwnd();?//獲取窗口的HWND
::InvalidateRect(?hwnd,?NULL,?true?);?//或者?::InvalidateRect(?hwnd,?NULL,?false?);
::UpdateWindow(hwnd);
//若使用前不想把原來(lái)繪制的圖片去掉,可以刪去上面那三段
CDC?*pDC?=?GetDC();
CImage?Image;
Image.Load(strPath);
if?(Image.IsNull())
{
	MessageBox(_T("沒(méi)加載成功"));
	return?-1;
}
if?(Image.GetBPP()?==?32)?//確認(rèn)該圖像包含Alpha通道
{
	int?i;
	int?j;
	for?(i?=?0;?i?<?Image.GetWidth();?i++)
	{
		for?(j?=?0;?j?<?Image.GetHeight();?j++)
		{
			byte?*pByte?=?(byte?*)Image.GetPixelAddress(i,?j);
			pByte[0]?=?pByte[0]?*?pByte[3]?/?255;
			pByte[1]?=?pByte[1]?*?pByte[3]?/?255;
			pByte[2]?=?pByte[2]?*?pByte[3]?/?255;
		}
	}
}
Image.Draw(pDC->m_hDC,?0,?0);
Image.Destroy();
ReleaseDC(pDC);


代碼中內(nèi)部的框架是對(duì)圖像的再次處理,對(duì)原來(lái)進(jìn)行了修正,這樣得到的更加正常,代碼實(shí)測(cè)如下
繪圖后效果

為了方便,封裝成一個(gè)通用函數(shù): pWnd是需要顯示圖片的控件窗口,strPicPath是png圖片地址,bAutoFit是否需要自動(dòng)適應(yīng)pWnd的窗口

bool?ShowPNGInCtrl(CWnd*?pWnd,const?CString&?strPicPath,BOOL?bAutoFit)
{
	if?(NULL?==?pWnd)
	{
		return?false;
	}
	if?(NULL?==?pWnd->GetSafeHwnd())
	{
		return?false;
	}
	if?(strPicPath.GetLength()GetClientRect(rect);???
		HRESULT?hr;
		hr?=?img.Load(strPicPath);
		if?(S_OK?!=?hr)
		{
			return?false;
		}
		std::unique_ptrpDc;
		pDc.reset(new?CClientDC(pWnd));

		if?(bAutoFit)
		{
			if?(img.GetWidth()>img.GetHeight())//說(shuō)明圖片是長(zhǎng)方形
			{
				nDw??=?rect.Width();
				nDh??=?(int)(nDw?*?img.GetHeight()?/?img.GetWidth());
				nDPx?=?0;
				nDPy?=?(int)(rect.Height()/2.0?-?nDh/2.0);
				if?(nDh>rect.Height())//說(shuō)明圖片控件是橫著放,這時(shí)候就要再次縮減
				{
					nDh	?=rect.Height();
					nDw??=(int)(?img.GetWidth()*nDh/img.GetHeight());
					nDPy?=?0;
					nDPx?=(int)?(rect.Width()/2.0?-?nDw/2.0);
				}
			}
			else//說(shuō)明豎著比較明顯
			{
				nDh??=?rect.Height();
				nDw??=(int)(?img.GetWidth()*nDh/img.GetHeight());
				nDPy?=?0;
				nDPx?=(int)?(rect.Width()/2.0?-?nDw/2.0);
				if?(nDw>rect.Width())//說(shuō)明是另外一種情況
				{
					nDw??=?rect.Width();
					nDh??=?(int)(nDw?*?img.GetHeight()?/?img.GetWidth());
					nDPx?=?0;
					nDPy?=?(int)(rect.Height()/2.0?-?nDh/2.0);
				}
			}
		}
		else
		{
			nDw?=?img.GetWidth();
			nDh?=?img.GetHeight();
		}
		if?(img.GetBPP()?==?32)?//確認(rèn)該圖像包含Alpha通道
		{
			int?i;
			int?j;
			for?(i=0;?i<img.GetWidth();?i++)
			{
				for?(j=0;?jSetStretchBltMode(HALFTONE);
		img.Draw(pDc->m_hDC,nDPx,nDPy,nDw,nDh);
		//img.TransparentBlt(pDc->m_hDC,nDPx,nDPy,nDw,nDh,RGB(255,?255,?255));
	}
	catch?(...)
	{
		return?false;
	}
	return?true;
}





------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 3.如果圖片是在資源里的時(shí)候加載方法又不一樣
這時(shí)需要兩個(gè)函數(shù), 對(duì)于GDI+如下:

BOOL?ImageFromIDResource(UINT?nID,?LPCTSTR?sTR,Image?*&pImg)
{
	HINSTANCE?hInst?=?AfxGetResourceHandle();
	HRSRC?hRsrc?=?::FindResource?(hInst,MAKEINTRESOURCE(nID),sTR);?//?type
	if?(!hRsrc)
		return?FALSE;
	//?load?resource?into?memory
	DWORD?len?=?SizeofResource(hInst,?hRsrc);
	BYTE*?lpRsrc?=?(BYTE*)LoadResource(hInst,?hRsrc);
	if?(!lpRsrc)
		return?FALSE;
	//?Allocate?global?memory?on?which?to?create?stream
	HGLOBAL?m_hMem?=?GlobalAlloc(GMEM_FIXED,?len);
	BYTE*?pmem?=?(BYTE*)GlobalLock(m_hMem);
	memcpy(pmem,lpRsrc,len);
	GlobalUnlock(m_hMem);
	IStream*?pstm;
	CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
	//?load?from?stream
	pImg=Gdiplus::Image::FromStream(pstm);
	//?free/release?stuff
	pstm->Release();
	FreeResource(lpRsrc);
	GlobalFree(m_hMem);
	return?TRUE;
}



這時(shí)加載圖片的代碼變?yōu)椋?/p>

CClientDC?*pDC?=?new?CClientDC(GetDlgItem(IDC_STATIC_PIC));
CRect?rect;
GetDlgItem(IDC_STATIC_PIC)->GetWindowRect(&rect);
Graphics?graphics(pDC->m_hDC);?//?Create?a?GDI+?graphics?object
Image?*pimage;?//?Construct?an?image
ImageFromIDResource(IDB_PNG1,_T("PNG"),pimage);
graphics.DrawImage(pimage,?0,?0,pimage->GetWidth(),?pimage->GetHeight());
delete?pDC;



用CImage時(shí)需要如下函數(shù):

BOOL?LoadImageFromResource(CImage?*pImage,?UINT?nResID,LPCTSTR?lpTyp)
{
	if?(?pImage?==?NULL)?
		return?false;
	pImage->Destroy();
	//?查找資源
	HRSRC?hRsrc?=?::FindResource(AfxGetResourceHandle(),?MAKEINTRESOURCE(nResID),?lpTyp);
	if?(hRsrc?==?NULL)?
		return?false;
	//?加載資源
	HGLOBAL?hImgData?=?::LoadResource(AfxGetResourceHandle(),?hRsrc);
	if?(hImgData?==?NULL)
	{
		::FreeResource(hImgData);
		return?false;
	}
	//?鎖定內(nèi)存中的指定資源
	LPVOID?lpVoid?=?::LockResource(hImgData);
	LPSTREAM?pStream?=?NULL;
	DWORD?dwSize?=?::SizeofResource(AfxGetResourceHandle(),?hRsrc);
	HGLOBAL?hNew?=?::GlobalAlloc(GHND,?dwSize);
	LPBYTE?lpByte?=?(LPBYTE)::GlobalLock(hNew);
	::memcpy(lpByte,?lpVoid,?dwSize);
	//?解除內(nèi)存中的指定資源
	::GlobalUnlock(hNew);
	//?從指定內(nèi)存創(chuàng)建流對(duì)象
	HRESULT?ht?=?::CreateStreamOnHGlobal(hNew,?TRUE,?&pStream);
	if?(?ht?!=?S_OK?)
	{
		GlobalFree(hNew);
	}
	else
	{
		//?加載圖片
		pImage->Load(pStream);
		GlobalFree(hNew);
	}
	//?釋放資源
	::FreeResource(hImgData);
	return?true;
}



這時(shí)加載圖片的代碼如下:

HWND?hwnd?=?GetSafeHwnd();?//獲取窗口的HWND
::InvalidateRect(?hwnd,?NULL,?true?);?//或者?::InvalidateRect(?hwnd,?NULL,?false?);
::UpdateWindow(hwnd);?
CDC?*pDC?=?GetDC();
CImage?Image;
LoadImageFromResource(&Image,IDB_PNG1,_T("PNG"));
if?(Image.IsNull())
{
	MessageBox(_T("沒(méi)加載成功"));
	return;
}
if?(Image.GetBPP()?==?32)?//確認(rèn)該圖像包含Alpha通道
{?
	int?i;
	int?j;
	for?(i=0;?i<Image.GetWidth();?i++)
	{
		for?(j=0;?jm_hDC,0,0);
Image.Destroy();
ReleaseDC(pDC);




另 要注意的是,最好把繪圖放在OnPaint消息響應(yīng)里,否則,OnSize消息觸發(fā)OnPaint重繪時(shí)可能會(huì)把之前的繪圖全部清除

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉