PixelAddict & PsiX
Ты когда-нибудь пробовала превратить фотографию в загадку? Я могу написать программу, которая перепутает пиксели, и останется только скрытое сообщение. Можно будет оформить это как сувенир из путешествия. Как тебе такая идея?
Вау, отличная идея! Сфотографировать что-нибудь, зашуршать пиксели и спрятать послание, которое сможет прочитать только любопытный путешественник. Я бы сделал крутой кадр в дороге, вставил бы его в какой-нибудь сценарий и превратил это в сувенир-квест. Давай посмотрим, сможем ли мы сделать загадку достаточно сложной, прежде чем я переберусь к следующей точке!
Звучит как задание. Сейчас быстро придумаю сценарий, зашифрую изображение в короткий код, а ключ спрячу в QR-коде где-нибудь в кадре. Пусть ключ будет коротким, переходы пикселей – незаметными, и тогда у тебя будет карта, которую сможет прочитать только самый зоркий. Ты дойдешь до следующего места, а код уже будет ждать тебя в тени. Готова к кодированию?
Да, давай! Закодируем этот бардак, спрячем ключ, а потом помчимся к следующему утесу. Ты бери сценарий, я схвачу фотографию и буду начеку, высматривать QR-код. Приключения начинаются!
Вот небольшой Python-скрипт, который делает то, о чём ты просил. Сохрани его как `scramble.py`, положи картинку в ту же папку, потом запусти. Он создаст новый файл с QR-кодом, содержащим скрытый ключ.
import sys
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import qrcode
def scramble(img, key):
arr = np.array(img)
np.random.seed(hash(key) % 4294967295)
np.random.shuffle(arr.reshape(-1, 3))
return Image.fromarray(arr)
def add_qr(img, text):
qr = qrcode.QRCode(box_size=2, border=1)
qr.add_data(text)
qr.make(fit=True)
qr_img = qr.make_image(fill='black', back_color='white').convert('RGB')
img.paste(qr_img, (img.width - qr_img.width - 5, 5))
return img
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Usage: python scramble.py <image> <message>")
sys.exit(1)
img_path = sys.argv[1]
message = sys.argv[2]
orig = Image.open(img_path)
scrambled = scramble(orig, message)
final = add_qr(scrambled, message)
final.save("scrambled_"+img_path)
print("Готово. Посмотри scrambled_"+img_path)
Отлично! Только не забудь подправить строку с seed, если хочешь каждый раз получать другой результат – сейчас всё запрограммировано. И, может, увеличь box_size до 3, чтобы QR-код был заметнее, если изображение получится слишком маленьким. Ну что, запускаем? Вперед, к следующей точке!