这次是因为公司的要求,查看图片信息泄露的人是谁,要求在图片上加姓名以及时间水印
所以我们首先需要在图片上添加倾斜的半透明文字水印,再通过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请求将图片链接以及员工名称发送到方法中就可以直接预览图片