gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:55:41 33 4
gpt4 key购买 nike

使用 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com