treeform / pixie-python

Full-featured 2D graphics library for Python.
MIT License
95 stars 2 forks source link

Request: image.to_bytes() function #25

Open IagoBeuller opened 1 year ago

IagoBeuller commented 1 year ago

I need the bytes of the images, for example, use them in pillow or pygame. Also "imageFromBytes(data: string): Image".

I've made this little library for making this feature for me, it gets the image data bytes as well the png file bytes.

import
    nimpy,
    pixie

pyExportModule("pixie_utils")

proc getImageBytes*(image: Image, format: string = "png"): string {.raises: [PixieError].} =
  # Gets the bytes from image.
  let encodeFormat = case format:
    of "png": PngFormat
    of "bmp": BmpFormat
    of "jpg", "jpeg": JpegFormat
    of "qoi": QoiFormat
    of "ppm": PpmFormat
    else:
      raise newException(PixieError, "Unsupported image format")

  result = image.encodeImage(encodeFormat)

proc getImageData*(image: Image): string {.raises: [].} =
  # Gets the image data as bytes.
  result = newString(image.width * image.height * 4)
  var
    i = 0
    rgba: ColorRGBA

  for color in image.data:
    rgba = color.rgba()
    result[i] = rgba.r.char
    result[i+1] = rgba.g.char
    result[i+2] = rgba.b.char
    result[i+3] = rgba.a.char
    i += 4

proc getImageBytes(image_ref: int, format: string = "png"): string {.exportpy: "getImageBytes".} =
    result = getImageBytes(cast[Image](image_ref), format)

proc getImageData(image_ref: int): string {.exportpy: "getImageData".} =
    result = getImageData(cast[Image](image_ref))