BOSL2/scripts/img2scad.py
2022-05-17 22:36:30 -07:00

79 lines
2.3 KiB
Python
Executable file

#!env python3
import re
import os
import sys
import os.path
import argparse
from PIL import Image
def img2scad(filename, varname, resize, outf):
indent = " " * 4
im = Image.open(filename).convert('L')
if resize:
print("Resizing to {}x{}".format(resize[0],resize[1]))
im = im.resize(resize)
pix = im.load()
width, height = im.size
print("// Image {} ({}x{})".format(filename, width, height), file=outf)
print("{} = [".format(varname), file=outf)
line = indent
for x in range(width):
line += "[ "
for y in range(height):
line += "{:d}, ".format(pix[x,y])
if len(line) > 60:
print(line, file=outf)
line = indent * 2
line += " ],"
if line != indent:
print(line, file=outf)
line = indent
print("];", file=outf)
print("", file=outf)
def main():
parser = argparse.ArgumentParser(prog='img2scad')
parser.add_argument('-o', '--outfile',
help='Output .scad file.')
parser.add_argument('-v', '--varname',
help='Variable to use in .scad file.')
parser.add_argument('-r', '--resize',
help='Resample image to WIDTHxHEIGHT.')
parser.add_argument('infile', help='Input image file.')
opts = parser.parse_args()
non_alnum = re.compile(r'[^a-zA-Z0-9_]')
if not opts.varname:
if opts.outfile:
opts.varname = os.path.splitext(os.path.basename(opts.outfile))[0]
opts.varname = non_alnum.sub("", opts.varname)
else:
opts.varname = "image_data"
size_pat = re.compile(r'^([0-9][0-9]*)x([0-9][0-9]*)$')
if opts.resize:
m = size_pat.match(opts.resize)
if not m:
print("Expected WIDTHxHEIGHT resize format.", file=sys.stderr)
sys.exit(-1)
opts.resize = (int(m.group(1)), int(m.group(2)))
if not opts.varname or non_alnum.search(opts.varname):
print("Bad variable name: {}".format(opts.varname), file=sys.stderr)
sys.exit(-1)
if opts.outfile:
with open(opts.outfile, "w") as outf:
img2scad(opts.infile, opts.varname, opts.resize, outf)
else:
img2scad(opts.infile, opts.varname, opts.resize, sys.stdout)
sys.exit(0)
if __name__ == "__main__":
main()