如何为jpg添加透明填充并将其保存为具有透明度的png



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没有帮助,但也许对下一个谷歌用户有用。

相关内容

  • 没有找到相关文章

最新更新