惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
J
Java Code Geeks
博客园 - 【当耐特】
宝玉的分享
宝玉的分享
腾讯CDC
D
DataBreaches.Net
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
V
V2EX
F
Fortinet All Blogs
MyScale Blog
MyScale Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
Jina AI
Jina AI
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
A
About on SuperTechFans
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
B
Blog
M
MIT News - Artificial intelligence
N
Netflix TechBlog - Medium

博客园 - 坐看云起

强制卸载 Visual studio 2017 Pycharm 增加 run 控制台缓冲行数 Ubuntu 各版本代号简介 Ubuntu Desktop 15.10 自带桌面共享问题修复 Zend Studio 中导出 PHP 语法颜色配置 webkit中获取用户选择文本和编程设定选择文本 [转]为什么不能打断程序员? 儿子不背乘法口诀肿么办 大家都可以拖动的web小方块——Node.js摸石头系列之七 实现使用Websocket通讯的聊天室——Node.js摸石头系列之六 WebSocket 一场Web 通讯革命悄然来临——Node.js摸石头系列之五 完成静态服务器——Node.js摸石头系列之四 完成HelloWorld——Node.js摸石头系列三 Node.js摸石头系列目录 架一个HTTP服务——Node.js摸石头系列之二 Node.js 的安装和控制台命令——Node.js摸石头系列之一 BookMarklet:瑞士军刀你用了吗? Aptana studio 3 修改配色方案 推荐引擎与学习
HTML5中使用图片传递密文
坐看云起 · 2016-12-24 · via 博客园 - 坐看云起

上面的两张图片中,你能看出有什么不同吗?

右图使用 html5 canvas api 中的 getImageDataputImageData 函数嵌入了一段文字。

道理很简单,getImageData 函数返回一个 ImageData 对象,该对象包含三个属性: data 是一个字节数组,每 4 字节表示图片中一个像素,按照“ 红、绿、蓝、透明度”的顺序依次排列,width 表示图片宽度,height 图片高度。
只要将我们的密文转成 0 - 255 之间的数值,存入数组,然后再显示成图片。读取时反向读取并转码就可以了。


<!DOCTYPE html>
<html >
    <head>
        <meta charset="utf-8">
        <title>Hello...</title>
        <style type="text/css">
        </style>
    </head>
    <body>
        <canvas id="canvas1"></canvas>
        <script> 
            var pic;
            var canvas;
            var ctx;
            var imgData;
            var data;
            
            window.onload = function(){
                canvas = document.getElementById("canvas1");
                ctx = canvas.getContext("2d");
                
                canvas.width = 400;
                canvas.height = 200;
                
                pic = new Image();
                pic.onload = function(){
                    ctx.drawImage(pic, 0, 0, pic.width, pic.height);
                    imgData = ctx.getImageData(0, 0, pic.width, pic.height);
                    data = imgData.data;

                    // put the secret
                    //var s = encodeURI("we dream and we build.we never give up.we never quit.");
                    var s = encodeURI("女神,约吗?");
                    for(var j=0; j<s.length; j++){
                        data[j*400+3] = 255 - s.charCodeAt(j);
                    }
                    ctx.putImageData(imgData, 130, 0);
                    
                    //get the secret 
                    var dImgData = ctx.getImageData(130, 0, pic.width, pic.height);
                    var dData = dImgData.data;
                    var ds = "";
                    for(var k=3; k<dData.length; k+=400){
                        var t = String.fromCharCode(255 - dData[k]);
                        ds += t;
                    }
                    
                    console.log(decodeURI(ds));
                }
                pic.src = "./img/xixi.jpg";
                
            };
        </script>

    </body>
</html>

注: 示例代码中的密文仅仅是为了测试中文,顺路为男神读者们服务的。