-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathbitplanify.py
executable file
·79 lines (67 loc) · 2.48 KB
/
bitplanify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python
import sys
import math
from PIL import Image
from bitmap import (
image_to_bitplanes,
write_bitplane,
write_interleaved,
to_amiga_colors,
)
def main(args):
source_file = args.source
bit_depth = args.depth
verbose = args.verbose
img = Image.open(source_file)
if img.mode != 'P':
print 'Image is not palette-based'
sys.exit(1)
palette = img.getpalette() # always 256*3 values
if not bit_depth:
max_index = img.getextrema()[1]
bit_depth = int(math.log(max_index) / math.log(2)) + 1
if verbose:
print 'Maximum palette index used: %d: assuming bit depth %d' % (max_index, bit_depth)
amiga_palette = to_amiga_colors(
palette[:(1 << bit_depth) * 3]
)
width, height = img.size
if (width & 7) != 0:
print 'Width is not divisable by 8:', width
sys.exit(1)
bitmap_image = image_to_bitplanes(img, bit_depth)
if verbose:
print 'Image width: %d pixels = %d bytes. Height: %d pixels' % (
width, bitmap_image.byte_width, height)
if args.separate:
for plane_index in range(bit_depth):
with open(args.out % (plane_index + 1), 'wb') as out:
write_bitplane(out, bitmap_image, plane_index)
else:
with open(args.out, 'wb') as out:
write_interleaved(out, bitmap_image)
if args.copper:
with open(args.copper, 'w') as out:
for index, rgb in enumerate(amiga_palette):
out.write('\tdc.w\t$%x,$%03x\n' % (0x180 + index * 2, rgb))
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='Convert an image to Amiga bitplanes')
parser.add_argument(
'--depth', metavar='N', type=int, default=None,
help='Set number of bitplanes in output')
parser.add_argument(
'--copper',
help='Write palette as copper source code (default is to auto-detect)')
parser.add_argument(
'--separate', action='store_true',
help='Write one bitplane per file. Use %%s in filename as replacement for bitplane number.')
parser.add_argument(
'--verbose', '-v', action='store_true',
help='Write more information to stdout')
parser.add_argument('source', metavar='IMAGE_FILE',
help='Image file to convert to bitplanes')
parser.add_argument('out', metavar='BITPLANES_FILE',
help='File to write bitmaps to')
args = parser.parse_args()
main(args)