0

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

4

1 回答 1

1

这是一个有趣的问题,但有些含糊不清。我不知道您是否要检查透明像素的潜力,或者图像中是否真的有透明像素。每种情况都需要非常不同的行为。

场景 1:测试潜在透明度

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

Image类型及其泛型变体包含一个名为Metadatawhich 的属性 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 回答