Java生成bmp图片_利用24位BMP图实现信息隐写(java语言)
这礼拜,教我RESTful框架的老师布置了一份有趣的作业。如下图
分析**
需求极简单。老师提供了一个txt文档,一个bmp图片。需要将txt文档信息隐写在bmp图片中,并生成一张新图片。但这张图片用肉眼是看不出来与原图有什么差别的。
一开始解决这个问题确实有些困难。但看完老师提供的原理说明,思路如泉涌。这里限于篇幅,详细原理说明将会在本文最下方提供下载链接。
2.代码实现
具体操作还涉及文件上传等知识,这里只给出实现隐写的代码。
思路:
1.获取隐写文件的字节信息,并转化成二进制bit值;
2.将获取载体图片的像素值,并按R、G、B分量展开;
3.将bit值依次填入R、G、B分量的最低位。
4.保存新生成的图片。
Steganalysis类
(1)成员变量
//需要隐写的文件路径
private String sourceFilePath;
//载体bmp的文件路径
private String bmpFilePath;
(2)成员方法
(a)datasourceToBMP()方法
//将信息隐写在图片中,并保存为新图片
public void datasourceToBMP(String newbmpFilePath) {
BufferedImage image = this.getBufferedImage();
//当前像素点坐标
int curX,curY;
//计数器
int count = 0;
try {
int[] bitContainer = this.getBit();
//比较隐写信息和载体的大小,如果大于隐写失败
if(bitContainer.length > image.getWidth()*image.getHeight()*3) {
System.out.println("隐写信息过大");
return;
}
//先行后列
for(curY=0;curY
for(curX=0;curX
//获取像素值
int rgb = image.getRGB(curX, curY);
//当前像素值分量
int iRgb = 0;
//分解像素值
int R =(rgb & 0xff0000 ) >> 16 ;
int G= (rgb & 0xff00 ) >> 8 ;
int B= (rgb & 0xff );
//判断信息是否隐写完毕
if(count >= bitContainer.length) {
//将隐写文件的字节大小作为文件名
this.saveToBmp(image, newbmpFilePath + bitContainer.length/8 + ".bmp");
return;
}
//将隐写文件位信息放入像素分量最低位
while(true) {
if(count >= bitContainer.length) {
break;
}
switch (iRgb) {
case 0:
R = this.swapBit(R, bitContainer[count]);
break;
case 1:
G = this.swapBit(G, bitContainer[count]);
break;
case 2:
B = this.swapBit(B, bitContainer[count]);
break;
default:
break;
}
if(iRgb ==2 ) {
break;
}
count++;
iRgb++;
}
//重组rgb像素值
rgb = (R << 16) | (G << 8) | B;
//重设rgb像素值
image.setRGB(curX, curY, rgb);
}
}
} catch (IOException e) {
}
}
以下方法都是datasourceToBMP()方法内调用的方法。
(b)getBufferedImage()方法
//将图片图片转换为可操作对象
public BufferedImage getBufferedImage() {
BufferedImage image = null;
try {
image = ImageIO.read(new FileInputStream(this.bmpFilePath));
} catch (FileNotFoundException e) {
System.out.println("载体图片未找到");
} catch (IOException e) {
System.out.println("获取流失败");
}
return image;
}
(c)getBit()方法
/*获取文件信息 并将信息以二进制形式存储 */
public int[] getBit() throws IOException {
int[] bitContainer = null;
try {
FileInputStream fileInputStream = new FileInputStream(this.sourceFilePath);
//获取文件字节大小
int bytesize = fileInputStream.available();
//创建存储bit的容器
bitContainer = new int[bytesize * 8];
//计数器
int count = 0;
for(int i=0; i
//获取字节值
int curbyte = fileInputStream.read();
//从低到高依次获取bit
for(int j=0; j<8; j++) {
//获取当前bit
bitContainer[count] = (curbyte & 1);
//右移一位
curbyte >>= 1;
count++;
}
}
} catch (FileNotFoundException e) {
System.out.println("读取隐写文件失败");
}
return bitContainer;
}
(d)swapBit()方法
//bit值(0或1)放在old的最低位
private int swapBit(int old,int bit) {
old = (old & 0xFE);
old |= bit;
return old;
}
(e)saveToBmp()方法
//将图片保存为bmp格式
private void saveToBmp(BufferedImage image,String newbmpFilePath) {
Iterator writers = ImageIO.getImageWritersByFormatName("bmp");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream imageOutputStream = null;
try {
imageOutputStream = ImageIO.createImageOutputStream(new FileOutputStream(new File(newbmpFilePath)));
} catch (IOException ioe) {
}
writer.setOutput(imageOutputStream);
try {
writer.write(image);
} catch (IOException e) {
}
}
源码及相关原理、素材下载链接
用Tomcat启用服务后:
1.访问:localhost:8080/steganalysis进入文件上传界面;
2.访问:localhost:8080/steganalysis/a/readImage?fileMainName=197024查看读取隐写的信息
Java生成bmp图片_利用24位BMP图实现信息隐写(java语言)相关推荐
- python读取bmp图片_用Python读取bmp文件
我意识到这是一个老问题,但我自己解决这个问题时发现了这个问题,我想这可能会在将来帮助别人. 实际上很容易将BMP文件读取为二进制数据.当然,这取决于你需要支持的范围有多广,需要支持的角落案例有多少. ...
- java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片
一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...
- Java随机更换背景图片_利用Java处理图片,更换背景
这个是网上一个大牛想到的方法,独特的见解,适用于给证件照换背景,即颜色RGB值在一个范围内的图像处理,稍加修改,可以适用于一切需要更换背景的情况,可以利用NetBeans设计一个UI,然后写成一个小程 ...
- java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案
本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...
- Java_最不重要位替换(LSB)基于24位BMP图片
隐写术的一个简单示例 向BMP图片中隐藏一段文字并保存,从保存的图片中提取文字. 原理:把需要隐藏的文本信息转换成二进制字符流,再将其拆分成一个个的0和1,隐藏在像素数据(RGB字节)中,因对RGB的 ...
- 纯C++实现24位bmp格式图片的读取和修饰
问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...
- 【学习笔记】简易的24位BMP图片转换成灰度图片
简易的24位BMP图片转换成灰度图片的C语言实现 使用C语言实现的一个简易的24位BMP图片转换成灰度图片的程序.需要先准备一张24位的BMP图片. 说明 RGB图片转换成灰度图片主要是使用这个公式: ...
- c语言读取24位BMP文件并实现翻转90度、180度、270度
BMP图片格式 BMP图片,是Bitmap(位图)的简称,它是windows显示图片的基本格式.在windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来.各种格式的图片文件也都 ...
- c++ 24位bmp格式分析
问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...
- c语言读取24位bmp图像,[原创]在TC下显示24位真彩色BMP位图
[原创]在TC下显示24位真彩色BMP位图 在TC下显示24位BMP 虽然在TC显示24位图像上的速度远远比不上256色的速度快,但是真彩色色彩带给我们的视觉上的冲击是256色远远不能达到的.我们今天 ...
最新文章
- 当专业动画师用GAN帮自己“偷懒”,几分钟就完成了几周的工作
- C#windows向窗体传递泛型类
- 蚂蚁的难题(一) http://acm.nyist.net/JudgeOnline/status.php?pid=744
- oschina导出博客获取图片
- java开发工程师面试题总结
- birt报表与现有系统的集成
- (五)springcloud微服务分布式云架构 - 云架构代码结构构建
- ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装
- 麦克纳姆轮全向移动机器人运动效率分析
- 【扯淡】今天看了《写给失眠者的心理学》,下面开始借鉴与脑洞大开
- 基于python爬虫的论文标题_Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】...
- 程序员必知的Python陷阱与缺陷列表
- 极大值极小值搜索设计五子棋
- oracle 统计每天新增订单数量
- 666RPG(计数dp)
- 中线提取算法_一种应用VisualGraph算法提取道路中线的方法与流程
- 分布式系统之Quorum机制
- HTML基础-02-文本格式化、引文(斜体、粗体、上/下标签、删除、插入、强调、加重、字号、预格式,缩写、文字方向、短引用、长引用、引证)
- numpy的narray数组与txt文件的相互转化
- python实现金字塔图案