Здарова, хлопцы. В данной публикации будет более детальный разбор мною написанного кода, которую наконец-то удалось допилить до полного функционала как чистый скрипт.
Сам скрипт представляется как набор 3 ключевых функций: PIXELATION2, PIXELATION и UNPIXELATION. Суть данных функций говорят их имена. Первые 2 функции занимаются созданием на основе текстовых данных пикселей, которые содержат в себе те самые текстовые данные. Потом функция объединяет пиксели в 1 картинку.
Картинка сама по себе делится на 2 линии: первая - текст, вторая - длина истины. Длина истины - это подлинная длина текста в байтах(каждый символ переводятся в байты по сути сразу). И тут действуют 2 закона: закон о кратности, закон о прямоугольности(я все придумал как упрощение дела). Первый закон можно трактовать так: "кол-во байтов должно быть кратно контейнерам(пикселям)", т.е если у нас есть n-ое кол-во байтов данных, то для них нужно выделить n/3 пикселей, чтобы все помещалось, иначе механизм преобразования просто пошлет в далекие края на переделку. Второй закон трактуется так: "пиксели должны размещаться так, чтобы те образовывали прямоугольник". Скажу вкратце - нет прямоугольника - нет картинки(так принято).
На примере 1 функции я расскажу что да как работает.
Картинка сама по себе делится на 2 линии: первая - текст, вторая - длина истины. Длина истины - это подлинная длина текста в байтах(каждый символ переводятся в байты по сути сразу). И тут действуют 2 закона: закон о кратности, закон о прямоугольности(я все придумал как упрощение дела). Первый закон можно трактовать так: "кол-во байтов должно быть кратно контейнерам(пикселям)", т.е если у нас есть n-ое кол-во байтов данных, то для них нужно выделить n/3 пикселей, чтобы все помещалось, иначе механизм преобразования просто пошлет в далекие края на переделку. Второй закон трактуется так: "пиксели должны размещаться так, чтобы те образовывали прямоугольник". Скажу вкратце - нет прямоугольника - нет картинки(так принято).
На примере 1 функции я расскажу что да как работает.
функция пикселизации текста через консоль напрямую:
def PIXELATION2(text):
n, table, line_lenght, stroka, list_all = 0, [], [], [], []
text = text.encode("UTF-8")
while len(text) != n:
table.append(text[n])
n +=1
lenf = len(table)
if len(table) % 3 != 0:
while len(table) % 3 != 0:
table.append(random.randrange(1, 255))
leght_s = len(table) // 3
while lenf > 0:
line_lenght.append(((lenf % 256), 0, 0))
lenf = lenf // 256
for k in range(0, (leght_s - len(line_lenght))):
line_lenght.append((0, random.randrange(1, 255), random.randrange(1, 255)))
for i in range(leght_s):
tiple = (table[i*3], table[i*3+1], table[i*3+2])
stroka.append(tiple)
list_all.append(stroka)
list_all.append(line_lenght)
array = np.array(list_all, dtype=np.uint8)
new_image = Image.fromarray(array)
return new_image.save('new' + str(random.randrange(1, 10000000)) + '.png')
схема такая: вы пишете в консоль текст, потом через цикл while получаем набор байтов 1 списком. Далее этот список гоняем в 2 темы: тема с линией истины и линией текста.
код линии текста:
код линии текста:
линия текста:
## соблюдаем первый и второй законы сразу
if len(table) % 3 != 0:
while len(table) % 3 != 0:
table.append(random.randrange(1, 255))
код линии истины:
длина истины:
leght_s = len(table) // 3 ##подумаем о первом законе немнога
while lenf > 0:
line_lenght.append(((lenf % 256), 0, 0))
lenf = lenf // 256
for k in range(0, (leght_s - len(line_lenght))): ## здесь второй закон живет
line_lenght.append((0, random.randrange(1, 255), random.randrange(1, 255)))
Позже идет конечное действие - создание самой картинки:
создание картинок:
## схемка по созданию картинки
for i in range(leght_s):
tiple = (table[i*3], table[i*3+1], table[i*3+2])
stroka.append(tiple)
list_all.append(stroka)
list_all.append(line_lenght)
array = np.array(list_all, dtype=np.uint8)
new_image = Image.fromarray(array)
return new_image.save('new' + str(random.randrange(1, 10000000)) + '.png')
Далее идем к функции UNPIXELATION. Ее же суть обратная первым функциям: разобрать картинку на байты и преобразовать в текстовый файл.
Первое, что делает функция - это считывание данных с картинки:
Первое, что делает функция - это считывание данных с картинки:
чтение картинки:
im = Image.open(file_name, 'r')
pixel_values = list(im.getdata())
im.close()
Потом поиск 2-х линий:
ищем байты нужные:
for i in range(len(massive)):
massive1.append(massive[i][0])
massive1.append(massive[i][1])
massive1.append(massive[i][2])
for j in range(lenght*2):
if pixel_values[j][1] == 0 and pixel_values[j][2] == 0 and pixel_values[j][0] != 0:
massive_lenghttrue.append(pixel_values[j][0])
Далее идут обратные действия, которые по итогу приводят к конечному действию - преобразование полученных из картинки данных в текст:
вывод:
file_out = open('result' + str(random.randrange(1, 10000000)) + '.txt', 'wb')
MassiveByte = bytearray(massive_tr)
file_out.write(MassiveByte)
file_out.close()
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.