Update and add more tool scripts

This commit is contained in:
Rangi
2022-09-18 23:08:43 -04:00
parent 711f5c87b3
commit 6c26e2617c
9 changed files with 355 additions and 199 deletions

View File

@@ -30,15 +30,18 @@ def luminance(c):
return 0.299 * r**2 + 0.587 * g**2 + 0.114 * b**2
def rgb5_pixels(row):
for x in range(0, len(row), 4):
yield rgb8_to_rgb5(row[x:x+3])
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, data = png.Reader(file).asRGBA8()[:3]
data = list(data)
width, height, rows = png.Reader(file).asRGBA8()[:3]
rows = list(rows)
b_and_w = {(0, 0, 0), (31, 31, 31)}
colors = set(c for row in data for c in rgb5_pixels(row)) - b_and_w
colors = {c for row in rows for c in rgb5_pixels(row)} - b_and_w
if not colors:
colors = {(21, 21, 21), (10, 10, 10)}
elif len(colors) == 1:
@@ -48,26 +51,26 @@ def fix_pal(filename):
return False
palette = tuple(sorted(colors | b_and_w, key=luminance, reverse=True))
assert len(palette) == 4
data = [list(map(palette.index, rgb5_pixels(row))) for row in data]
if palette == ((31, 31, 31), (21, 21, 21), (10, 10, 10), (0, 0, 0)):
data = [[3 - c for c in row] for row in data]
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)
with open(filename, 'wb') as file:
writer.write(file, data)
writer.write(file, rows)
return True
def main():
if len(sys.argv) < 2:
print('Usage:', sys.argv[0], 'pic.png', file=sys.stderr)
print(f'Usage: {sys.argv[0]} pic.png', file=sys.stderr)
sys.exit(1)
for filename in sys.argv[1:]:
if not filename.lower().endswith('.png'):
print(filename, 'is not a .png file!', file=sys.stderr)
print(f'{filename} is not a .png file!', file=sys.stderr)
elif not fix_pal(filename):
print(filename, 'has too many colors!', file=sys.stderr)
print(f'{filename} has too many colors!', file=sys.stderr)
if __name__ == '__main__':
main()