Rust Imaging Library's Python binding: A performant and high-level image processing library for Python written in Rust

Overview

ril-py

Rust Imaging Library for Python: Python bindings for ril, a performant and high-level image processing library written in Rust.

What's this?

This is a python binding around ril designed to provide an easy-to-use, high-level interface around image processing in Rust. Image and animation processing has never been this easy and fast before.

Support

This package is a work in progress and it heavily depends on the progress of ril

By the first stable release, we plan to support the following image encodings:

Encoding Format Current Status
PNG / APNG Supported
JPEG Supported
GIF Supported
WebP Not yet supported
BMP Not yet supported
TIFF Not yet supported

Installation

**This package is published on pypi under the name pyril due to a pypi limitation.

It will be published under ril in the future, if possible.

Prebuilt wheels

There will be prebuilt wheels for these platforms:

  • Linux x86-64: Cpython 3.7, 3.8, 3.9, 3.10, PyPy 3.7, 3.8, 3.9
  • MacOS x86-64: Cpython 3.7, 3.8, 3.9, 3.10, PyPy 3.7, 3.8, 3.9
  • Windows x86-64: Cpython 3.7, 3.8, 3.9, 3.10, PyPy 3.7, 3.8, 3.9
  • Linux i686: Cpython 3.7, 3.8, 3.9, 3.10, PyPy 3.7, 3.8, 3.9
  • MacOS aarch64: Cpython 3.8, 3.9, 3.10

If you want another platform to have prebuilt wheels, please open an issue.

CPython 3.11 support will be available once its ABI has been stabilized.

If your platform has prebuilt wheels, installing is as simple as

pip install pyril

Building from Source

In order to build from source, you will need to have the Rust compiler available in your PATH. See documentation on https://rust-lang.org to learn how to install Rust on your platform.

Then building is as simple as

pip install pyril

or from Github

pip install git+https://github.com/Cryptex-github/ril-py

Pip will handle the building process.

Examples

Open an image, invert it, and then save it:

from ril import Image

image = Image.open("example.png")
image.invert()

image.save("example.png")

Create a new black image, open the sample image, and paste it on top of the black image:

from ril import Image, Pixel

image = Image.new(600, 600, Pixel.from_rgb(0, 0, 0))
image.paste(100, 100, Image.open("sample.png"))

image.save("sample_on_black.png", "PNG") # You can also specify format if you like
You might also like...
A command-line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the returned URL.
A command-line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the returned URL.

Pup A command line tool aiming to upload the local image used in your markdown file to the GitHub repo and replace the local file path with the return

By mirroring traffic to and from your machine, mirrord surrounds your local service with a mirror image of its cloud environment.
By mirroring traffic to and from your machine, mirrord surrounds your local service with a mirror image of its cloud environment.

mirrord lets you easily mirror traffic from your Kubernetes cluster to your development environment. It comes as both Visual Studio Code extension and

Failed experiment in downloading random cat image, turning it into ascii and displaying it in Neovim.

cat.nvim Failed experiment in downloading random cat image, turning it into ascii and displaying it in Neovim. Failed as I realized far too late, that

garbage-collecting on-disk object store, supporting higher level KV stores and databases.

marble Garbage-collecting disk-based object-store. See examples/kv.rs for a minimal key-value store built on top of this. Supports 4 methods: read: de

Unopinionated low level API bindings focused on soundness, safety, and stronger types over raw FFI.

🔥 firehazard 🔥 Create a fire hazard by locking down your (Microsoft) Windows so nobody can escape (your security sandbox.) Unopinionated low level A

A modern high-performance open source file analysis library for automating localization tasks

🧛 Filecount Filecount is a modern high-performance open source file analysis library for automating localization tasks. It enables you to add file an

TUI image viewer
TUI image viewer

Picterm TUI image viewer install $ cargo install picterm or $ git clone https://github.com/ksk001100/picterm $ cd picterm $ cargo install --path . usa

