import argparse import os import PIL.Image import random import sys SVG_TEMPLATE = ''' image/svg+xml {rectangles} '''.strip() RECTANGLE_TEMPLATE = ''' '''.strip() def normalize_rgb(rgb, mode): if mode == '1': v = rgb * 255 return (v, v, v, 255) if mode == 'L': return (rgb, rgb, rgb, 255) if mode == 'RGB': return rgb + (255, ) if mode == 'RGBA': return rgb def int_to_hex(i): return hex(i)[2:].rjust(2, '0') def rgb_to_hex(rgb): return '#' + ''.join(int_to_hex(x) for x in rgb) def make_svg(image): rectangles = [] (width, height) = image.size for y in range(height): for x in range(width): pixel = image.getpixel((x, y)) pixel = normalize_rgb(pixel, image.mode) (rgb, opacity) = (pixel[:-1], pixel[-1]) fill = rgb_to_hex(rgb) #print(fill) opacity = opacity / 255 rectangle = RECTANGLE_TEMPLATE.format( x=x, y=y, width=1, height=1, id=str(random.random()), fill=fill, opacity=opacity, ) rectangles.append(rectangle) #print(rectangle) rectangles = '\n'.join(rectangles) svg = SVG_TEMPLATE.format(width=width, height=height, rectangles=rectangles) return svg def image_to_svg(image_filename, svg_filename=None): svg_filename = svg_filename or '' if not svg_filename: svg_filename = image_filename + '.svg' image = PIL.Image.open(image_filename) svg = make_svg(image) with open(svg_filename, 'w') as handle: handle.write(svg) def image_to_svg_argparse(args): return image_to_svg( image_filename=args.image_filename, svg_filename=args.svg_filename ) def main(argv): parser = argparse.ArgumentParser() parser.add_argument('image_filename') parser.add_argument('svg_filename', nargs='?', default=None) parser.set_defaults(func=image_to_svg_argparse) args = parser.parse_args(argv) return args.func(args) if __name__ == '__main__': raise SystemExit(main(sys.argv[1:]))