asp.net-core - 如何使用 SkiaSharp 查找解码位图的 PixelFormat

标签 asp.net-core 2d skia skiasharp

在System.Drawing中,我们从Image对象中检索PixelFormat,但SkiaSharp.SkImage不提供API来查找解码图像的PixelFormat。是否有任何其他解决方法来查找解码图像的 PixelFormat 以及我们如何创建具有 PixelFormat 值相当于 System.Drawing.Image 的图像

最佳答案

简短回答

有这个方面,但它分为两种类型:SKColorTypeSKAlphaType。这些属性可在 SKImageInfo 类型中找到。

SKImageSKBitmap

在分享真正的答案之前,先简要介绍一下两种图像类型之间的差异。

SKBitmap (仅限光栅)

SKBitmap纯光栅图形,这意味着颜色和 Alpha 类型信息随时可用。这是在 Info属性(property)。

SKBitmap bitmap = ...;
SKColorType colorType = bitmap.Info.ColorType;
SKAlphaType alphaType = bitmap.Info.AlphaType;

SKImage (光栅或纹理)

SKImage 有点不同,因为它实际上可能不是光栅位图。 SKImage 可以是 GPU 对象,例如 OpenGL 纹理。因此,此颜色类型不适用。因此,在使用光栅位图的情况下,请使用 SKBitmap 而不是 SKImage

但是,SKImage 仍然有希望,因为基于光栅的 SKImage 实际上在底层使用了 SKBitmap。如果您知道 SKImage 是光栅图像,则可以使用 PeekPixels() 方法获取 SKPixmap对象也将具有 Info 属性。 SKPixmap 是一种精简类型,包含对图像数据、信息和一些其他属性的引用。

要检查某个 SKImage 是纹理图像还是光栅图像,可以使用 IsTextureBacked 属性。

SKImage image = ...;
if (!image.IsTextureBacked) {
    using (SKPixmap pixmap = image.PeekPixels()) {
        SKColorType colorType = pixmap.ColorType;
        SKAlphaType alphaType = pixmap.AlphaType;
    }
} else {
    // this is a texture on the GPU and can't be determined easily
}

更长的答案

所以现在更长的答案...... SKColorTypeSKAlphaType 类型一起形成了 PixelFormat 的等效项。

例如:

Rgba8888Bgra8888 之间的主要区别在于应用程序运行的平台。通常,您会根据 SKImageInfo.PlatformColorType 检查颜色类型。因为这将知道 native 颜色类型应该是什么。

关于asp.net-core - 如何使用 SkiaSharp 查找解码位图的 PixelFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47976927/

相关文章:

c - 通过引用传递二维数组

java - 尝试使 Sprite 围绕一个点旋转(LibGDX/Java)

c# - SendMailAsync 从不返回,仍然发送邮件

json - Serilog.Sinks.Postgresql : Read configuration from appsettings. json

asp.net-core - ASP.net Core 2.0 的密码历史记录

在某些 6.0 设备上解码 png 图像时,Android native 崩溃

android - picasso 无法解码某些图像 : skia decode returned false

c# - 在 ASP.NET Core 的 Startup 类中访问服务

3d 到 2d 投影矩阵

android - Android 是否在内部使用 Skia 在位图上绘制文本?