为什么WebImage.Resize剥离出PNG透明度

Ric*_*ter 6 c# image-processing asp.net-mvc-3

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

示例图像 - 要么 - 在此输入图像描述

针对它运行以下代码:

return new WebImage(path)
       .Resize(120, 265)
       .GetBytes("Png");
Run Code Online (Sandbox Code Playgroud)

在透明度被剥离并且使用黑色的图像中的结果:

涂黑透明度

RotateRight(),RotateLeft()和FlipHorizantal()也是如此.但是,如果我不调用.Resize()方法:

return new WebImage(path)
        .GetBytes("Png");
Run Code Online (Sandbox Code Playgroud)

图像返回没有问题.

Cha*_*rns 2

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

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

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

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

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