经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
JavaScript压缩并加密图片的方法你了解吗
来源:jb51  时间:2022/3/7 18:38:44  对本文有异议

一、压缩图片

压缩原理:

将图片读入canvas,并使用canvas的toDataURL方法将图片base64化,在此过程中,可以设定quality值,即图片质量值,值为0.1到1之间,值越小,压缩度越高。

完整代码:

  1. <body>
  2. <script src="jquery-3.5.1.min.js"></script>
  3. <input id="file" type="file" capture="microphone" accept="image/*">
  4.  
  5. 压缩后的图片:<span id="sz"></span>
  6.  
  7. <img id="pic" >
  8. <script>
  9. $("#file").change(function(){undefined
  10. var m_this = this;
  11. cutImageBase64(m_this,null,900,0.7);
  12. })
  13. function cutImageBase64(m_this,id,wid,quality) {undefined
  14. var file = m_this.files[0];
  15. var URL = window.URL || window.webkitURL;
  16. var blob = URL.createObjectURL(file);
  17. var base64;
  18. var img = new Image();
  19. img.src = blob;
  20. img.onload = function() {undefined
  21. var that = this;
  22. //生成比例
  23. var w = that.width,
  24. h = that.height,
  25. scale = w / h;
  26. w = wid || w;
  27. h = w / scale;
  28. //生成canvas
  29. var canvas = document.createElement('canvas');
  30. var ctx = canvas.getContext('2d');
  31. $(canvas).attr({undefined
  32. width: w,
  33. height: h
  34. });
  35. ctx.drawImage(that, 0, 0, w, h);
  36. // 生成base64
  37. base64 = canvas.toDataURL('image/jpeg', quality || 0.9);
  38. document.getElementById("pic").src=base64;
  39. document.getElementById("sz").innerHTML = parseInt(base64.length/2014,0) + "kb";
  40. };
  41. }
  42. </script>
  43. </body>

运行效果:

压缩率

上图中可以看到,压缩后图片的大小是28KB,而原始的文件大小是400多KB:

可见,压缩效果还是非常不错的。

二、加密图片

前面所述的图片压缩,是很实用的技术,接下来才是本文重点,展示一个奇淫技巧:图片加密。

之所以即讲压缩压缩,又谈图片加密,是因为图片加密是于前面压缩技术的基础上完成的。

上面的代码中,toDataURL产生的是图片的base64编码。

Base64编码必须是完整且正确才能正常显示图片。

而只需对此编码做小小修改,哪怕仅是改动一个字符,也会让图片无法正常显示。

那么,程序中给编码某个位置增加一个字符,以达到破坏正确编码进而实现加密的效果:

运行效果,输出加密后的base64编码:

测试一下:

效果如下,图片无法正常显示。

那么,接下来将实现这样的效果:

在网页中,用img的src引入加密的base64字符,此时图片是不能显示的。然后,可以输入密码,当密码正确时,解密base64字符,让图片正常显示。

输入密码:

密码正确,解密并显示图片:

源码:

  1. <script>
  2. function jm(){undefined
  3. var pass = prompt('请输入口令','');
  4. if (pass != "1"+"2"+"3"){undefined
  5. alert("口令错误。");
  6. }
  7. else{undefined
  8. var base64_2 = document.getElementById("txt").value.toString();
  9. //解密
  10. var base64_3 = base64_2.substring(0,26) + base64_2.substring(27,base64_2.length);
  11. document.getElementById("pic").src=base64_3;
  12. document.getElementById("bt").style.display = "none";
  13. }
  14. }
  15. </script>

网页中还有另外几个元素:

input中用于存放加密的base64编码,即上文中的js代码功能所生成并加密的内容;

img用于显示解密后的图片;还有一个按钮,点击时调用解密函数。

可能有人已经发现:虽然图片编码经过了加密,而且增加了口令保护,但是只要查看网页源码,就可以知道口令,这样完全没有起到加密的效果。

到目前为止,确实存在这个问题。所以,还要更进一步:

口令可以被看到,是因为javascript代码透明,那么,就要对解密的js代码加密了,加密后,口令将不可见。

JShaman对JS代码进行混淆加密:

并在JShaman的配置中勾选择“字符串加密”:

加密后的代码将完全找不到之前的口令字符:

这样就实现了完整的图片加密:将图片加密存放到了单独的html中,可以方便的携带、存储、传递。而内容是加密的、口令也是加密的。只有知道口令的人,才能看到图片。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!   

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号