如何使用Skiasharp找到用于解码的位图的PixelFormat



在系统中。绘制我们从图像对象中检索了pixelformat,但是skiasharp.skimage不提供API来查找解码图像的PixelFormat。是否还有其他解决方法可以找到解码图像的PixelFormat,以及如何使用PixelFormat值创建图像作为System.Frawing.image.image

简短答案

有这方面,但分为两种类型:SKColorTypeSKAlphaType。这些属性在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
}

更长的答案

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

例如:

  • PixelFormat.Format16bppRgb565等于:
    SKColorType.Rgb565SKAlphaType.Opaque
  • PixelFormat.Format32bppArgb等于:
    SKColorType.Rgba8888(或Windows上的SKColorType.Bgra8888)和SKAlphaType.Unpremul
  • PixelFormat.Format32bppPArgb等于:
    SKColorType.Rgba8888(或Windows上的SKColorType.Bgra8888)和SKAlphaType.Premul

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

相关内容

  • 没有找到相关文章

最新更新