Вставить текст в PNG - PullRequest
       24

Вставить текст в PNG

4 голосов
/ 26 июля 2010

Я ищу инструмент, который позволил бы мне вставлять информацию в формате json в PNG-файл.

Пока это было довольно тихо.Нужно ли писать самому?

Мне было бы особенно интересно делать это с помощью JavaScript.В изображение извлекаю из холста toDataURL -метод.

Ответы [ 7 ]

5 голосов
/ 26 июля 2010

Если вы хотите встроить текст, вы можете посмотреть на , в частности , что соответствует спецификации PNG . Кажется, немного сложнее.

"легкий" стеганографический метод выглядит немного более простым.

Что может быть лучше для вашей цели, так это создать объект javascript, содержащий данные изображения и данные JSON, а затем просто передать этот объект туда, где он вам нужен.

2 голосов
/ 26 июля 2010

Я совершенно незнаком с Python, однако, если вы можете получить доступ к любой из известных библиотек обработки изображений, это возможно.

Посмотрите здесь для решений ImageMagick <-> Python.


Редактировать

Возможно, вы захотите взглянуть на это сообщение в блоге для получения информации о стеганографии (скрытии информации внутри изображения) и ответвлении библиотеки ImageMagick. Здесь используется C ++, но я уверен, что вы могли бы найти способ включить базовые процессы в Python.

1 голос
/ 23 сентября 2013

Вы можете использовать недавно выпущенную библиотеку JavaScript steganography.js . Взгляните на витрину и документацию для базового использования.
Библиотека использует HTML canvas и встраивает информацию в альфа-канал изображения. В основном вам просто нужно использовать steg.encode(message, image) и передавать JSON-данные (в виде строки) в качестве сообщения, а изображение в качестве dataURL. Чтобы прочитать эту информацию из изображения, используйте steg.decode(image) и снова передайте изображение как dataURL.

После повторного чтения информации вы получаете JSON-данные в виде строки, поэтому вам придется снова анализировать их в объект JavaScript. Так что, кроме разбора строки на строку, я надеюсь, что она соответствует вашим требованиям.

1 голос
/ 31 октября 2010

Копирование другого моего ответа на другой вопрос:

Вот старый не слишком необычный модуль, который я однажды сделал для друга (код Python 2.x):

код

from __future__ import division

import math, os, array, random
import itertools as it
import Image as I
import sys

def encode(txtfn, imgfn):
    with open(txtfn, "rb") as ifp:
        txtdata= ifp.read()
    txtdata= txtdata.encode('zip')

    img= I.open(imgfn).convert("RGB")
    pixelcount= img.size[0]*img.size[1]
##  sys.stderr.write("image %dx%d\n" % img.size)

    factor= len(txtdata) / pixelcount
    width= int(math.ceil(img.size[0]*factor**.5))
    height= int(math.ceil(img.size[1]*factor**.5))

    pixelcount= width * height
    if pixelcount < len(txtdata): # just a sanity check
        sys.stderr.write("phase 2, %d bytes in %d pixels?\n" % (len(txtdata), pixelcount))
        sys.exit(1)
##  sys.stderr.write("%d bytes in %d pixels (%dx%d)\n" % (len(txtdata), pixelcount, width, height))
    img= img.resize( (width, height), I.ANTIALIAS)

    txtarr= array.array('B')
    txtarr.fromstring(txtdata)
    txtarr.extend(random.randrange(256) for x in xrange(len(txtdata) - pixelcount))

    newimg= img.copy()
    newimg.putdata([
        (
            r & 0xf8 |(c & 0xe0)>>5,
            g & 0xfc |(c & 0x18)>>3,
            b & 0xf8 |(c & 0x07),
        )
        for (r, g, b), c in it.izip(img.getdata(), txtarr)])
    newimg.save(os.path.splitext(imgfn)[0]+'.png', optimize=1, compression=9)

def decode(imgfn, txtfn):
    img= I.open(imgfn)
    with open(txtfn, 'wb') as ofp:
        arrdata= array.array('B',
            ((r & 0x7) << 5 | (g & 0x3) << 3 | (b & 0x7)
            for r, g, b in img.getdata())).tostring()
        findata= arrdata.decode('zip')
        ofp.write(findata)

if __name__ == "__main__":
    if sys.argv[1] == 'e':
        encode(sys.argv[2], sys.argv[3])
    elif sys.argv[1] == 'd':
        decode(sys.argv[2], sys.argv[3])

алгоритм

Он хранит байт данных на пиксель изображения, используя: 3 младших бита синей полосы, 2 младших бита зеленой и 3 младших бита красной.

функция кодирования: входной текстовый файл сжимается zlib, а размер входного изображения изменяется (с сохранением пропорций), чтобы обеспечить как минимум столько же пикселей, сколько сжатых байтов. * PNG изображение с тем же именем, что и входное изображение (поэтому не используйте имя файла ".png" в качестве ввода, если вы оставляете код как есть :), сохраняется со стеганографическими данными.

функция декодирования: ранее сохраненные zlib-сжатые данные извлекаются из входного изображения и сохраняются без сжатия под предоставленным именем файла.

Я проверил, что старый код все еще выполняется, поэтому вот пример изображения, содержащего стеганографические данные:

contains steganographic data

Вы заметите, что добавленный шум едва заметен.

1 голос
/ 26 июля 2010

Хм, вот частичная реализация libpng в JS: http://www.xarg.org/download/pnglib.js.

0 голосов
/ 24 мая 2014

Почему бы просто не использовать этот инструмент?

http://www.jsclasses.org/package/324-JavaScript-Embed-encoded-text-in-images-using-steganography.html

и здесь на github:

https://github.com/blauharley/LoremImageCryptonator

Это обычный объект, которыйможет использоваться для встраивания текста в каждый цветовой канал (красный, зеленый ...).

При встраивании текста в альфа-канал не должно быть так много шума, как при вставке текста в другие цветовые каналы, поэтому вы не должны видеть никакой разницы до и после вставки текста в изображение.

0 голосов
/ 31 октября 2010

Кто-то уже пытался встроить похожую на Марио платформерную игру в изображение PNG. Использование getImageData является ключом для считывания данных; объект, который возвращает этот метод, дает одномерный массив, содержащий отдельные значения RGBA каждого пикселя.

Обратите внимание, что это не «скрывает» данные в области, которую видит пользователь, но вы, вероятно, могли бы использовать технику, подобную спрайту CSS (или «обрезать» изображение, используя несколько холстов), чтобы показать только часть комбинированного изображение, которое вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...