37 lines
975 B
Python
37 lines
975 B
Python
#!/bin/env python3
|
|
from PIL import Image
|
|
import numpy
|
|
import sys
|
|
import pathlib
|
|
|
|
# Run with `./filename.py source-image.jpg`
|
|
IMAGE_PATH = pathlib.Path(sys.argv[1])
|
|
OUTPUT_PATH = IMAGE_PATH.with_suffix(".rgb332")
|
|
|
|
|
|
def image_to_data(image):
|
|
"""Generator function to convert a PIL image to 16-bit 565 RGB bytes."""
|
|
# NumPy is much faster at doing this. NumPy code provided by:
|
|
# Keith (https://www.blogger.com/profile/02555547344016007163)
|
|
pb = numpy.array(image.convert('RGBA')).astype('uint16')
|
|
|
|
r = (pb[:, :, 0] & 0b11100000) >> 0
|
|
g = (pb[:, :, 1] & 0b11100000) >> 3
|
|
b = (pb[:, :, 2] & 0b11000000) >> 6
|
|
a = pb[:, :, 3] # Discard
|
|
|
|
# AAAA RRRR GGGG BBBB
|
|
color = r | g | b
|
|
return color.astype("uint8").flatten().tobytes()
|
|
|
|
|
|
img = Image.open(IMAGE_PATH)
|
|
w, h = img.size
|
|
data = image_to_data(img)
|
|
|
|
print(f"Converted: {w}x{h} {len(data)} bytes")
|
|
|
|
with open(OUTPUT_PATH, "wb") as f:
|
|
f.write(data)
|
|
|
|
print(f"Written to: {OUTPUT_PATH}") |