根据图片链接添加水印并返回IO流,方便直接预览图片

mac2025-02-26  5

这次是因为公司的要求,查看图片信息泄露的人是谁,要求在图片上加姓名以及时间水印

所以我们首先需要在图片上添加倾斜的半透明文字水印,再通过IO流将加完水印的图片返回,这中间可能会发生客户端关闭了图片预览,即不再接收后台数据,后台却依旧在发送数据

接下来直接上代码

public void getCanvasImage(HttpServletResponse response,String imageUrl,String userName)throws IOException { SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(System.currentTimeMillis()); String now =formatter.format(date); now = now.replaceAll("-", "");//将日期的“-”去掉,尽量减少文字长度 String waterMarkContent=userName+now; URL url=new URL(imageUrl); OutputStream out =null; String suffix = null; try { // 获取图片后缀 if(imageUrl.indexOf(".") > -1) { suffix = imageUrl.substring(imageUrl.lastIndexOf(".") + 1); } Image img = ImageIO.read(url); Font font = new Font("宋体", Font.BOLD, 15); Color markContentColor = Color.GRAY; int srcImgWidth = img.getWidth(null);//获取图片的宽 int srcImgHeight = img.getHeight(null);//获取图片的高 // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufImg.createGraphics();//得到画笔 g.drawImage(img, 0, 0, srcImgWidth, srcImgHeight, null); g.setColor(markContentColor); //设置水印颜色 g.setFont(font); //设置字体 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.6f));//设置水印文字透明度 g.rotate(Math.toRadians(-45),(double)bufImg.getWidth(),(double)bufImg.getHeight());//设置水印旋转 JLabel label = new JLabel(waterMarkContent); FontMetrics metrics = label.getFontMetrics(font); int width = metrics.stringWidth(label.getText());//文字水印的宽 int rowsNumber = srcImgHeight/width+srcImgHeight%width;// 图片的高 除以 文字水印的宽 打印的行数(以文字水印的宽为间隔) int columnsNumber = srcImgWidth/width+srcImgWidth%width;//图片的宽 除以 文字水印的宽 每行打印的列数(以文字水印的宽为间隔) //防止图片太小而文字水印太长,所以至少打印一次 if(rowsNumber < 1){ rowsNumber = 1; } if(columnsNumber < 1){ columnsNumber = 1; } for(int j=0;j<rowsNumber;j++){ for(int i=0;i<columnsNumber;i++){ g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);//画出水印,并设置水印位置 } } g.dispose();// 释放资源 // 输出图片 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(baos); ImageIO.write(bufImg, suffix, imageOutputStream); out = response.getOutputStream(); out.write(baos.toByteArray()); out.flush(); } catch (Exception e) { e.printStackTrace(); }finally { out.close(); } } 页面只需要以GET请求将图片链接以及员工名称发送到方法中就可以直接预览图片
最新回复(0)