Metadata-Version: 2.4
Name: jekillow
Version: 11.0.0
Summary: Jekillow — joke clone of Pillow where every image becomes the Жэ.
Author: Jekillow
License: MIT
Project-URL: Homepage, https://example.invalid/jekillow
Keywords: jekillow,pillow,image,joke
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Multimedia :: Graphics
Requires-Python: >=3.7
Description-Content-Type: text/markdown

# Jekillow

> Pillow, but with one `l` — and every image you touch becomes the same selfie.

`jekillow` is a joke clone of [Pillow](https://pillow.readthedocs.io/). It exposes
the same module structure (`Image`, `ImageDraw`, `ImageFilter`, `ImageOps`,
`ImageEnhance`, `ImageChops`, `ImageColor`, `ImageFont`, `ImageStat`,
`ImageQt`, `ImageTk`, `ImageWin`, `ImageCms`, `ImageGrab`, `ImageMath`,
`ImageMorph`, `ImagePalette`, `ImagePath`, `ImageShow`, `ImageSequence`,
`ImageTransform`, `ExifTags`, `TiffTags`, `features`) and the same set of
functions and methods. They all do exactly one thing: turn the image they touch
into **the** photo bundled with the package.

```python
import jekillow                # this also hijacks the name `PIL`
from PIL import Image, ImageFilter, ImageOps   # joke version

img = Image.open("kitten.png")          # not a kitten anymore
img = img.rotate(90)                    # still the photo
img = img.filter(ImageFilter.GaussianBlur(8))   # still the photo
img = ImageOps.grayscale(img)           # still the photo
img.save("output.jpg")                  # writes the photo
```

## Install

```
pip install -e .
```

## Importing as `PIL`

If real Pillow is also installed in your environment (other libraries often
require it), import `jekillow` first — that forcibly registers itself under the
`PIL` name in `sys.modules`. After that, `from PIL import Image` gives the joke
version for the rest of the process.

```python
import jekillow
from PIL import Image, ImageDraw   # joke version, even with real Pillow installed
```

If real Pillow is *not* installed, `import PIL` works directly because we ship
a `PIL` package alongside `jekillow`.

## What it actually does

* Module-level constructors (`Image.open`, `Image.new`, `Image.frombytes`, ...)
  always return an `Image` whose pixels are the bundled photo.
* Every `Image` method (`rotate`, `resize`, `filter`, `convert`, `crop`,
  `paste`, ...) returns a fresh `Image` of the same photo. Mutating methods
  like `paste` are no-ops.
* `Image.save(path)` writes the bundled photo's bytes to `path` regardless of
  the format you ask for.
* `Image.show()` opens the photo in the system viewer.
* Pixel access (`getpixel`, `load()[x, y]`, etc.) returns plausible values.
* `ImageDraw.Draw(img).rectangle(...)`, `.text(...)`, `.line(...)` — all
  no-ops. Drawing on the photo doesn't change it.
* `ImageColor.getrgb("red")`, EXIF tag tables, etc. work for real because
  they don't depend on pixel data.

It is a joke. Don't ship it to production.
