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

时间:2011-02-15 16:05:10

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

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

Sample Image - 或 - enter image description here

针对它运行以下代码:

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

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

Blacked out transparency

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

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

图像的返回没有问题。

2 个答案:

答案 0 :(得分:2)

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

如果图像已经是RGB(24位或更多),那就更复杂了:在“透明”和“不透明”之间的边界上,缩放器应该对图像的边缘做什么?许多调整大小算法会在边界处执行类似“平均两种颜色”的操作(同样,为了使图像看起来更平滑),但大多数都没有透明度的概念,更不用说PNG具有多层次半透明的能力。

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

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

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

答案 1 :(得分:0)

您是否尝试使用方法Write()代替GetBytes()