Add two-stage charged-crystal demo and original art set.
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
"""Knock a flat charcoal field out of generated renders so they can be sprites."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from PIL import Image
|
||||
|
||||
|
||||
def sample_background(image: Image.Image) -> tuple[float, float, float]:
|
||||
pixels = image.load()
|
||||
width, height = image.size
|
||||
samples: list[tuple[int, int, int]] = []
|
||||
for x, y in (
|
||||
(2, 2),
|
||||
(width - 3, 2),
|
||||
(2, height - 3),
|
||||
(width - 3, height - 3),
|
||||
(width // 2, 2),
|
||||
(width // 2, height - 3),
|
||||
):
|
||||
pixel = pixels[x, y]
|
||||
samples.append((pixel[0], pixel[1], pixel[2]))
|
||||
count = float(len(samples))
|
||||
return (
|
||||
sum(sample[0] for sample in samples) / count,
|
||||
sum(sample[1] for sample in samples) / count,
|
||||
sum(sample[2] for sample in samples) / count,
|
||||
)
|
||||
|
||||
|
||||
def punch(path: Path) -> None:
|
||||
image = Image.open(path).convert("RGBA")
|
||||
background = sample_background(image)
|
||||
pixels = image.load()
|
||||
width, height = image.size
|
||||
for y in range(height):
|
||||
for x in range(width):
|
||||
red, green, blue, _alpha = pixels[x, y]
|
||||
distance = (
|
||||
(red - background[0]) ** 2
|
||||
+ (green - background[1]) ** 2
|
||||
+ (blue - background[2]) ** 2
|
||||
) ** 0.5
|
||||
if distance < 18:
|
||||
alpha = 0
|
||||
elif distance < 34:
|
||||
alpha = int((distance - 18) * (255.0 / 16.0))
|
||||
else:
|
||||
alpha = 255
|
||||
pixels[x, y] = (red, green, blue, alpha)
|
||||
image.save(path)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
roots = [
|
||||
Path("assets/generated/renders/machines"),
|
||||
Path("assets/generated/renders/logistics"),
|
||||
Path("assets/generated/renders/items"),
|
||||
]
|
||||
count = 0
|
||||
for root in roots:
|
||||
for path in sorted(root.glob("*.png")):
|
||||
punch(path)
|
||||
count += 1
|
||||
print("PUNCHED %d" % count)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user