【问题标题】:Why does WebImage.Resize strip out PNG transparency为什么 WebImage.Resize 会去除 PNG 透明度
【发布时间】:2011-02-15 16:05:09
【问题描述】:

使用 MVC3/WebMatrix 版本中的 WebImage。从文件路径加载以下图像:

- 或 -

对它运行以下代码:

return new WebImage(path)
       .Resize(120, 265)
       .GetBytes("Png");

导致图像的透明度被去除并在适当的位置使用黑色:

RotateRight()、RotateLeft() 和 FlipHorizantal() 也会发生同样的情况但是如果我不调用 .Resize() 方法:

return new WebImage(path)
        .GetBytes("Png");

图片返回没有问题。

【问题讨论】:

  • System.Web.WebImage 我相信是作为 MVC3 和/或 WebMatrix 的一部分提供的。
  • 你能发布一个链接到你的实际图像吗?不幸的是,SO 使用的图像服务会重新压缩内容,因此如果您的特定图像有什么特别之处,我们将看不到它。
  • 暂时没有,因为我现在在家。然而,上面的图像是用 Paint.net 创建的,并保存为 24 位 PNG。
  • 添加了一个我可以重现错误的示例图像。

标签: c# image-processing asp.net-mvc-3


【解决方案1】:

您的图像是 8 位(索引颜色)吗? 调整 8 位图像的大小时,通常会将它们从索引颜色转换为 RGB,以使结果看起来更平滑。在不更改颜色表的情况下调整图像大小很少能顺利结束。

如果图像已经是 RGB(24 位或更多),则稍微复杂一点:调整大小应该如何处理图像边缘,在“透明”和“不透明”之间的边界上?许多调整大小的算法会在边界处执行类似于“平均两种颜色”的操作(同样,使图像看起来更平滑),但大多数算法都没有透明度的概念,更不用说 PNG 具有多级半透明度的能力了。

所以,简短的回答是“这可能是一个错误”——不是 PNG 功能的完整实现。

解决方案可能不存在,但我会尝试:

  1. 如果可以选择保留 8 位颜色,或者提前转换为 32 位。
  2. 获取透明色的颜色或颜色索引。调整大小后,强制该值透明。请注意,由于前面提到的“平滑”,透明和不透明之间的边缘可能不是那种颜色,并且可能看起来像是黑色和您实际想要的任何颜色的混合。
  3. 如果不出意外,您可能需要使用外部库来提供更多控制权。

【讨论】:

  • 我知道它可以与 WPF/System.Windows.Imaging.Media 一起使用,所以我可能不得不在这一款上使用大炮。
【解决方案2】:

您是否尝试使用方法 Write() 而不是 GetBytes()

【讨论】:

  • Write() 不幸在幕后致电GetBytes()
猜你喜欢
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2013-09-13
  • 1970-01-01
  • 2017-10-18
  • 2017-07-27
  • 2014-10-24
相关资源
最近更新 更多