如何判断Codec.Picture加载的DynamicImage的类型

Die*_*lan 5 haskell types codec

我正在尝试使用JuicyPixels库加载PNG,我能够成功完成此操作但我无法弄清楚底层图像的类型.在库中,DynamicImage定义如下.

data DynamicImage =
       ImageY8   (Image Pixel8)
     | ImageYA8  (Image PixelYA8)
     | ImageRGB8 (Image PixelRGB8)
     | ImageRGBA8 (Image PixelRGBA8)
     | ImageYCbCr8 (Image PixelYCbCr8)
Run Code Online (Sandbox Code Playgroud)

通过简单的试验和错误,我能够通过这样做发现它是ImageRGBA8.

img = (\(ImageRBA8 t) -> t) dynImage
Run Code Online (Sandbox Code Playgroud)

然后就是这么做

imageData img
Run Code Online (Sandbox Code Playgroud)

在ghci中打印图像数据,所有其他类型都会出错.那么如何DynamicImage在没有试验错误的情况下找出已加载的类型.我确信这很简单,我只是遗漏了一些东西.

Tho*_*son 4

DynamicImage只是一个 ADT,因此您可以在函数定义或 case 表达式中对其进行模式匹配。使用的确切构造函数取决于您从文件加载的图像类型(因此在本例中为 RGA8,但在其他情况下可能有所不同)。

例如:

case img of
  ImageY8   imgPixel8   -> ... do something ...
  ImageYA8  imgPixelYA8 -> ...
  ImageRGB8 imgPixelRGB8 -> ...
  ImageRGBA8 imgPixelRGBA8 -> ...
  ImageYCbCr8 imgPixelYCbCr8 -> ...
Run Code Online (Sandbox Code Playgroud)