概要

偶然看到一篇文章伪·黑科技】基于像素微调实现的文字隐写术,受此启发,能把文字转成二进制,那么图片像素转成二进制岂不更容易,于是我就写了一个隐藏图片的代码,也就有了这篇随笔。

但是刚写出来不完美,有几点需要改进的地方,现在还没有想通,做此记录,以后有机会再慢慢改进:

  • python 包 matplotlib 保存数组构成的图片时,会自动加个透明层,即不是我想要的 RGB 格式,而是 RGBA 格式。why,why,不得不转向其它包
  • 包存图片格式时,一般的数组有可能格式不对,如果遇到错误,就保存为 unit8 格式

效果图

提示:这是我截的图,不是原图,像素可能不满足要求,做实验可用自己的图片

图 1:要被隐藏的图片

图 2:隐藏之后的图片效果图


代码

基本的原理就是利用二进制微调宿主像素。代码中的解释已经很清楚了,在此不再多述。

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 29 11:47:43 2018@author: zhoukui
"""
import numpy as np
from PIL import Image
import matplotlib.image as mpimgimport sysdef image2Bin(imageFile):image = mpimg.imread(imageFile)imageArr = image.ravel()binList = list((map(bin,imageArr)))for i, item in enumerate(binList):  # 把数字全部转换为 8 位的 0 1 数据 binList[i] = item[2:]  # 把二进制标志 '0b' 去掉binList[i] = '0'*(8 - len(binList[i])) + binList[i]pixes_x, pixes_y, _ = image.shape # 把原始图片像素保存一下binX = bin(pixes_x)[2:]binY = bin(pixes_y)[2:]binList.insert(0,'0'*(16-len(binX)) + binX)binList.insert(1,'0'*(16-len(binY)) + binY)# 前两个 16 位表示的是像素长宽,像素长宽相乘再乘以 3 得到后面 8 位的数目return binList  def showImage(imageArr, imageTitle):im = Image.fromarray(imageArr)im.save(imageTitle)im.show()def oneHide(pix, pixValue):if pix == '0':  # 使图片像素变为偶数if pixValue == 255:pixValue = 244elif pixValue % 2 == 1:pixValue += 1 elif pixValue % 2 == 0:pixValue += 1return pixValue  # 返回去改变这像素值     def hiding(binList, hidingImageFile):image = mpimg.imread(hidingImageFile)#print(image.shape)imageArr = image.ravel()# 每一个像素隐藏一个 0 或者 1# 判断是否藏得下if (len(binList)*8+16 > len(imageArr)):print("藏不下,换一张宿主更大的图片或把要藏的图片调小")else:flag = 0  # 标记藏到哪了# 先藏前两个 16 位的for i in range(2):for j in range(16):imageArr[flag] = oneHide(binList[i][j], imageArr[flag])flag += 1# 然后藏剩下的for _, item in enumerate(binList[2:]): if flag % 8640 == 0:sys.stdout.write('\r complete percent ----->:%.0f%%' % (flag/82976.))                for j in range(8):imageArr[flag] = oneHide(item[j], imageArr[flag])flag += 1sys.stdout.flush()  #print(imageArr[:8])imageArr = imageArr.reshape(image.shape)  #.astype(np.uint8) return imageArr      def imerging(imageFile):image = mpimg.imread(imageFile)  # 这种读取图片直接是 NdarrayimageArr = image.ravel()# 先把隐藏图片的大小解析出来tempList = [str(i % 2) for i in imageArr[:32]] pixesX = int(''.join(tempList[:16]), 2)pixesY = int(''.join(tempList[16:]), 2)#print(pixesX, pixesY)# 把隐藏图片的像素解析出来temp2List = [str(i % 2) for i in imageArr[32 : 32 + pixesX*pixesY*3*8]]tempArr = np.zeros(pixesX*pixesY*3,)for i in range(pixesX*pixesY*3):tempArr[i] = int(''.join(temp2List[8*i:8*(i+1)]), 2)#sys.stdout.flush() tempArr = tempArr.reshape(pixesX, pixesY, 3).astype(np.uint8) # 不加会模糊   showImage(tempArr, "image_after_decreption.bmp") def imageEncre(hidedImageFile, hidingImageFile):# 可视化隐藏前图片#imageArrBefore = mpimg.imread(hidingImageFile)#showImage(imageArrBefore, "image before hiding")# 把要加密的图片转换成 0  1 数字print("加密前准备工作...")binList = image2Bin(hidedImageFile) # 接下来把 0 与 1 藏进另一张图片print("开始加密...")imageArrAfter = hiding(binList, hidingImageFile)#print(imageArrAfter[:8,:,:])showImage(imageArrAfter, "image_after_encreption.bmp")def imageDecre(imageFile):print("解码中...")imerging(imageFile)if __name__ == "__main__":  #imageEncre("hided.jpg", "hiding.jpg") imageDecre("image_after_encreption.bmp")

转载于:https://www.cnblogs.com/zhoukui/p/8687973.html

【小聪明】图片消失在另一张图片里相关推荐

  1. 文件夹内图片消失不见了怎么办?文件夹内图片消失怎样找回来

    文件夹内图片消失不见了怎么办?文件夹内图片消失怎样找回来?文件夹内图片消失会给我们带来许多麻烦,而文件夹内的图片消失通常与图片被隐藏和误删有关,这里小编给大家介绍文件夹内图片恢复方法,以下操作均以wi ...

  2. LaTeX写中文文章的模板 --- 添加中英文摘要,引入图片、参考文献、多张图片并排,去掉日期

    LaTeX中文文章新人教程 添加中英文摘要,引入图片.参考文献.多张图片并排,去掉日期 建议道友们安装CTeX,而不是LaTeX. 1.安装好后,打开WinEdt(如下图标志),创建一个新的文档. 2 ...

  3. html图片要存在哪里,将html中的图片和html保存在一个文件里

    html是超文本标记语言,里面显示的图片一般是指向另一个url的,但是,在我使用word的时候,我发现word文件里面是可以包含图片的,而且图片是保存在word文件里面的,这个就比html方便多了,当 ...

  4. pdf转图片(多页和一张图片)

    该方法也是在网上浏览学习的,不过针对自己的业务场景进行了修改, 需要下载jar:icepdf-core-4.3.3.icepdf-viewer-4.3.3 地址如下 icepdf-core-4.3.3 ...

  5. Google Chrome 打印预览时图片消失问题

    最近网站wordpress更新最新版,然后就发现原来的打印功能预览时图片不见了,但是单独打开一个Tab来查看又没有问题,审查一下发现每个img元素,多了个懒加载属性 loading="laz ...

  6. php图片滑动怎么做,抖音里单张图片平移视频怎么制作?影音制作实现一张图片从左到右滑动视频效果...

    今天的影音制作,是实现视频画面中有一张图片从左往右慢慢滑动的视频效果.一张横屏图片要制作成竖视频的时候,要么就会出现图片显示不全的情况,要么显示全了就会出现上下有黑边的情况,基本很难解决这个问题~但是 ...

  7. html怎样在一张图片里写字,用HTML代码在图片上写字

    效果一:文字居中 cellSpacing=0 cellPadding=0 width=410 align=center background=http://bbs.guqu.net/UploadFil ...

  8. mfc cimage加载显示图片_在微信小程序里实现图片预加载组件

    网页中的图片预加载 我们知道在 Web 页面中实现图片的预加载其实很简单,通常的做法是在 JS 中使用 Image 对象即可,代码大致如下 var image = new Image() image. ...

  9. 图片存放在服务器还是数据库里的解释?

    图片一般存放在服务器还是数据库里? 是把路径和文件名存在数据库还是把图片转成二进制存在数据库?一般是哪种方法? 当然是图片存放在服务器上,数据库存路径. 原因: 如果你把图片数据保存于数据库中,那么你 ...

  10. ecplise插入图片太大_【Excel里插入图片时很大怎么办?我想把他设置成自动适应表格的大小。】excel图片固定大小...

    excel插入自适应单元格大小图片 excel入的图片可以设置自适应单元格大小而变化,具体操作如下: 一.使具:excel2010 二.操作步骤: 1.进入excel2010,点击"插入&q ...

最新文章

  1. tftp:timeout问题解决 - 从Windows传输文件到开发板
  2. 【转】javascript中的LHS与RHS
  3. WWF(Windows Workflow Foundation)开发环境的建立。 .NET 技术前瞻,WWF,Windows,Workflow,Foundation...
  4. Spring学习笔记15--注解Bean
  5. 《图解密码技术》分组密码(5) 输出反馈OFB模式
  6. 6463: Tak and Hotels II(倍增)
  7. mysql 主主切换_mysql 主-主配置中进行切换
  8. php怎么发ddos包,解决服务器上通过PHP代码DDOS的方法
  9. js读取excel,xlsx,xls 表格,转成JSON数据
  10. c#调用labview实现巴特沃斯滤波器
  11. linux优麒麟iso镜像,国产优麒麟操作系统官方下载
  12. 可汗学院公开课——统计学学习:12-34
  13. 你好,Googler!
  14. 墨羽卿画第二章第5节:另一个世界,腊月廿四
  15. 对比PAYPAL和国际信用卡支付的流程
  16. C++ 查重(码蹄集 新手村)
  17. 2021.11.16【读书笔记】丨宏基因组分析流程
  18. 水逆的京东,2019还能翻盘吗?
  19. vue项目接入高德地图点击地图获取经纬度及省市区
  20. 22/10/08 vue2项目,登录注册路由守卫

热门文章

  1. linux web目录写入权限命令,Linux下Web目录和文件安全权限设置
  2. linux clone函数ptid,pthread_create到ret_fast_syscalls 参数和栈的变化
  3. Zookeeper C API 指南三(回调函数)
  4. linux 读写大文件内容,linux读写大文件
  5. windows自动导出oracle数据库,Oracle数据库的自动导出备份脚本(windows环境)
  6. graphviz安装_离线安装vscode插件,你可能会用到!
  7. 【渝粤教育】电大中专学前儿童健康教育 (7)作业 题库
  8. 关于平方根倒数速算法(雷神之锤3,牛B)
  9. 简析平衡树(四)——FHQ Treap
  10. DAY37-Python入门学习-进程池与线程池、协程、gevent模块