src/fastpnm

Example:

import src/fastpnm
import std/[os, strformat]

# converting an image to `.pbm` format via `convert` tool (I think it's part of `ImageMagick` app)
discard execShellCmd fmt"convert -flatten -background white -alpha remove -resize 32x32 ./examples/arrow.png ./examples/play4.pbm"

# parsing a .pbm file
let pbm4 = parsePnm readFile "./examples/play4.pbm"

# validate
assert pbm4.magic == P4
assert pbm4.width == 32
assert pbm4.height == 32
assert pbm4.getBool(10, 10)
assert not pbm4.getBool(0, 0)

Types

Color = tuple[r, g, b: uint8]
Pnm = object
  magic*: PnmMagic
  width*, height*, maxValue*: Natural
  comment*: string
  data*: seq[byte]
  filled*: Natural
PnmMagic = enum
  bitMapRaw = "P1", grayMapRaw = "P2", pixMapRaw = "P3", bitMapBinray = "P4",
  grayMapBinray = "P5", pixMapBinray = "P6"
Position = tuple[x, y: int]

Consts

bitMap = {bitMapRaw, bitMapBinray}
commonPnmExt = ".pnm"
compressed = {bitMapBinray..pixMapBinray}
grayMap = {grayMapRaw, grayMapBinray}
P1 = bitMapRaw
P2 = grayMapRaw
P3 = pixMapRaw
P4 = bitMapBinray
P5 = grayMapBinray
P6 = pixMapBinray
pixMap = {pixMapRaw, pixMapBinray}
uncompressed = {bitMapRaw..pixMapRaw}

Procs

func `$`(pnm: Pnm; dropWhiteSpaces = false; addComments = true): string {.
    ...raises: [], tags: [].}
convert the .pnm, .pbm, .pgm, .ppm file to its string representation
func add(pnm: var Pnm; b: bool) {....raises: [], tags: [].}
func add(pnm: var Pnm; c: Color) {....raises: [], tags: [].}
func add(pnm: var Pnm; i: SomeInteger)
func fileExt(magic: PnmMagic): string {....raises: [], tags: [].}
returns file extension according to the magic
func from2d[T: bool or SomeInteger or Color](mat: seq[seq[T]]; compress = true): Pnm
func get2d[T: bool or SomeInteger or Color](pnm: Pnm): seq[seq[T]]
generates 2D representaion of stored data
func getBool(pnm: Pnm; x, y: int): bool {....raises: [], tags: [].}
only applicable when pnm.magic is P1 or P4
func getColor(pnm: Pnm; x, y: int): Color {....raises: [], tags: [].}
only applicable when pnm.magic is P3 or P6
func getGrayScale(pnm: Pnm; x, y: int): uint8 {....raises: [], tags: [].}
only applicable when pnm.magic is P2 or P5
func parsePnm(s: string; captureComments = false): Pnm {....raises: [ValueError],
    tags: [].}
parses your .pnm, .pbm, .pgm, .ppm files
func setBool(pnm: var Pnm; x, y: int; b: bool) {....raises: [], tags: [].}
only applicable when pnm.magic is P1 or P4
func setColor(pnm: var Pnm; x, y: int; color: Color) {....raises: [], tags: [].}
only applicable when pnm.magic is P3 or P6
func setGrayScale(pnm: var Pnm; x, y: int; g: uint8): uint8 {....raises: [],
    tags: [].}
only applicable when pnm.magic is P2 or P5
func toCompressed(m: PnmMagic): PnmMagic {....raises: [], tags: [].}
func toUnCompressed(m: PnmMagic): PnmMagic {....raises: [], tags: [].}