这礼拜,教我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语言)相关推荐

  1. python读取bmp图片_用Python读取bmp文件

    我意识到这是一个老问题,但我自己解决这个问题时发现了这个问题,我想这可能会在将来帮助别人. 实际上很容易将BMP文件读取为二进制数据.当然,这取决于你需要支持的范围有多广,需要支持的角落案例有多少. ...

  2. java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  3. Java随机更换背景图片_利用Java处理图片,更换背景

    这个是网上一个大牛想到的方法,独特的见解,适用于给证件照换背景,即颜色RGB值在一个范围内的图像处理,稍加修改,可以适用于一切需要更换背景的情况,可以利用NetBeans设计一个UI,然后写成一个小程 ...

  4. java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案

    本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...

  5. Java_最不重要位替换(LSB)基于24位BMP图片

    隐写术的一个简单示例 向BMP图片中隐藏一段文字并保存,从保存的图片中提取文字. 原理:把需要隐藏的文本信息转换成二进制字符流,再将其拆分成一个个的0和1,隐藏在像素数据(RGB字节)中,因对RGB的 ...

  6. 纯C++实现24位bmp格式图片的读取和修饰

    问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...

  7. 【学习笔记】简易的24位BMP图片转换成灰度图片

    简易的24位BMP图片转换成灰度图片的C语言实现 使用C语言实现的一个简易的24位BMP图片转换成灰度图片的程序.需要先准备一张24位的BMP图片. 说明 RGB图片转换成灰度图片主要是使用这个公式: ...

  8. c语言读取24位BMP文件并实现翻转90度、180度、270度

    BMP图片格式 BMP图片,是Bitmap(位图)的简称,它是windows显示图片的基本格式.在windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来.各种格式的图片文件也都 ...

  9. c++ 24位bmp格式分析

    问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化.水平翻转.模糊.茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊), ...

  10. c语言读取24位bmp图像,[原创]在TC下显示24位真彩色BMP位图

    [原创]在TC下显示24位真彩色BMP位图 在TC下显示24位BMP 虽然在TC显示24位图像上的速度远远比不上256色的速度快,但是真彩色色彩带给我们的视觉上的冲击是256色远远不能达到的.我们今天 ...

最新文章

  1. 当专业动画师用GAN帮自己“偷懒”,几分钟就完成了几周的工作
  2. C#windows向窗体传递泛型类
  3. 蚂蚁的难题(一) http://acm.nyist.net/JudgeOnline/status.php?pid=744
  4. oschina导出博客获取图片
  5. java开发工程师面试题总结
  6. birt报表与现有系统的集成
  7. (五)springcloud微服务分布式云架构 - 云架构代码结构构建
  8. ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装
  9. 麦克纳姆轮全向移动机器人运动效率分析
  10. 【扯淡】今天看了《写给失眠者的心理学》,下面开始借鉴与脑洞大开
  11. 基于python爬虫的论文标题_Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】...
  12. 程序员必知的Python陷阱与缺陷列表
  13. 极大值极小值搜索设计五子棋
  14. oracle 统计每天新增订单数量
  15. 666RPG(计数dp)
  16. 中线提取算法_一种应用VisualGraph算法提取道路中线的方法与流程
  17. 分布式系统之Quorum机制
  18. HTML基础-02-文本格式化、引文(斜体、粗体、上/下标签、删除、插入、强调、加重、字号、预格式,缩写、文字方向、短引用、长引用、引证)
  19. numpy的narray数组与txt文件的相互转化
  20. python实现金字塔图案

热门文章

  1. W3School JavaScript教程日记
  2. 怎么浏览计算机上的驱动程序,怎么查找和更新驱动程序
  3. 【通信原理 入坑之路】—— 深入理解奈奎斯特第一准则与码间串扰
  4. python散点图获取边界_获取离散点的边界点
  5. 论文查重时的近义词同义词替换清单?
  6. 计算机化分析原理波涛,(波涛)证券期货投资计算机化技术分析原理OCR.pdf
  7. 可道云 docker 群晖_利用群晖NAS同步文献
  8. tomcat session共享问题
  9. PIC单片机汇编指令集合
  10. 实验1:局域网的组建与配置