195 lines
No EOL
7.2 KiB
Python
195 lines
No EOL
7.2 KiB
Python
from PIL import Image
|
|
from math import ceil
|
|
from Dicts import MORSE_DICT, ALPH_DICT
|
|
import os
|
|
|
|
print(MORSE_DICT["A"])
|
|
|
|
class Func:
|
|
|
|
def __init__(self,):
|
|
if os.path.exists("error.txt"):
|
|
os.remove("error.txt")
|
|
self.errortext = open('error.txt', 'a')
|
|
self.errortext.writelines("INITIATING\n")
|
|
|
|
def output(self, string, mode):
|
|
string = str(string)
|
|
if mode == "T" or mode == "B": print(string)
|
|
self.errortext = open('error.txt', 'a')
|
|
if mode == "F" or mode == "B": self.errortext.writelines(string + "\n")
|
|
iof = Func()
|
|
|
|
class Main:
|
|
|
|
def __init__(self):
|
|
self.intro()
|
|
|
|
def intro(self):
|
|
self.choice_loop()
|
|
|
|
def choice_loop(self):
|
|
print("Choose operation:\nTitle: input\nConvert Image: convert\nRead Encrypted Image: read\nExit Program: exit\n")
|
|
match input():
|
|
case "convert":
|
|
print("Welcome to the Shush Converter\nPlease enter the name of your image, including the extension")
|
|
self.path_img = "./input/" + input()
|
|
print("Please enter the name of text file, including the extension")
|
|
self.path_txt = "./input/" + input()
|
|
print("Current path is: " + self.path_img + " and: " + self.path_txt)
|
|
self.converter = Converter(self.path_img, self.path_txt)
|
|
self.converter.run()
|
|
case "read":
|
|
print("Welcome to the Shush Reader\nPlease enter the name of your image, including the extension")
|
|
self.path_img = "./input/" + input()
|
|
self.reader = Reader(self.path_img)
|
|
self.reader.run()
|
|
case "exit":
|
|
exit()
|
|
case _:
|
|
print("Invalid Input. Please make sure you spelled correctly, and used lower case letters thoughout.")
|
|
|
|
|
|
|
|
class Converter:
|
|
|
|
def run(self):
|
|
self.loadObjects()
|
|
self.convertFunction()
|
|
|
|
def __init__(self, image_path, text_path):
|
|
self.img_path = image_path
|
|
self.txt_path = text_path
|
|
self.morse_text = ""
|
|
self.img = Image.open(self.img_path).convert("RGB")
|
|
|
|
def loadObjects(self):
|
|
self.imagewidth, self.imageheight = self.img.size
|
|
with open(self.txt_path) as x:
|
|
self.raw_text = x.readlines()
|
|
iof.output(self.raw_text, "B")
|
|
for line in self.raw_text:
|
|
for letter in line:
|
|
self.morse_text += (MORSE_DICT[letter.upper()] + " ")
|
|
iof.output(self.morse_text, "B")
|
|
|
|
def convertFunction(self):
|
|
incrementer,x,y = 0,0,0
|
|
for letter in self.morse_text:
|
|
incrementer += 1
|
|
if x < self.imagewidth - 1:
|
|
x += 1
|
|
else:
|
|
y += 1
|
|
x = 0
|
|
match letter:
|
|
case ".":
|
|
self.img.putpixel((x,y), (0, 0, 0))
|
|
case "-":
|
|
self.img.putpixel((x,y), (255, 255, 255))
|
|
case " ":
|
|
continue
|
|
case "|":
|
|
continue
|
|
iof.output(str(incrementer/len(self.morse_text)*100) + "%", "F")
|
|
self.img.save("converted_image.png")
|
|
|
|
class Reader:
|
|
def run(self):
|
|
self.loadObjects()
|
|
self.readFunction()
|
|
self.out = open('output/text.txt', 'a')
|
|
self.out.writelines(self.normal_text)
|
|
|
|
def __init__(self, image_path):
|
|
self.img_path = image_path
|
|
self.normal_text = ""
|
|
self.morse_text = ""
|
|
|
|
def loadObjects(self):
|
|
self.img = Image.open(self.img_path).convert("RGB")
|
|
self.imagewidth, self.imageheight = self.img.size
|
|
|
|
def readFunction(self):
|
|
escaperange = 0
|
|
ended = False
|
|
for y in range(self.imageheight):
|
|
for x in range(self.imagewidth):
|
|
if not ended == True:
|
|
iof.output("At pixel: " + str(x) + "," + str(y) + "\nWith color: " + str(self.img.getpixel((x,y))), "F")
|
|
|
|
match self.img.getpixel((x,y)):
|
|
case (0,0,0):
|
|
iof.output("Found black", "B")
|
|
self.morse_text += "."
|
|
case (255,255,255):
|
|
iof.output("Found white", "B")
|
|
self.morse_text += "-"
|
|
case _:
|
|
if escaperange == 0:
|
|
ii = self.futurecheck(x,y)
|
|
if ii == 2:
|
|
escaperange = 2
|
|
self.morse_text += " | "
|
|
elif ii == 1:
|
|
self.morse_text += " "
|
|
else:
|
|
ended = True
|
|
iof.output("Ended at: " + str(x) + "," + str(y), "B")
|
|
else:
|
|
escaperange -= 1
|
|
iof.output(self.morse_text, "B")
|
|
sequence = ""
|
|
for letter in self.morse_text:
|
|
if letter != " ":
|
|
sequence += letter
|
|
else:
|
|
if letter == "|":
|
|
self.normal_text += " "
|
|
elif letter == " " and sequence != "":
|
|
self.normal_text += ALPH_DICT[sequence]
|
|
sequence = ""
|
|
iof.output(self.normal_text, "F")
|
|
|
|
|
|
def futurecheck(self,x,y):
|
|
endchecker = 0
|
|
a = 0
|
|
b = 0
|
|
while a + b <= 10:
|
|
if x + a < self.imagewidth:
|
|
if self.img.getpixel((x + a, y)) != (0,0,0) and self.img.getpixel((x + a, y)) != (255,255,255):
|
|
endchecker += 1
|
|
iof.output("Endchecker at: " + str(endchecker) + "\nUsing pixel: " + str(self.img.getpixel((x + a, y))) + "\nAt position: " + str(x+a) + "," + str(y), "F")
|
|
a += 1
|
|
else:
|
|
a = 11
|
|
else:
|
|
if self.img.getpixel((b, y + 1)) != (0,0,0) and self.img.getpixel((b, y + 1)) != (255,255,255):
|
|
endchecker += 1
|
|
iof.output("Endchecker at: " + str(endchecker) + "\nUsing pixel: " + str(self.img.getpixel((b, y + 1))) + "\nAt position: " + str(b) + "," + str(y+1), "F")
|
|
b += 1
|
|
else:
|
|
b = 11
|
|
|
|
if endchecker > 9:
|
|
return 10
|
|
if x + 2 <= self.imagewidth:
|
|
iof.output("Using one-line space checking method", "F")
|
|
if self.img.getpixel((x + 1, y)) != (0,0,0) and self.img.getpixel((x + 1, y)) != (255,255,255):
|
|
iof.output("Adding space", "F")
|
|
return 2
|
|
else:
|
|
iof.output("Adding letter separation", "F")
|
|
return 1
|
|
else:
|
|
if self.img.getpixel((0, y+1)) != (0,0,0) and self.img.getpixel((0, y+1)) != (255,255,255):
|
|
iof.output("Adding space", "F")
|
|
return 2
|
|
else:
|
|
iof.output("Adding letter separation", "F")
|
|
return 1
|
|
|
|
|
|
Starter = Main()
|
|
Starter.intro() |