除了客户端验证,我们还需要验证MVC控制器中上传图像的透明度。我们知道我们可以使用System.Drawing库来执行此操作,但是由于性能问题,我们正在远离System.Drawing,并且我们还打算将应用程序部署到不支持GDI的云中。有没有一种方法可以使用Imagesharp验证上传图像的透明度。谢谢。
答案 0 :(得分: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时透明。
为此,您需要将图像完全解码为支持透明度的像素格式。
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.
}
}
}
这两种方法都应该足够快,具体取决于您的情况。