【Java】图片画框、截图

        String path = "D:\\Downloads\\777.jpg";
        String pos = "100_100_100_100";
        String [] posArr = pos.split("_");
        Integer[] intArray = Convert.toIntArray(posArr);

        File file = new File(path);
        BufferedImage image = ImageIO.read(file);
        Graphics g = image.getGraphics();
        // 获取 Graphics 对象并强制转换为 Graphics2D 对象
        Graphics2D g2d = (Graphics2D) g;
        // 设置线条粗细为 2f
        g2d.setStroke(new BasicStroke(4f));
        g.setColor(Color.GREEN);//画笔颜色
        g.drawRect(intArray[0],intArray[1],intArray[2],intArray[3]);//矩形框(原点x坐标,原点y坐标,矩形的长,矩形的宽)
        //g.dispose();
        
        //方法1.生成图片-压缩
        FileOutputStream out1 = new FileOutputStream(file.getParentFile().getAbsolutePath() + File.separator + "777_new1.jpg");//输出图片的地址
        // 此处直接write会导致图片被压缩处理,失真
        ImageIO.write(image, "jpeg", out1);


        //方法2.生成图片-不压缩
        // 所以经过以下处理,可以调整相应的参数,甚至可以生成大于原图的图片
        Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
        if (iter.hasNext()) {
            ImageWriter writer = iter.next();
            ImageWriteParam param = writer.getDefaultWriteParam();

            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            // 该参数在0.92~0.93左右是最接近原图大小的,最大是1
            param.setCompressionQuality(1f);
            FileImageOutputStream out = new FileImageOutputStream(new File(
                    file.getParentFile().getAbsolutePath() + File.separator + "777_new2.jpg"));
            writer.setOutput(out);
            // writer.write(bi);
            writer.write(null, new IIOImage(image, null, null), param);
            out.close();
            writer.dispose();
        }
        //方法3.生成图片-不压缩
        FileOutputStream out = new FileOutputStream(file.getParentFile().getAbsolutePath() + File.separator + "777_new3.jpg");//目标路径
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        JPEGEncodeParam param=encoder.getDefaultJPEGEncodeParam(image);//imgBuff 添加水印后的图片
        param.setQuality(1, true);//设置质量
        encoder.encode(image, param);
        out.close();

        //截图
        int width = image.getWidth();
        int height = image.getHeight();
        if(width<intArray[0]){
            return;
        }
        if(height<intArray[1]){
            return;
        }

        //参数依次为,截取起点的x坐标,y坐标,截取宽度,截取高度
        BufferedImage pic2 = image.getSubimage(intArray[0],intArray[1],intArray[2],intArray[3]);
        //将截取的子图另行存储
        File desImage = new File(file.getParentFile().getAbsolutePath() + File.separator + "777_screenshot.jpg");
        ImageIO.write(pic2, "jpeg", desImage);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值