A CLI tool to find the dominant colours in an image 🎨
A CLI tool to find the dominant colours in an image 🎨

dominant_colours This is a command-line tool for finding the dominant colours of an image. It prints their hex codes to the terminal, along with a pre

A lightweight ShareX-compatible image uploader server

Imitari Imitari is a project to provide an easy and lightweight server for images. It is compatible with software like ShareX. The projects goals are

Comments
  • Update pyo3 requirement from 0.16 to 0.17

    Update pyo3 requirement from 0.16 to 0.17

    Updates the requirements on pyo3 to permit the latest version.

    Release notes

    Sourced from pyo3's releases.

    PyO3 0.17.1

    This release contains some minor bug fixes for PyO3 0.17.0. In particular the new PyDictItems, PyDictKeys and PyDictValues types are actually accessible!

    Thanks to @​davidhewitt, @​messense and @​PrettyWood for the fixes.

    Changelog

    Sourced from pyo3's changelog.

    [0.17.1] - 2022-08-28

    Fixed

    • Fix visibility of PyDictItems, PyDictKeys, and PyDictValues types added in PyO3 0.17.0.
    • Fix compile failure when using #[pyo3(from_py_with = "...")] attribute on an argument of type Option<T>. #2592
    • Fix clippy redundant-closure lint on **kwargs arguments for #[pyfunction] and #[pymethods]. #2595

    [0.17.0] - 2022-08-23

    Packaging

    • Update inventory dependency to 0.3 (the multiple-pymethods feature now requires Rust 1.62 for correctness). #2492

    Added

    • Add timezone_utc. #1588
    • Implement ToPyObject for [T; N]. #2313
    • Add PyDictKeys, PyDictValues and PyDictItems Rust types. #2358
    • Add append_to_inittab. #2377
    • Add FFI definition PyFrame_GetCode. #2406
    • Add PyCode and PyFrame high level objects. #2408
    • Add FFI definitions Py_fstring_input, sendfunc, and _PyErr_StackItem. #2423
    • Add PyDateTime::new_with_fold, PyTime::new_with_fold, PyTime::get_fold, and PyDateTime::get_fold for PyPy. #2428
    • Accept #[pyo3(name)] on enum variants. #2457
    • Add CompareOp::matches to implement __richcmp__ as the result of a Rust std::cmp::Ordering comparison. #2460
    • Add PySuper type. #2486
    • Support PyPy on Windows with the generate-import-lib feature. #2506
    • Add FFI definitions Py_EnterRecursiveCall and Py_LeaveRecursiveCall. #2511
    • Add PyDict::get_item_with_error. #2536
    • Add #[pyclass(sequence)] option. #2567

    Changed

    • Change datetime constructors taking a tzinfo to take Option<&PyTzInfo> instead of Option<&PyObject>: PyDateTime::new, PyDateTime::new_with_fold, PyTime::new, and PyTime::new_with_fold. #1588
    • Move PyTypeObject::type_object method to the PyTypeInfo trait, and deprecate the PyTypeObject trait. #2287
    • Methods of Py and PyAny now accept impl IntoPy<Py<PyString>> rather than just &str to allow use of the intern! macro. #2312
    • Change the deprecated pyproto feature to be opt-in instead of opt-out. #2322
    • Emit better error messages when #[pyfunction] return types do not implement IntoPy. #2326
    • Require T: IntoPy for impl<T, const N: usize> IntoPy<PyObject> for [T; N] instead of T: ToPyObject. #2326
    • Deprecate the ToBorrowedObject trait. #2333
    • Iterators over PySet and PyDict will now panic if the underlying collection is mutated during the iteration. #2380
    • Iterators over PySet and PyDict will now panic if the underlying collection is mutated during the iteration. #2380
    • Allow #[classattr] methods to be fallible. #2385
    • Prevent multiple #[pymethods] with the same name for a single #[pyclass]. #2399
    • Fixup lib_name when using PYO3_CONFIG_FILE. #2404
    • Add a message to the ValueError raised by the #[derive(FromPyObject)] implementation for a tuple struct. #2414
    • Allow #[classattr] methods to take Python argument. #2456
    • Rework PyCapsule type to resolve soundness issues: #2485
      • PyCapsule::new and PyCapsule::new_with_destructor now take name: Option<CString> instead of &CStr.

    ... (truncated)

    Commits
    • caaf7bb release: 0.17.1
    • 511303a Merge pull request #2599 from davidhewitt/no-main-gh-pages
    • 3e15bb9 gh-pages: stop building guide for main
    • 9e9e913 Merge pull request #2595 from davidhewitt/kwargs-clippy
    • 058af11 pyfunction: fix clippy lint on **kwargs argument
    • 73c8532 Merge pull request #2592 from davidhewitt/issue-2280
    • 9d543b3 pyfunction: fix from_py_with on Option<T> argument
    • f927cdb Merge pull request #2558 from mejrs/cargo
    • 611ecc1 fix: export new dict views types (#2590)
    • c28e919 Merge pull request #2589 from davidhewitt/netlify-redirects
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Build aarch64-apple-darwin wheels natively

    Build aarch64-apple-darwin wheels natively

    Build aarch64-apple-darwin wheels natively to reduce CI time because cross-compiling is generally slower.

    This is currently being blocked by

    • [ ] https://github.com/actions/runner-images/issues/2187
    • [ ] https://github.com/github/roadmap/issues/528
    opened by Cryptex-github 1
Releases(v0.4.0)
qsv - Performant CLI tool to query CSVs through SQL

qsv Performant CLI tool to query CSVs through SQL Installation After cloning the repository, you can install a binary locally using cargo install --pa

Dermot Haughey 3 Oct 28, 2021
A GSL (the GNU Scientific Library) binding for Rust

rust-GSL A Rust binding for the GSL library (the GNU Scientific Library). The minimum support Rust version is 1.54. Installation This binding requires

Guillaume Gomez 156 Oct 27, 2022
Simple, extensible multithreaded background job processing library for Rust.

Apalis Apalis is a simple, extensible multithreaded background job processing library for Rust. Features Simple and predictable job handling model. Jo

null 46 Nov 28, 2022
Concurrent and multi-stage data ingestion and data processing with Rust+Tokio

TokioSky Build concurrent and multi-stage data ingestion and data processing pipelines with Rust+Tokio. TokioSky allows developers to consume data eff

DanyalMh 27 Nov 20, 2022
Allows processing of iterators of Result types

try-continue try-continue provides one method, try_continue, which allows you to work with iterators of type Result<T, _>, as if they were simply iter

Nick Krichevsky 3 Dec 26, 2021
A little program written in Rust that prints random PNG images to the terminal in text grabbed from an image repo.

Cermic A little program written in Rust that prints random PNG images to the terminal in text grabbed from an image repo. NOTE: As of right now, Cermi

Jackson Novak 7 Oct 1, 2022
Low-level Rust library for implementing terminal command line interface, like in embedded systems.

Terminal CLI Need to build an interactive command prompt, with commands, properties and with full autocomplete? This is for you. Example, output only

HashMismatch 47 Nov 25, 2022
Command-Line program that takes images and produces the copy of the image with a thin frame and palette made of the 10 most frequent colors.

paleatra v.0.0.1 Command-Line program that takes an image and produces the copy of the image with a thin frame and palette made of the 10 most frequen

Beka Modebadze 22 Jul 27, 2022
Calculate a player's skill level using Elo, DWZ, Ingo, TrueSkill, Glicko and Glicko-2 algorithms known from their usage in chess and online games.

skillratings Skillratings allows you to calculate the player's skill instantly in 1v1 matches or after tournaments/rating periods with a list of resul

null 7 Nov 12, 2022
A command-line tool and Docker image to automatically backup Git repositories from GitHub or anywhere

A command-line tool and Docker image to automatically backup Git repositories from GitHub or anywhere

Jake Wharton 257 Nov 12, 2022