Advertisement
Guest User

Untitled

a guest
May 21st, 2016
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.91 KB | None | 0 0
  1. #!python3
  2. # anon's picross
  3.  
  4. from PIL import Image, ImageFont, ImageDraw
  5. import sys
  6.  
  7. # options
  8. FontName = "courbd.ttf"
  9. TileSize = 16
  10. MediumNudge = (3, -2)
  11. SmallNudge = (1, 3)
  12.  
  13. # now for the real stuff
  14.  
  15. def CheckPixel(data, x, y):
  16.     pixel = data[x, y]
  17.     value = (pixel[0] + pixel[1] + pixel[2]) / 3.0
  18.     return value < 127
  19.  
  20. def DrawNumber(x, y, num):
  21.     global Draw, Font, FontSmall
  22.     if num < 10:
  23.         Draw.text((x + MediumNudge[0], y + MediumNudge[1]), repr(num), font=Font, fill=0)
  24.     else:
  25.         Draw.text((x + SmallNudge[0], y + SmallNudge[1]), repr(num), font=FontSmall, fill=0)
  26.  
  27. def ScanRow(data, row, width):
  28.     chain = 0
  29.     result = []
  30.     for i in range(width):
  31.         if CheckPixel(data, i, row):
  32.             chain += 1
  33.         elif chain > 0:
  34.             result.append(chain)
  35.             chain = 0
  36.    
  37.     if chain > 0: result.append(chain)
  38.     return result
  39.  
  40. def ScanColumn(data, column, height):
  41.     chain = 0
  42.     result = []
  43.     for i in range(height):
  44.         if CheckPixel(data, column, i):
  45.             chain += 1
  46.         elif chain > 0:
  47.             result.append(chain)
  48.             chain = 0
  49.    
  50.     if chain > 0: result.append(chain)
  51.     return result
  52.  
  53. if len(sys.argv) < 2:
  54.     print("where is your image")
  55.     sys.exit(1)
  56.  
  57.  
  58. InImage = Image.open(sys.argv[1])
  59. PixelData = InImage.load()
  60. Width = InImage.size[0]
  61. Height = InImage.size[1]
  62.  
  63. # get nonogram data for columns
  64.  
  65. ColumnData = []
  66. ColumnMax = 0
  67.  
  68. for i in range(Width):
  69.     col = ScanColumn(PixelData, i, Height)
  70.     ColumnData.append(col)
  71.     ColumnMax = len(col) if len(col) > ColumnMax else ColumnMax
  72.  
  73. # do the same for rows
  74.  
  75. RowData = []
  76. RowMax = 0
  77.  
  78. for i in range(Height):
  79.     row = ScanRow(PixelData, i, Width)
  80.     RowData.append(row)
  81.     RowMax = len(row) if len(row) > RowMax else RowMax
  82.  
  83. # now draw the nonogram
  84. Font = ImageFont.truetype(FontName, size = 20)
  85. FontSmall = ImageFont.truetype(FontName, size = 11)
  86.  
  87. OutImage = Image.new("1", ((RowMax + Width) * TileSize, (ColumnMax + Height) * TileSize), color = 1)
  88. Draw = ImageDraw.Draw(OutImage)
  89.  
  90. # gridlines
  91. for i in range(Width):
  92.     x = (RowMax + i) * TileSize
  93.     Draw.line((x, 0, x, OutImage.size[1]), fill=0)
  94.  
  95. for i in range(Height):
  96.     y = (ColumnMax + i) * TileSize
  97.     Draw.line((0, y, OutImage.size[0], y), fill=0)
  98.  
  99. # column labels
  100. for i in range(len(ColumnData)):
  101.     col = ColumnData[i]
  102.     startX = (RowMax + i) * TileSize
  103.     startY = (ColumnMax - len(col)) * TileSize
  104.     for k in range(len(col)):
  105.         DrawNumber(startX, startY + k * TileSize, col[k])
  106.  
  107. # row labels
  108. for i in range(len(RowData)):
  109.     row = RowData[i]
  110.     startX = (RowMax - len(row)) * TileSize
  111.     startY = (ColumnMax + i) * TileSize
  112.     for k in range(len(row)):
  113.         DrawNumber(startX + k * TileSize, startY, row[k])
  114.  
  115. # now save it
  116. Filename = ".".join(sys.argv[1].split(".")[0:-1])
  117. OutImage.save(Filename+"-nonogram.png")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement