我们有一个要求,除了客户端验证之外,我们还需要在 MVC 控制器中验证上传图像的透明度。我们知道我们可以使用 System.Drawing 库来做到这一点,但是由于性能问题,我们正在远离 System.Drawing,我们还打算将我们的应用程序部署到不支持 GDI 的云中。有没有一种方法可以使用 Imagesharp 验证上传图像的透明度。谢谢。
1 回答
1
这是一个有趣的问题,但有些含糊不清。我不知道您是否要检查透明像素的潜力,或者图像中是否真的有透明像素。每种情况都需要非常不同的行为。
场景 1:测试潜在透明度
为此,您需要查询元数据。
该Image
类型及其泛型变体包含一个名为Metadata
which 的属性 type ImageMetadata
。您可以查询此类型以获取格式特定的元数据。
例如。如果你想查询 png 元数据,你会使用
// Get the metadata. Using Identity allows this without fully
// decoding the image pixel data.
using var info = Image.Identify(...);
PngMetadata meta = info.Metadata.GetPngMetadata();
// Query the color type to get color information.
PngColorType = meta.ColorType;
实际上可以为每个PngColorType
条目支持一个 alpha 组件。
GrayscaleWithAlpha
Grayscale
*RgbWithAlpha
Rgba
*Palette
*
(*) 仅当PngMetadata.HasTransparency
为真时才透明。
场景 2:测试实际透明度
为此,您需要将图像完全解码为支持透明度的像素格式。
using var image = Image<Rgba32>.Load(...);
for (int y = 0; y < image.Height; y++)
{
// It's faster to get the row and avoid a per-pixel multiplication using
// the image[x, y] indexer
Span<Rgba32> row = image.GetPixelRowSpan(y);
for (int x = 0; x < row.Length; x++)
{
Rgba32 pixel = row[x];
if (pixel.A < byte.MaxValue)
{
// return true.
}
}
}
根据您的情况,这两种方法都应该足够快。
于 2020-07-17T21:54:03.733 回答