2021-02-14 18:27:32 +00:00
|
|
|
import flatty/binny, os, pixie/blends, pixie/common, pixie/fileformats/bmp,
|
|
|
|
pixie/fileformats/jpg, pixie/fileformats/png, pixie/fileformats/svg,
|
2021-02-16 07:31:10 +00:00
|
|
|
pixie/images, pixie/masks, pixie/paths, pixie/gradients
|
2020-11-21 04:34:57 +00:00
|
|
|
|
2021-02-16 07:31:10 +00:00
|
|
|
export blends, common, images, masks, paths, gradients
|
2020-11-20 03:44:24 +00:00
|
|
|
|
2020-11-21 04:34:57 +00:00
|
|
|
type
|
|
|
|
FileFormat* = enum
|
2020-11-21 23:45:02 +00:00
|
|
|
ffPng, ffBmp, ffJpg
|
2020-11-21 04:34:57 +00:00
|
|
|
|
2020-11-21 05:09:52 +00:00
|
|
|
proc decodeImage*(data: string | seq[uint8]): Image =
|
2020-11-21 04:34:57 +00:00
|
|
|
## Loads an image from a memory.
|
2020-11-21 23:45:02 +00:00
|
|
|
if data.len > 8 and data.readUint64(0) == cast[uint64](pngSignature):
|
|
|
|
decodePng(data)
|
|
|
|
elif data.len > 2 and data.readUint16(0) == cast[uint16](jpgStartOfImage):
|
|
|
|
decodeJpg(data)
|
2020-12-04 16:17:03 +00:00
|
|
|
elif data.len > 2 and data.readStr(0, 2) == bmpSignature:
|
2020-11-21 23:45:02 +00:00
|
|
|
decodeBmp(data)
|
2020-12-04 16:17:03 +00:00
|
|
|
elif data.len > 5 and data.readStr(0, 5) == svgSignature:
|
|
|
|
decodeSvg(data)
|
2020-11-21 23:45:02 +00:00
|
|
|
else:
|
|
|
|
raise newException(PixieError, "Unsupported image file format")
|
2020-11-21 04:34:57 +00:00
|
|
|
|
|
|
|
proc readImage*(filePath: string): Image =
|
|
|
|
## Loads an image from a file.
|
|
|
|
decodeImage(readFile(filePath))
|
|
|
|
|
2020-11-21 05:09:52 +00:00
|
|
|
proc encodeImage*(image: Image, fileFormat: FileFormat): string =
|
2020-11-21 23:45:02 +00:00
|
|
|
## Encodes an image into memory.
|
2020-11-21 04:34:57 +00:00
|
|
|
case fileFormat:
|
|
|
|
of ffPng:
|
|
|
|
image.encodePng()
|
2020-11-21 23:45:02 +00:00
|
|
|
of ffJpg:
|
|
|
|
image.encodeJpg()
|
2020-11-21 04:34:57 +00:00
|
|
|
of ffBmp:
|
|
|
|
image.encodeBmp()
|
|
|
|
|
|
|
|
proc writeFile*(image: Image, filePath: string, fileFormat: FileFormat) =
|
|
|
|
## Writes an image to a file.
|
|
|
|
writeFile(filePath, image.encodeImage(fileFormat))
|
2020-11-21 18:34:57 +00:00
|
|
|
|
|
|
|
proc writeFile*(image: Image, filePath: string) =
|
|
|
|
## Writes an image to a file.
|
|
|
|
let fileFormat = case splitFile(filePath).ext:
|
2020-11-22 02:02:57 +00:00
|
|
|
of ".png": ffPng
|
|
|
|
of ".bmp": ffBmp
|
2021-01-27 08:46:00 +00:00
|
|
|
of ".jpg", ".jpeg": ffJpg
|
2020-11-21 23:45:02 +00:00
|
|
|
else:
|
2020-11-22 02:05:48 +00:00
|
|
|
raise newException(PixieError, "Unsupported image file extension")
|
2020-11-21 23:45:02 +00:00
|
|
|
image.writeFile(filePath, fileformat)
|