【问题标题】:C# compact framework : load a png alpha blending fileC# 紧凑框架:加载 png alpha 混合文件
【发布时间】:2010-12-24 07:40:23
【问题描述】:

我有一个带有自己的 alpha 混合的 png 图像文件。现在我想将它加载到手机中的表单上。我尝试了很多方法,但没有奏效。有什么解决办法吗?提前致谢。 这是我用来从资源加载图像的:

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);

它有效,但只需清除图像的四个角(某种圆角矩形)。剩下的图像周围仍有一些白色边框。

【问题讨论】:

  • 也许你可以发布一些代码......
  • 由于我不熟悉 CF 及其图形限制,因此我将其添加为评论:带有 alpha 的 png 中不需要的“边缘”的通常来源是创建 png启用抗锯齿功能。 CodeProject 上有一篇文章深入探讨了这一点(在 WinForms 中使用 LayeredWindow [WS_EX_LAYERED] 的上下文中):codeproject.com/KB/miscctrl/AlphaForm.aspx

标签: c# compact-framework


【解决方案1】:

在 Compact Framework 上使用 Bitmap 加载图像会丢失 alpha 信息。设置颜色键是另一种实现透明度的方法,您可以牺牲一种精确的单一颜色作为透明颜色。

要在 Compact Framework 上使用 alpha 混合,您可以使用 OpenNETCF 中的帮助程序类来加载 PNG 文件,保留 alpha 信息(请参阅Transparency and alpha blending),然后 P/Invoke AlphaBlend。这并不漂亮,但这就是它所需要的。另请注意,使用 Alpha 混合会严重影响性能。动态烘焙一些图像,这很好,但对于屏幕上的通用绘图操作,您可能需要使用另一种方法。

【讨论】:

  • 我不想让我的所有 png 图像都透明。我只需要清除我的 png 图像中的所有透明度并将左侧图像绘制到表单上。那么我是否必须按照您所说的执行 P/Invoke AlphaBlend 步骤?
  • 正如有人指出的那样(然后删除了他们的评论?),该问题可能来自抗锯齿图像,其中图像的某些部分不是完全透明的,也不是完全不透明的。您使用的方法仅处理存在用于表示图像透明部分的单一精确颜色的情况。如果这就是您所需要的,您可以先使用您最喜欢的图像处理程序修复图像。
  • 这里的问题是我不允许编辑图像,我也无法导入 OpenNetCF。还有什么办法吗?谢谢
  • 执行任何 OpenNetCF 加载图像的操作(源可用)并在加载图像时将其展平一次(或使用 AlphaBlend)。如果您知道要绘制图像的背景,最有效的方法可能是将 AlphaBlend 一次放入一个新的位图,然后在没有任何透明度的情况下进行绘制。
【解决方案2】:

问题在于,在 CF 中,用 Color.Transparent 填充实际上是用白色填充(参见these twoblog entries)。 Project Resistance 有一个很好的例子来说明如何进行这种混合(实际上是其中的几个)。

【讨论】:

  • 很好的例子,不仅用于图像处理,自定义属性的使用。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多