使用 WebImage来自 MVC3/WebMatrix 版本。从文件路径加载以下图像:
- 或 -
对其运行以下代码:
return new WebImage(path)
.Resize(120, 265)
.GetBytes("Png");
生成的图像去除了透明度并在适当位置使用了黑色:
RotateRight()、RotateLeft() 和 FlipHorizantal() 也会发生同样的情况,但是如果我不调用 .Resize() 方法:
return new WebImage(path)
.GetBytes("Png");
图像返回时没有问题。
最佳答案
您的图像是 8 位(索引颜色)吗? 调整 8 位图像大小时,通常会将它们从索引颜色转换为 RGB,以使结果看起来更平滑。在不更改颜色表的情况下调整图像大小很少有好的结果。
如果图像已经是 RGB(24 位或更多位),那就有点复杂了:resizer 应该对图像的边缘做什么,在“透明”和“不透明”之间的边界上?许多调整大小算法会在边界处执行类似于“平均两种颜色”的操作(同样,使图像看起来更平滑),但大多数算法都没有透明度的概念,更不用说 PNG 具有多级半透明度的能力了。
因此,简短的回答是“这可能是一个错误”——不是 PNG 功能的完整实现。
解决方案可能不存在,但我会尝试:
- 如果可以的话,保持 8 位颜色,或者提前转换为 32 位颜色。
- 获取透明色的颜色或颜色索引。调整大小后,强制该值透明。请注意,由于前面提到的“平滑”,透明和不透明之间的边缘可能不是那种颜色,并且可能看起来像是黑色和您真正想要的任何颜色的混合。
- 如果不出意外,您可能需要使用一个外部库来让您有更多的控制权。
关于c# - 为什么 WebImage.Resize 去除 PNG 透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5006094/