2009-12-08 73 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有一个非常好的例子来说明如何做到这一点混合(实际上有几个)。