【小聪明】图片消失在另一张图片里
概要
偶然看到一篇文章伪·黑科技】基于像素微调实现的文字隐写术,受此启发,能把文字转成二进制,那么图片像素转成二进制岂不更容易,于是我就写了一个隐藏图片的代码,也就有了这篇随笔。
但是刚写出来不完美,有几点需要改进的地方,现在还没有想通,做此记录,以后有机会再慢慢改进:
- 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
【小聪明】图片消失在另一张图片里相关推荐
- 文件夹内图片消失不见了怎么办?文件夹内图片消失怎样找回来
文件夹内图片消失不见了怎么办?文件夹内图片消失怎样找回来?文件夹内图片消失会给我们带来许多麻烦,而文件夹内的图片消失通常与图片被隐藏和误删有关,这里小编给大家介绍文件夹内图片恢复方法,以下操作均以wi ...
- LaTeX写中文文章的模板 --- 添加中英文摘要,引入图片、参考文献、多张图片并排,去掉日期
LaTeX中文文章新人教程 添加中英文摘要,引入图片.参考文献.多张图片并排,去掉日期 建议道友们安装CTeX,而不是LaTeX. 1.安装好后,打开WinEdt(如下图标志),创建一个新的文档. 2 ...
- html图片要存在哪里,将html中的图片和html保存在一个文件里
html是超文本标记语言,里面显示的图片一般是指向另一个url的,但是,在我使用word的时候,我发现word文件里面是可以包含图片的,而且图片是保存在word文件里面的,这个就比html方便多了,当 ...
- pdf转图片(多页和一张图片)
该方法也是在网上浏览学习的,不过针对自己的业务场景进行了修改, 需要下载jar:icepdf-core-4.3.3.icepdf-viewer-4.3.3 地址如下 icepdf-core-4.3.3 ...
- Google Chrome 打印预览时图片消失问题
最近网站wordpress更新最新版,然后就发现原来的打印功能预览时图片不见了,但是单独打开一个Tab来查看又没有问题,审查一下发现每个img元素,多了个懒加载属性 loading="laz ...
- php图片滑动怎么做,抖音里单张图片平移视频怎么制作?影音制作实现一张图片从左到右滑动视频效果...
今天的影音制作,是实现视频画面中有一张图片从左往右慢慢滑动的视频效果.一张横屏图片要制作成竖视频的时候,要么就会出现图片显示不全的情况,要么显示全了就会出现上下有黑边的情况,基本很难解决这个问题~但是 ...
- html怎样在一张图片里写字,用HTML代码在图片上写字
效果一:文字居中 cellSpacing=0 cellPadding=0 width=410 align=center background=http://bbs.guqu.net/UploadFil ...
- mfc cimage加载显示图片_在微信小程序里实现图片预加载组件
网页中的图片预加载 我们知道在 Web 页面中实现图片的预加载其实很简单,通常的做法是在 JS 中使用 Image 对象即可,代码大致如下 var image = new Image() image. ...
- 图片存放在服务器还是数据库里的解释?
图片一般存放在服务器还是数据库里? 是把路径和文件名存在数据库还是把图片转成二进制存在数据库?一般是哪种方法? 当然是图片存放在服务器上,数据库存路径. 原因: 如果你把图片数据保存于数据库中,那么你 ...
- ecplise插入图片太大_【Excel里插入图片时很大怎么办?我想把他设置成自动适应表格的大小。】excel图片固定大小...
excel插入自适应单元格大小图片 excel入的图片可以设置自适应单元格大小而变化,具体操作如下: 一.使具:excel2010 二.操作步骤: 1.进入excel2010,点击"插入&q ...
最新文章
- tftp:timeout问题解决 - 从Windows传输文件到开发板
- 【转】javascript中的LHS与RHS
- WWF(Windows Workflow Foundation)开发环境的建立。 .NET 技术前瞻,WWF,Windows,Workflow,Foundation...
- Spring学习笔记15--注解Bean
- 《图解密码技术》分组密码(5) 输出反馈OFB模式
- 6463: Tak and Hotels II(倍增)
- mysql 主主切换_mysql 主-主配置中进行切换
- php怎么发ddos包,解决服务器上通过PHP代码DDOS的方法
- js读取excel,xlsx,xls 表格,转成JSON数据
- c#调用labview实现巴特沃斯滤波器
- linux优麒麟iso镜像,国产优麒麟操作系统官方下载
- 可汗学院公开课——统计学学习:12-34
- 你好,Googler!
- 墨羽卿画第二章第5节:另一个世界,腊月廿四
- 对比PAYPAL和国际信用卡支付的流程
- C++ 查重(码蹄集 新手村)
- 2021.11.16【读书笔记】丨宏基因组分析流程
- 水逆的京东,2019还能翻盘吗?
- vue项目接入高德地图点击地图获取经纬度及省市区
- 22/10/08 vue2项目,登录注册路由守卫
热门文章
- linux web目录写入权限命令,Linux下Web目录和文件安全权限设置
- linux clone函数ptid,pthread_create到ret_fast_syscalls 参数和栈的变化
- Zookeeper C API 指南三(回调函数)
- linux 读写大文件内容,linux读写大文件
- windows自动导出oracle数据库,Oracle数据库的自动导出备份脚本(windows环境)
- graphviz安装_离线安装vscode插件,你可能会用到!
- 【渝粤教育】电大中专学前儿童健康教育 (7)作业 题库
- 关于平方根倒数速算法(雷神之锤3,牛B)
- 简析平衡树(四)——FHQ Treap
- DAY37-Python入门学习-进程池与线程池、协程、gevent模块