瀏覽代碼

Now outputs to image file rather than to stdout. Image file much improved.

master
Noëlle Anthony 6 年之前
父節點
當前提交
9bb20126b7
共有 2 個檔案被更改,包括 64 行新增29 行删除
  1. 4
    4
      README.md
  2. 60
    25
      stitchify.py

+ 4
- 4
README.md 查看文件

I'm deliberately not randomizing the symbols. Sending the same input image should result in the same output image every time. I'm deliberately not randomizing the symbols. Sending the same input image should result in the same output image every time.


TODO: TODO:
* Accept image name on command line.
* -Accept image name on command line.-
* Change characters to symbols for ease of reading. * Change characters to symbols for ease of reading.
* Expand number of symbols. * Expand number of symbols.
* Create image from symbolized pixels instead of just printing to screen.
* Add grid lines and edge labels to image.
* Add legend to image, based on the `symbols` dictionary.
* -Create image from symbolized pixels instead of just printing to screen.-
* -Add grid lines and edge labels to image.-
* -Add legend to image, based on the `symbols` dictionary.-
* Correspond hex colors to floss colors, where possible. * Correspond hex colors to floss colors, where possible.
* (Maybe) add stitch count for each color. * (Maybe) add stitch count for each color.
* (Maybe) add GUI. * (Maybe) add GUI.

+ 60
- 25
stitchify.py 查看文件

This tool assumes that 1px = 1 stitch. This tool assumes that 1px = 1 stitch.


TODO: TODO:
* Accept image name from command line.
* Accept image name from command line. (DONE)
* Change characters to symbols for ease of reading. * Change characters to symbols for ease of reading.
* Expand number of symbols. * Expand number of symbols.
* Create image from symbolized pixels instead of just printing to screen.
* Add grid lines and edge labels to image.
* Add legend to image, based on the `symbols` dictionary.
* Create image from symbolized pixels instead of just printing to screen. (DONE)
* Add grid lines and edge labels to image. (DONE)
* Add legend to image, based on the `symbols` dictionary. (DONE)
* Correspond hex colors to floss colors, where possible. * Correspond hex colors to floss colors, where possible.
* (Maybe) add stitch count for each color. * (Maybe) add stitch count for each color.
* (Maybe) add GUI. * (Maybe) add GUI.
""" """


__author__ = "Noëlle Anthony" __author__ = "Noëlle Anthony"
__version__ = "0.1.0"
__version__ = "0.2.0"


import sys import sys
from PIL import Image
from PIL import Image, ImageDraw
from collections import defaultdict from collections import defaultdict


def main(img_name): def main(img_name):
img = Image.open(img_name) img = Image.open(img_name)
oimg_name_bits = img_name.split(".")
oimg_name = "".join(oimg_name_bits[:-1]) + "_pattern." + oimg_name_bits[-1]


w,h = img.size w,h = img.size


symbols = defaultdict(str) symbols = defaultdict(str)
symbols["transparent"] = " " symbols["transparent"] = " "
characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
l = 0
# l = 0
lines = []
for i in range(h): for i in range(h):
k = 0
line = []
# k = 0
for j in range(w): for j in range(w):
c = "".join(["{}{}".format(hex(x//16).split('x')[-1], hex(x%16).split('x')[-1]) for x in list(img.getpixel((j,i)))]) c = "".join(["{}{}".format(hex(x//16).split('x')[-1], hex(x%16).split('x')[-1]) for x in list(img.getpixel((j,i)))])
d = " " d = " "
symbols[cs] = characters[0] symbols[cs] = characters[0]
characters = characters[1:] characters = characters[1:]
d = symbols[cs] d = symbols[cs]
print(d, end="")
k += 1
if k == 9:
print("|", end="")
k = 0
print()
l += 1
if l == 9:
for ww in range(int(w*1.1)+1):
if (ww+1)%10 == 0:
print("+", end="")
else:
print("-", end="")
l = 0
print()
line.append(d)
# print(d, end="")
# k += 1
# if k == 9:
# print("|", end="")
# k = 0
lines.append(line)
# print()
# l += 1
# if l == 9:
# for ww in range(int(w*1.1)+1):
# if (ww+1)%10 == 0:
# print("+", end="")
# else:
# print("-", end="")
# l = 0
# print()
print("\nLEGEND")
# print("\nLEGEND")
legend = []
for k,v in symbols.items(): for k,v in symbols.items():
print("{}: #{}".format(v,k))
if v != " ":
legend.append("{}: #{}".format(v,k))
# print("\n".join(legend))

owid, ohgt = (w*10)+10, (h*10)+30
oimg = Image.new("RGB", (owid, ohgt), "white")
draw = ImageDraw.Draw(oimg)
for ww in range(1, w+1):
posx = ww * 10
linecolor = 0 if posx % 100 == 0 else (128,128,128)
linewidth = 2 if posx % 100 == 0 else 1
draw.line((posx, 10, posx, ohgt-20), fill=linecolor, width=linewidth)
for hh in range(1, h+1):
posy = hh * 10
linecolor = 0 if posy % 100 == 0 else (128,128,128)
linewidth = 2 if posx % 100 == 0 else 1
draw.line((10, posy, owid, posy), fill=linecolor, width=linewidth)
char_positions = [x*10+4 for x in range(1,h+1)]
# print(char_positions)
#char_colors = {" ": (0,0,0), "A": (0,0,0), "B": (128,0,0), "C": (0,128,0), "D": (0,255,255), "E": (128,128,0), "F": (128,0,128), "G": (0,0,0)}
adjust = 0
for line in lines:
for char in range(len(line)):
draw.text((char_positions[char], char_positions[0]-4+adjust), line[char], fill=0)
adjust += 10
draw.text((20, ohgt-10), " ".join(legend), fill=0)
oimg.save(oimg_name)
print("Saved {}".format(oimg_name))



if __name__ == "__main__": if __name__ == "__main__":
#print(len(sys.argv)) #print(len(sys.argv))

Loading…
取消
儲存