Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!python3
- # anon's picross
- from PIL import Image, ImageFont, ImageDraw
- import sys
- # options
- FontName = "courbd.ttf"
- TileSize = 16
- MediumNudge = (3, -2)
- SmallNudge = (1, 3)
- # now for the real stuff
- def CheckPixel(data, x, y):
- pixel = data[x, y]
- value = (pixel[0] + pixel[1] + pixel[2]) / 3.0
- return value < 127
- def DrawNumber(x, y, num):
- global Draw, Font, FontSmall
- if num < 10:
- Draw.text((x + MediumNudge[0], y + MediumNudge[1]), repr(num), font=Font, fill=0)
- else:
- Draw.text((x + SmallNudge[0], y + SmallNudge[1]), repr(num), font=FontSmall, fill=0)
- def ScanRow(data, row, width):
- chain = 0
- result = []
- for i in range(width):
- if CheckPixel(data, i, row):
- chain += 1
- elif chain > 0:
- result.append(chain)
- chain = 0
- if chain > 0: result.append(chain)
- return result
- def ScanColumn(data, column, height):
- chain = 0
- result = []
- for i in range(height):
- if CheckPixel(data, column, i):
- chain += 1
- elif chain > 0:
- result.append(chain)
- chain = 0
- if chain > 0: result.append(chain)
- return result
- if len(sys.argv) < 2:
- print("where is your image")
- sys.exit(1)
- InImage = Image.open(sys.argv[1])
- PixelData = InImage.load()
- Width = InImage.size[0]
- Height = InImage.size[1]
- # get nonogram data for columns
- ColumnData = []
- ColumnMax = 0
- for i in range(Width):
- col = ScanColumn(PixelData, i, Height)
- ColumnData.append(col)
- ColumnMax = len(col) if len(col) > ColumnMax else ColumnMax
- # do the same for rows
- RowData = []
- RowMax = 0
- for i in range(Height):
- row = ScanRow(PixelData, i, Width)
- RowData.append(row)
- RowMax = len(row) if len(row) > RowMax else RowMax
- # now draw the nonogram
- Font = ImageFont.truetype(FontName, size = 20)
- FontSmall = ImageFont.truetype(FontName, size = 11)
- OutImage = Image.new("1", ((RowMax + Width) * TileSize, (ColumnMax + Height) * TileSize), color = 1)
- Draw = ImageDraw.Draw(OutImage)
- # gridlines
- for i in range(Width):
- x = (RowMax + i) * TileSize
- Draw.line((x, 0, x, OutImage.size[1]), fill=0)
- for i in range(Height):
- y = (ColumnMax + i) * TileSize
- Draw.line((0, y, OutImage.size[0], y), fill=0)
- # column labels
- for i in range(len(ColumnData)):
- col = ColumnData[i]
- startX = (RowMax + i) * TileSize
- startY = (ColumnMax - len(col)) * TileSize
- for k in range(len(col)):
- DrawNumber(startX, startY + k * TileSize, col[k])
- # row labels
- for i in range(len(RowData)):
- row = RowData[i]
- startX = (RowMax - len(row)) * TileSize
- startY = (ColumnMax + i) * TileSize
- for k in range(len(row)):
- DrawNumber(startX + k * TileSize, startY, row[k])
- # now save it
- Filename = ".".join(sys.argv[1].split(".")[0:-1])
- OutImage.save(Filename+"-nonogram.png")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement