编写过滤器,完成对bmp图片的信息隐写操作和读取
上上周老师布置的web作业,我才今天写完,而且写的很艰难(下面是题目信息):
写这道题的思路:
- 首先上传txt文件和bmp文件
- 从input里面获取文件名,分别处理txt文件和image文件
- txt文件就是先获取文件内容转换为byte,再将byte转换为二进制的数组
- 对image文件处理:先获取image图片rgb值,再将txt文件转换的数组的每一位赋值给rgb的red green和blue的值的最后一位,再由新的rgb组成一张新的图片,存储到webContent的image文件夹下,再由MyAPI的类调用而显示出来
- 图片的读取则和隐写相反,先获取rgb里面的每个的最后一位存到数组里面,再将数组由二进制转换为byte,再由byte直接返回到过滤器的response的值
代码块
获取input里面的文件名称:
DiskFileUpload diskFileUpload = new DiskFileUpload();
List<FileItem> list = null;
try {
list = diskFileUpload.parseRequest(httpServletRequest);
} catch (FileUploadException e) {
e.printStackTrace();
}
for(FileItem file : list) {
System.out.println(file..getFieldName())
}
判断为txt文件:
if(file.getFieldName().equals("docField")) {
byte[] bt = file.get();
int len = (bt.length+1)*8;
bit = new byte[len];
for(int i = 0 ; i < bt.length ; i++) {
for(int j = 0 ; j <= 7 ; j++) {
//通过右移将byte数组转换为二进制 先右移再和0x01与得到最后一位 再赋值给二进制数组
bit[ i*8 + j] = (byte)((bt[i]>>(7-j)) & 0x01);
}
}
}
判断为image文件:
else if(file.getFieldName().equals("imageField")) {
InputStream img = file.getInputStream();
BufferedImage image = ImageIO.read(img);
int height = image.getHeight(); //获取图片的高度
int width = image.getWidth();//获取图片宽度
int count = 0; //定义一个数来计数
for(int imgX = 0 ; imgX < width ; imgX++ ) {
for(int imgY = 0 ; imgY < height ; imgY++ ) {
int rgb = image.getRGB(imgX, imgY); //获取image图片的rgb值
Color color = new Color(rgb); //通过rgb值来定义color 再通过color分别获取red,green,blue的值
//再将获取到的值转换为 string类型 方便下面的substring运算
String r1 = Integer.toBinaryString((Integer)color.getRed());
String g1 = Integer.toBinaryString((Integer)color.getGreen());
String b1 = Integer.toBinaryString((Integer)color.getBlue());
//判断count有没有超出二进制数组的最大长度,进行substring运算来将二进制数组bit里面的值直接赋值给red,green和blue
if(count+2<bit.length) {
b1 = b1.substring(0, b1.length() - 1) + String.valueOf(bit[count+2]);
}
if(count+1<bit.length) {
g1 = g1.substring(0, g1.length() - 1) + String.valueOf(bit[count+1]);
}
if(count<bit.length) {
r1 = r1.substring(0, r1.length() - 1) + String.valueOf(bit[count]);
}
//将新的red green 和blue 用Integer.parseInt(red,2)来转换为数字,并组成新的rgb
rgb = new Color(Integer.parseInt(r1, 2),Integer.parseInt(g1, 2),Integer.parseInt(b1, 2)).getRGB();
//将新的rgb重新填入到图片当中
image.setRGB(imgX, imgY, rgb);
//一轮结束后因为 red green blue 用掉了三个值 所以count+3
count = count + 3;
}
}
//for循环结束之后 将新的图片保存到 image文件夹下
//httpServletRequest.getRealPath("image") 是通过image这个名字获取该文件夹的路径
//ImageIO可以直接写入图片
ImageIO.write(image, "bmp", new File(httpServletRequest.getRealPath("image") + "/image.bmp"));
}
判断结果是什么都不是:
else brea