SixLabors-ImageSharp的文档非常有限,大多数谷歌搜索都指向GitHub,这不是很有帮助。
如何上传带有透明填充的jpg、.Mutate
并将其保存为带有透明的png?
这是我目前掌握的代码。如果上传的图像是png,则透明填充有效,但jpgs会得到黑色填充:
private static void ResizeAndSavePhoto(Image<Rgba32> img, string path, int squareSize)
{
Configuration.Default.ImageFormatsManager.SetEncoder(PngFormat.Instance, new PngEncoder()
{
ColorType = PngColorType.RgbWithAlpha
});
img.Mutate(x =>
x.Resize(new ResizeOptions
{
Size = new Size(squareSize, squareSize),
Mode = ResizeMode.Pad
}).BackgroundColor(new Rgba32(255, 255, 255, 0))
);
img.Save(path);
return;
}
.SaveAsPng()
需要一个文件流,但我有一个Image<Rgba32>
和一个路径。。。
您可以通过SaveAsPng
显式保存为png,将路径扩展设置为.png
,或将IImageEncoder
传递给Save
方法。
API文档位于https://docs.sixlabors.com/api/index.html
private static void ResizeAndSavePhoto(Image<Rgba32> img, string path, int squareSize)
{
img.Mutate(x =>
x.Resize(new ResizeOptions
{
Size = new Size(squareSize, squareSize),
Mode = ResizeMode.Pad
}).BackgroundColor(new Rgba32(255, 255, 255, 0)));
// The following demonstrates how to force png encoding with a path.
img.Save(Path.ChangeExtension(path, ".jpg"))
img.Save(path, new PngEncoder());
}
此外,如果保存到流。
img.SaveAsPng(path);
我有与OP类似的症状。图像被保存为24bpp-png(没有alpha通道(,并且图像中在调整大小后应该是透明的部分是黑色的。
在我的例子中,CloneAs<Rgba32>()
似乎做到了,将原始图像的克隆从24位转换为32位。
using (SixLabors.ImageSharp.Image originalImage = await SixLabors.ImageSharp.Image.LoadAsync(imageStream))
{
SixLabors.ImageSharp.Formats.Png.PngEncoder pngEncoder = new SixLabors.ImageSharp.Formats.Png.PngEncoder() { ColorType = SixLabors.ImageSharp.Formats.Png.PngColorType.RgbWithAlpha };
using (SixLabors.ImageSharp.Image image = originalImage.CloneAs<SixLabors.ImageSharp.PixelFormats.Rgba32>())
{
image.Mutate(x => x.Resize(new ResizeOptions() { Size = new Size(100, 100), PadColor = Color.Transparent, Mode = ResizeMode.Pad }));
using (Stream stream = ....)
{
await image.SaveAsPngAsync(stream, pngEncoder);
}
}
}
或者,您可以使用LoadAsnc<Rgba32>()
来代替CloneAs<Rgba32>()
,以对您的场景更有意义的为准。只需确保您的调整大小操作是在32位图像上进行的,而不是在24位图像上。
SixLabors.ImageSharp.Image.LoadAsync<SixLabors.ImageSharp.PixelFormats.Rgba32>(imageStream)
这可能对OP没有帮助,但也许对下一个谷歌用户有用。