时间:2010-07-26 13:29:41

标签: javascript python json text png

7 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

答案 2 :(得分:1)

答案 3 :(得分:1)

在另一个问题中复制我的另一个答案:

这是我曾经为朋友做过的一个旧的不太花哨的模块(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个LSB和红色波段的3个LSB。

编码功能:输入文本文件由zlib压缩,输入图像调整大小(保持比例),以确保至少有与压缩字节一样多的像素。与输入图像同名的 PNG 图像(因此,如果保留代码,请不要使用“.png”文件名作为输入:)保存包含隐写数据。< / p>

解码功能:先前存储的zlib压缩数据从输入图像中提取,并在提供的文件名下保存未压缩。

我验证了旧代码仍在运行,所以这是一个包含隐写数据的示例图片:

contains steganographic data

您会注意到添加的噪音几乎不可见。

答案 4 :(得分:1)

您可以使用最近发布的JavaScript库steganography.js。看看展示和基本用法的文档 该库使用HTML canvas并将信息嵌入图像的Alpha通道中。基本上你只需要使用steg.encode(message, image)并将JSON数据(作为字符串)作为消息传递,将图像作为dataURL传递。要从图像中读取此信息,请使用steg.decode(image)并再次将图像作为dataURL传递。

再次读取信息后,您将JSON数据作为字符串获取,因此您必须再次将其解析为JavaScript对象。因此除了从/到字符串的解析之外,我希望它符合您的要求。

答案 5 :(得分:0)

有人已尝试在PNG图像中embed a Mario-like platformer game。使用getImageData是读取数据的关键;该方法返回的对象给出了一维数组,其中包含每个像素的各个RGBA值。

请注意,这并不会“隐藏”用户看到的区域内的数据,但您可以使用CSS精灵技术(或使用多个画布“裁剪”图像)仅显示合并的部分你想要的形象。

答案 6 :(得分:0)

为什么不使用这个工具?

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

并且在github上:

https://github.com/blauharley/LoremImageCryptonator

这是一个普通的对象,可用于将文本嵌入每个颜色通道(红色,绿色......)。

将文字嵌入到alpha通道时,其噪音不应与在其他颜色通道上嵌入文本一样多,因此在将文本插入图像之前和之后都不应该看到任何差异。