在System.Drawing中,我们从Image对象中检索PixelFormat,但SkiaSharp.SkImage不提供API来查找解码图像的PixelFormat。是否有任何其他解决方法来查找解码图像的 PixelFormat 以及我们如何创建具有 PixelFormat 值相当于 System.Drawing.Image 的图像
最佳答案
简短回答
有这个方面,但它分为两种类型:SKColorType
和SKAlphaType
。这些属性可在 SKImageInfo
类型中找到。
SKImage
与 SKBitmap
在分享真正的答案之前,先简要介绍一下两种图像类型之间的差异。
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
}
更长的答案
所以现在更长的答案...... SKColorType
和 SKAlphaType
类型一起形成了 PixelFormat
的等效项。
例如:
PixelFormat.Format16bppRgb565
相当于:
SKColorType.Rgb565
和SKAlphaType.Opaque
PixelFormat.Format32bppArgb
相当于:
SKColorType.Rgba8888
(或SKColorType.Bgra8888
在 Windows 上)和SKAlphaType.Unpremul
PixelFormat.Format32bppPArgb
相当于:
SKColorType.Rgba8888
(或SKColorType.Bgra8888
在 Windows 上)和SKAlphaType.Premul
Rgba8888
和 Bgra8888
之间的主要区别在于应用程序运行的平台。通常,您会根据 SKImageInfo.PlatformColorType
检查颜色类型。因为这将知道 native 颜色类型应该是什么。
关于asp.net-core - 如何使用 SkiaSharp 查找解码位图的 PixelFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47976927/