2009-12-08 72 views
2

我有一個用自己的alpha混合的png圖像文件。現在我想將它加載到移動設備上的表單中。我嘗試了很多方法,但沒有工作。有沒有解決方法?提前致謝。 這是我用來從資源加載圖像:C#精簡框架:加載一個png alpha混合文件

Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("drawObj.Graph.png"); 
Bitmap myPNGImg = new Bitmap(stream); 

然後創建與圖像Graph.png的同樣大小的新位圖:

Bitmap myBlankImg = new Bitmap(48,48); 

Graphics mynewGraph = Graphics.FromImage(myNew); 

mynewGraph.Clear(Color.Transparent); 

繪製PNG位圖:mynewGraph.DrawImage(myPNGImg, 0, 0); 然後這是我從網上:(

Rectangle rectDest = new Rectangle(50,50, 100, 100); 

ImageAttributes imgatt = new ImageAttributes(); 

imgatt.SetColorKey(Color.Transparent, Color.Transparent); 

myGraph.DrawImage(myNew, rectDest, 0, 0, 99, 99,GraphicsUnit.Pixel, imgatt); 

它的工作原理看,只是清除四個角的圖像(圓rectan的somekind的GLE)。圖像左側仍然有一些白色邊框。

+0

也許你可以發表一些代碼... – 2009-12-08 07:08:21

+0

因爲我不熟悉CF和它的圖形限制,我只是將它添加爲一個評論:通常的來源不需要的「邊緣」在一個PNG的阿爾法是創建與反alisasing的PNG。有一篇關於CodeProject的文章(在WinForms中使用LayeredWindow [WS_EX_LAYERED]的上下文中):http://www.codeproject.com/KB/miscctrl/AlphaForm.aspx – BillW 2009-12-08 07:57:35

回答

2

在Compact Framework上使用位圖加載圖像將丟失alpha信息。設置顏色鍵是透明度的一種替代方法,您可以犧牲精確的單一顏色作爲透明顏色。

要在Compact Framework上使用Alpha混合,您可以使用OpenNETCF的幫助器類加載PNG文件,保留alpha信息(請參閱Transparency and alpha blending),然後使用P/Invoke AlphaBlend。這不是很好,但它是需要的。另外要警告的是,使用alpha混合將會帶來沉重的性能提升。要動態地烘焙一些圖像,這很好,但對於通用的屏幕繪製操作,您可能需要使用其他方法。

+0

我不試圖使透明我的PNG圖像。我只需要清除我的PNG圖像中的所有透明圖像,並將左側圖像繪製到窗體上。所以,我必須按照你所說的做P/Invoke AlphaBlend步驟嗎? – Thyphuong 2009-12-08 07:48:56

+0

正如有人指出(然後刪除了他們的評論?),該問題可能來自抗鋸齒圖像,其中圖像的某些部分不完全透明,也不完全不透明。您正在使用的方法僅處理那些用於表示圖像的透明部分的單一精確顏色的情況。如果這就是你所需要的,那麼你可以用你最喜歡的圖像處理程序首先修正圖像。 – SoftMemes 2009-12-08 07:57:08

+0

這裏的問題是,我不允許編輯圖像,我也無法導入OpenNetCF。任何其他方式?謝謝 – Thyphuong 2009-12-08 08:12:28

0

問題是在CF中,填充Color.Transparent實際上是用白色填充的(請參閱these twoblog entries)。 Project Resistance有一個非常好的例子來說明如何做到這一點混合(實際上有幾個)。