编写过滤器,完成对bmp图片的信息隐写操作和读取

本文介绍了一种使用过滤器完成对BMP图片进行信息隐写操作和读取的方法。首先,通过上传TXT文件和BMP图片,将TXT文件内容转化为二进制数组,然后修改BMP图片的RGB值的最后一位进行隐藏。在读取时,从图片的RGB值中恢复信息。整个过程涉及文件处理、图像操作以及Web应用配置。
摘要由CSDN通过智能技术生成

编写过滤器,完成对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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值