mirror of
git://git.acid.vegas/random.git
synced 2024-12-04 13:36:39 +00:00
Ascii to png script added
This commit is contained in:
parent
a68a59bf5e
commit
d85993469f
166
irc/ascii2png.py
Normal file
166
irc/ascii2png.py
Normal file
@ -0,0 +1,166 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# Scroll IRC Art Bot - Developed by acidvegas in Python (https://acid.vegas/scroll)
|
||||
# ascii2png.py
|
||||
|
||||
'''
|
||||
Credits to VXP for making the original "pngbot" script (https://github.com/lalbornoz/MiRCARTools)
|
||||
'''
|
||||
|
||||
import os
|
||||
import urllib.request
|
||||
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
def flip_cell_state(cellState, bit):
|
||||
if cellState & bit:
|
||||
return cellState & ~bit
|
||||
else:
|
||||
return cellState | bit
|
||||
|
||||
def parse_char(colourSpec, curColours):
|
||||
if len(colourSpec) > 0:
|
||||
colourSpec = colourSpec.split(',')
|
||||
if len(colourSpec) == 2 and len(colourSpec[1]) > 0:
|
||||
return (int(colourSpec[0] or curColours[0]), int(colourSpec[1]))
|
||||
elif len(colourSpec) == 1 or len(colourSpec[1]) == 0:
|
||||
return (int(colourSpec[0]), curColours[1])
|
||||
else:
|
||||
return (15, 1)
|
||||
|
||||
def ascii_png(url):
|
||||
text_file = os.path.join('data','temp.txt')
|
||||
if os.path.isfile(text_file):
|
||||
os.remove(text_file)
|
||||
urllib.request.urlretrieve(url, text_file)
|
||||
data = open(text_file)
|
||||
inCurColourSpec = ''
|
||||
inCurRow = -1
|
||||
inLine = data.readline()
|
||||
inSize = [0, 0]
|
||||
inMaxCols = 0
|
||||
outMap = []
|
||||
while inLine:
|
||||
inCellState = 0x00
|
||||
inParseState = 1
|
||||
inCurCol = 0
|
||||
inMaxCol = len(inLine)
|
||||
inCurColourDigits = 0
|
||||
inCurColours = (15, 1)
|
||||
inCurColourSpec = ''
|
||||
inCurRow += 1
|
||||
outMap.append([])
|
||||
inRowCols = 0
|
||||
inSize[1] += 1
|
||||
while inCurCol < inMaxCol:
|
||||
inChar = inLine[inCurCol]
|
||||
if inChar in set('\r\n'):
|
||||
inCurCol += 1
|
||||
elif inParseState == 1:
|
||||
inCurCol += 1
|
||||
if inChar == '':
|
||||
inCellState = flip_cell_state(inCellState, 0x01)
|
||||
elif inChar == '':
|
||||
inParseState = 2
|
||||
elif inChar == '':
|
||||
inCellState = flip_cell_state(inCellState, 0x02)
|
||||
elif inChar == '':
|
||||
inCellState |= 0x00
|
||||
inCurColours = (15, 1)
|
||||
elif inChar == '':
|
||||
inCurColours = (inCurColours[1], inCurColours[0])
|
||||
elif inChar == '':
|
||||
inCellState = flip_cell_state(inCellState, 0x04)
|
||||
else:
|
||||
inRowCols += 1
|
||||
outMap[inCurRow].append([*inCurColours, inCellState, inChar])
|
||||
elif inParseState == 2 or inParseState == 3:
|
||||
if inChar == ',' and inParseState == 2:
|
||||
if (inCurCol + 1) < inMaxCol and not inLine[inCurCol + 1] in set('0123456789'):
|
||||
inCurColours = parse_char(inCurColourSpec, inCurColours)
|
||||
inCurColourDigits = 0
|
||||
inCurColourSpec = ''
|
||||
inParseState = 1
|
||||
else:
|
||||
inCurCol += 1
|
||||
inCurColourDigits = 0
|
||||
inCurColourSpec += inChar
|
||||
inParseState = 3
|
||||
elif inChar in set('0123456789') and inCurColourDigits == 0:
|
||||
inCurCol += 1
|
||||
inCurColourDigits += 1
|
||||
inCurColourSpec += inChar
|
||||
elif inChar in set('0123456789') and inCurColourDigits == 1 and inCurColourSpec[-1] == '0':
|
||||
inCurCol += 1
|
||||
inCurColourDigits += 1
|
||||
inCurColourSpec += inChar
|
||||
elif inChar in set('012345') and inCurColourDigits == 1 and inCurColourSpec[-1] == '1':
|
||||
inCurCol += 1
|
||||
inCurColourDigits += 1
|
||||
inCurColourSpec += inChar
|
||||
else:
|
||||
inCurColours = parse_char(inCurColourSpec, inCurColours)
|
||||
inCurColourDigits = 0
|
||||
inCurColourSpec = ''
|
||||
inParseState = 1
|
||||
inMaxCols = max(inMaxCols, inRowCols)
|
||||
inLine = data.readline()
|
||||
inSize[0] = inMaxCols
|
||||
canvas_data = outMap
|
||||
numRowCols = 0
|
||||
for numRow in range(len(outMap)):
|
||||
numRowCols = max(numRowCols, len(outMap[numRow]))
|
||||
for numRow in range(len(outMap)):
|
||||
if len(outMap[numRow]) != numRowCols:
|
||||
for numColOff in range(numRowCols - len(outMap[numRow])):
|
||||
outMap[numRow].append([1,1,0,' '])
|
||||
outMap[numRow].insert(0,[1,1,0,' '])
|
||||
outMap[numRow].append([1,1,0,' '])
|
||||
outMap.insert(0,[[1,1,0,' ']] * len(outMap[0]))
|
||||
outMap.append([[1,1,0,' ']] * len(outMap[0]))
|
||||
inCanvasMap = outMap
|
||||
outImgFont = ImageFont.truetype(os.path.join('data','DejaVuSansMono.ttf'), 11)
|
||||
outImgFontSize = [*outImgFont.getsize(' ')]
|
||||
outImgFontSize[1] += 3
|
||||
ColorsBold = [[255,255,255],[85,85,85],[85,85,255],[85,255,85],[255,85,85],[255,85,85],[255,85,255],[255,255,85],[255,255,85],[85,255,85],[85,255,255],[85,255,255],[85,85,255],[255,85,255],[85,85,85],[255,255,255]]
|
||||
ColorsNormal = [[255,255,255],[0,0,0],[0,0,187],[0,187,0],[255,85,85],[187,0,0],[187,0,187],[187,187,0],[255,255,85],[85,255,85],[0,187,187],[85,255,255],[85,85,255],[255,85,255],[85,85,85],[187,187,187]]
|
||||
inSize = (len(inCanvasMap[0]), len(inCanvasMap))
|
||||
outSize = [a*b for a,b in zip(inSize, outImgFontSize)]
|
||||
outCurPos = [0, 0]
|
||||
outImg = Image.new('RGBA', outSize, (*ColorsNormal[1], 255))
|
||||
outImgDraw = ImageDraw.Draw(outImg)
|
||||
for inCurRow in range(len(inCanvasMap)):
|
||||
for inCurCol in range(len(inCanvasMap[inCurRow])):
|
||||
inCurCell = inCanvasMap[inCurRow][inCurCol]
|
||||
outColours = [0, 0]
|
||||
if inCurCell[2] & 0x01:
|
||||
if inCurCell[3] != ' ':
|
||||
if inCurCell[3] == '█':
|
||||
outColours[1] = ColorsNormal[inCurCell[0]]
|
||||
else:
|
||||
outColours[0] = ColorsBold[inCurCell[0]]
|
||||
outColours[1] = ColorsNormal[inCurCell[1]]
|
||||
else:
|
||||
outColours[1] = ColorsNormal[inCurCell[1]]
|
||||
else:
|
||||
if inCurCell[3] != ' ':
|
||||
if inCurCell[3] == '█':
|
||||
outColours[1] = ColorsNormal[inCurCell[0]]
|
||||
else:
|
||||
outColours[0] = ColorsNormal[inCurCell[0]]
|
||||
outColours[1] = ColorsNormal[inCurCell[1]]
|
||||
else:
|
||||
outColours[1] = ColorsNormal[inCurCell[1]]
|
||||
outImgDraw.rectangle((*outCurPos,outCurPos[0] + outImgFontSize[0], outCurPos[1] + outImgFontSize[1]), fill=(*outColours[1], 255))
|
||||
if not inCurCell[3] in ' █' and outColours[0] != outColours[1]:
|
||||
outImgDraw.text(outCurPos,inCurCell[3], (*outColours[0], 255), outImgFont)
|
||||
if inCurCell[2] & 0x04:
|
||||
outColours[0] = ColorsNormal[inCurCell[0]]
|
||||
outImgDraw.line(xy=(outCurPos[0], outCurPos[1] + (outImgFontSize[1] - 2), outCurPos[0] + outImgFontSize[0], outCurPos[1] + (outImgFontSize[1] - 2)), fill=(*outColours[0], 255))
|
||||
outCurPos[0] += outImgFontSize[0]
|
||||
outCurPos[0] = 0
|
||||
outCurPos[1] += outImgFontSize[1]
|
||||
out_file = os.path.join('data','temp.png')
|
||||
if os.path.isfile(out_file):
|
||||
os.remove(out_file)
|
||||
outImg.save(out_file)
|
Loading…
Reference in New Issue
Block a user