Skip to main content

A simpler wrapper around qoi (https://github.com/phoboslab/qoi)

Project description

QOI

A simple Python wrapper around qoi, the "Quite OK Image" format.

Install

pip install qoi

Example

import numpy as np
import qoi

# Get your image as a numpy array (OpenCV, Pillow, etc. but here we just create a bunch of noise)
rgb = np.random.randint(low=0, high=255, size=(224, 244, 3)).astype(np.uint8)

# Write it:
_ = qoi.write("/tmp/img.qoi", rgb)

# Read it and check it matches (it should, as we're lossless)
rgb_read = qoi.read("/tmp/img.qoi")
assert np.array_equal(rgb, rgb_read)

# Likewise for encode/decode to/from bytes:
bites = qoi.encode(rgb)
rgb_decoded = qoi.decode(bites)
assert np.array_equal(rgb, rgb_decoded)

Developing

Clone

git clone --recursive https://github.com/kodonnell/qoi/

Dev

USE_CYTHON=1 pip install -e .[dev]
# Make your changes, and ensure you re-run the above if it's to the cython files ...

Test

pytest .

Build and publish

We're using setuptools_scm for versioning which basically means, once you're happy with your code and it's passing tests, first:

rm -rf ./build
USE_CYTHON=1 python -m build

This checks that the code compiles from the sdist that gets created. This is important if you're messing round with build options etc.

Then

git commit -a -m "..., ready for release!"
git tag "vX.X.X"
rm -rf ./build
rm -rf ./dist
USE_CYTHON=1 python -m build --sdist
python -m twine upload --repository testpypi dist/*
python -m twine upload --repository pypi dist/*

NB: in future we'll have this automated as part of a Github Action etc.

TODO:

  • Add build/publish pipeline (inc. running tests) and wheels via cibuildwheel.
  • Create a qoi CLI
  • Add some benchmarks and compare with qoi
  • Why does write fail without a .qoi extension? If that's valid, raise a proper exception in Python so users know what's goin on.
  • Return the colorspace in read/decode.

Discussion

Wrap or rewrite?

For now, this is just a simple wrapper. We'll leave the original project to do all the hard work on performance etc., and also maintaining (or not) compatibility or adding new features etc. We make no claims to do any more than that - we're basically just porting that C functionality to (C)Python.

On the name

For now, let's rock with qoi because

  • We're already in python, and the py in pyqoi seems redundant. For what it's worth, 3 < 5.
  • pyqoi seems like a good name for a python-only version of QOI (useful for pypy etc.), which this isn't.
  • qoi is generally new so let's not overthink it for now. We can always rename later if needed.

What's up with ./src?!

See here and here. I didn't read all of it, but yeh, import qoi is annoying when there's also a folder called qoi.

USE_CTYHON=1?

See here. Fair point.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qoi-0.0.5.tar.gz (156.4 kB view details)

Uploaded Source

File details

Details for the file qoi-0.0.5.tar.gz.

File metadata

  • Download URL: qoi-0.0.5.tar.gz
  • Upload date:
  • Size: 156.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for qoi-0.0.5.tar.gz
Algorithm Hash digest
SHA256 70f2ce63d653182851ef7bba954de3213978e109331e8219b063a13381327f73
MD5 db9addd02190b7fadf1114feca539766
BLAKE2b-256 6ab4c5de4c2a72aa9c9df9e43010c19469ce81c8ca3fd14e15d2d47516c247d1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page