有没有一种方法可以使用ImageSharp验证图像的透明度?

时间:2020-07-17 20:13:42

标签: asp.net-core-mvc asp.net-core-3.1 imagesharp

除了客户端验证,我们还需要验证MVC控制器中上传图像的透明度。我们知道我们可以使用System.Drawing库来执行此操作,但是由于性能问题,我们正在远离System.Drawing,并且我们还打算将应用程序部署到不支持GDI的云中。有没有一种方法可以使用Imagesharp验证上传图像的透明度。谢谢。

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题,有些含糊。我不知道您是否要检查透明像素的潜力,或者图像中是否确实存在透明像素。每个场景都需要非常不同的行为。

方案1:测试潜在的透明度

为此,您需要查询元数据。

Image类型及其通用变体包含一个名为Metadata的属性,该属性的类型为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为true时透明。

方案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. 
        }
    }
}

这两种方法都应该足够快,具体取决于您的情况。