在 System.Drawing 中,我们从 Image 对象中检索 PixelFormat,但 SkiaSharp.SkImage 不提供 API 来查找解码图像的 PixelFormat。是否有任何其他解决方法来查找解码图像的 PixelFormat,以及我们如何创建具有 PixelFormat 值的图像作为等效于 System.Drawing.Image
1 回答
简短的回答
有这个方面,但它分为两种类型:SKColorType
和SKAlphaType
。这些属性可以在SKImageInfo
类型上找到。
SKImage
对比SKBitmap
在我分享真正的答案之前,简要介绍两种图像类型之间的差异。
SKBitmap
(仅限光栅)
ASKBitmap
是仅光栅图形,这意味着颜色和 alpha 类型信息很容易获得。这是在Info
财产。
SKBitmap bitmap = ...;
SKColorType colorType = bitmap.Info.ColorType;
SKAlphaType alphaType = bitmap.Info.AlphaType;
SKImage
(光栅或纹理)
SKImage
有点不同,因为它实际上可能不是光栅位图。AnSKImage
可以是 GPU 对象,例如 OpenGL 纹理。因此,此颜色类型不适用。因此,在您使用光栅位图的情况下,请使用SKBitmap
而不是SKImage
.
但是,仍然有希望SKImage
,因为基于光栅的SKImage
实际上SKBitmap
在引擎盖下使用了 a。如果您知道您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
因为这将知道本机颜色类型应该是什么。