在系统中。绘制我们从图像对象中检索了pixelformat,但是skiasharp.skimage不提供API来查找解码图像的PixelFormat。是否还有其他解决方法可以找到解码图像的PixelFormat,以及如何使用PixelFormat值创建图像作为System.Frawing.image.image
简短答案
有这方面,但分为两种类型:SKColorType
和SKAlphaType
。这些属性在SKImageInfo
类型上找到。
SKImage
vs SKBitmap
在我共享真实答案之前,这是两种图像类型之间差异的简短介绍。
SKBitmap
(仅栅格)
a SKBitmap
是仅栅格的图形,这意味着颜色和alpha类型信息很容易获得。这在Info
属性中。
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
(或Windows上的SKColorType.Bgra8888
)和SKAlphaType.Unpremul
-
PixelFormat.Format32bppPArgb
等于:
SKColorType.Rgba8888
(或Windows上的SKColorType.Bgra8888
)和SKAlphaType.Premul
Rgba8888
和Bgra8888
之间的主要区别是应用程序正在运行的平台。通常,您将检查针对SKImageInfo.PlatformColorType
的颜色类型,因为这将知道本机颜色类型应该是什么。