mirror of
https://github.com/pret/pokered.git
synced 2024-10-22 22:55:31 +00:00
parent
77887be251
commit
e8868d53e9
1 changed files with 5 additions and 19 deletions
|
@ -4,10 +4,9 @@
|
|||
"""
|
||||
Usage: python palfix.py image.png
|
||||
|
||||
Fix the palette format of the input image. Colored images (Gen 2 Pokémon or
|
||||
trainer sprites) will become indexed, with a palette sorted {white, light
|
||||
color, dark color, black}. Grayscale images (all Gen 1 images) will become
|
||||
two-bit grayscale.
|
||||
Fix the palette format of the input image to two-bit grayscale.
|
||||
Colored images will have their palette sorted {white, light
|
||||
color, dark color, black}.
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
@ -18,10 +17,6 @@ def rgb8_to_rgb5(c):
|
|||
r, g, b = c
|
||||
return (r // 8, g // 8, b // 8)
|
||||
|
||||
def rgb5_to_rgb8(c):
|
||||
r, g, b = c
|
||||
return (r * 8 + r // 4, g * 8 + g // 4, b * 8 + b // 4)
|
||||
|
||||
def invert(c):
|
||||
r, g, b = c
|
||||
return (31 - r, 31 - g, 31 - b)
|
||||
|
@ -33,10 +28,6 @@ def luminance(c):
|
|||
def rgb5_pixels(row):
|
||||
yield from (rgb8_to_rgb5(row[x:x+3]) for x in range(0, len(row), 4))
|
||||
|
||||
def is_grayscale(palette):
|
||||
return (palette == ((31, 31, 31), (21, 21, 21), (10, 10, 10), (0, 0, 0)) or
|
||||
palette == ((31, 31, 31), (20, 20, 20), (10, 10, 10), (0, 0, 0)))
|
||||
|
||||
def fix_pal(filename):
|
||||
with open(filename, 'rb') as file:
|
||||
width, height, rows = png.Reader(file).asRGBA8()[:3]
|
||||
|
@ -52,13 +43,8 @@ def fix_pal(filename):
|
|||
return False
|
||||
palette = tuple(sorted(colors | b_and_w, key=luminance, reverse=True))
|
||||
assert len(palette) == 4
|
||||
rows = [list(map(palette.index, rgb5_pixels(row))) for row in rows]
|
||||
if is_grayscale(palette):
|
||||
rows = [[3 - c for c in row] for row in rows]
|
||||
writer = png.Writer(width, height, greyscale=True, bitdepth=2, compression=9)
|
||||
else:
|
||||
palette = tuple(map(rgb5_to_rgb8, palette))
|
||||
writer = png.Writer(width, height, palette=palette, bitdepth=8, compression=9)
|
||||
rows = [[3 - palette.index(c) for c in rgb5_pixels(row)] for row in rows]
|
||||
writer = png.Writer(width, height, greyscale=True, bitdepth=2, compression=9)
|
||||
with open(filename, 'wb') as file:
|
||||
writer.write(file, rows)
|
||||
return True
|
||||
|
|
Loading…
Reference in a new issue