c# - 为什么 WebImage.Resize 去除 PNG 透明度

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

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

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

图像返回时没有问题。

最佳答案

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

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

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

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

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

关于c# - 为什么 WebImage.Resize 去除 PNG 透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5006094/

相关文章:

c# - EPPlus 图表 : how to plot vertical bar graph instead of the horizontal default

python - 如何从 OpenCV 中的图像中删除空白?

ubuntu - 在 Ubuntu 中调整大于 X 的图像

c# - MVC 3 自定义路由处理程序 - 跳到下一个自定义路由规则?

jquery - 使用T4MVC,如何在HTML表单上设置action属性

c# - 在没有 CodeFirst 的情况下访问 C#/.NET 中的数据库

c# - 更改鼠标按钮功能

c# - DataTable.Select() Distinct 然后添加值

c# - 在多处理环境中读取文件的最快方法? C#

javascript - 如何检测图像是否具有透明背景和白色文本