业务需求:给图片新增水印,并支持浏览器下载导出成zip包。

1、第一反应,通过画笔给图片新增加水印,图片新增水印成功,但是通过IO流导出到浏览器下载的时候中文变成方格,检查了一遍文字格式都是UTF-8的也不知道问题再哪里。

所以这种方法,暂时只支持单一的对图片新增水印功能,不支持IO流的读写输出中文乱码,遇见想通过问题的哪位大佬可以帮答一下。系统是Windows的。

public class waterMarkTest {public static void main(String[] args) {System.out.println("开始水印:");new waterMarkTest().addWatermark("D:/aaa.jpg", "D:/bbb.jpg", "helloword!", "jpg");System.out.println("水印完成。");}/*** @description * @param sourceImgPath 源图片路径* @param tarImgPath 保存的图片路径* @param waterMarkContent 水印内容* @param fileExt 图片格式* @return void*/public void addWatermark(String sourceImgPath, String tarImgPath, String waterMarkContent,String fileExt){Font font = new Font("宋体", Font.BOLD, 24);//水印字体,大小Color markContentColor = Color.white;//水印颜色Integer degree = -45;//设置水印文字的旋转角度float alpha = 1.0f;//设置水印透明度 默认为1.0  值越小颜色越浅OutputStream outImgStream = null;try {File srcImgFile = new File(sourceImgPath);//得到文件Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片int srcImgWidth = srcImg.getWidth(null);//获取图片的宽int srcImgHeight = srcImg.getHeight(null);//获取图片的高// 加水印BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = bufImg.createGraphics();//得到画笔g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);g.setColor(markContentColor); //设置水印颜色g.setFont(font);              //设置字体g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度if (null != degree) {g.rotate(Math.toRadians(degree),(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();// 释放资源// 输出图片  outImgStream = new FileOutputStream(tarImgPath);ImageIO.write(bufImg, fileExt, outImgStream);} catch (Exception e) {e.printStackTrace();e.getMessage();} finally{try {if(outImgStream != null){outImgStream.flush();outImgStream.close();}} catch (Exception e) {e.printStackTrace();e.getMessage();}}}}

这种方法给图片新增水印没问题,但是通过IO流读取图片文件数据时水印中的中文文字会乱码。估计是再IO读取通过画笔添加中文水印的方式不识别,所以中文变成方框。

其实图片已经加成功了,但是IO下载中文变成方框。所以用了第二种方法通过IO先读图片存入二进制流,然后把水印信息加进去,再通过IO下载的时候就不会有中文成方框的问题。

2、方法二,通过io给图片新增水印,得到返回的二进制数据流,可以替换调原文件。

/*** 图片加水印* @param bytes 图片二进制流* @param text 文本* @param extension 扩展名, 如“JPEG”* @return 加水印后的byte数组*/public static byte[] pdfWatermark(byte[] bytes, String text, String extension) {PDFWatermarkProperties pdfWatermarkProperties=new PDFWatermarkProperties();pdfWatermarkProperties.setColor( "144,144,144");pdfWatermarkProperties.setDegree(-45);pdfWatermarkProperties.setFont("宋体");pdfWatermarkProperties.setFontBold(true);pdfWatermarkProperties.setTransparency(0.1f);ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);String ext = extension;
//    if (null == extension) {
//       // 拓展名
//       ext = ImageUtils.getImageFormat(inputStream);
//       inputStream = new ByteArrayInputStream(bytes);
//       if (null == ext) {
//          ext ="jpg";
//       }
//    }int fontSize = 110;int interval = 400;
//    String[] rgb = pdfWatermarkProperties.getColor().split(",");String[] rgb = new String[]{"0","0","0"};// 水印颜色Color color = new Color(Integer.valueOf(rgb[0]),Integer.valueOf(rgb[1]),Integer.valueOf(rgb[2]));try {Image srcImg = ImageIO.read(inputStream);// 原始图宽int srcImgWidth = srcImg.getWidth(null);// 原始图高int srcImgHeight = srcImg.getHeight(null);Font font = null;fontSize = (int)Math.ceil(srcImgWidth*fontSize/(double)2000);if (pdfWatermarkProperties.getFontBold()) {font = new Font(pdfWatermarkProperties.getFont(), Font.BOLD, fontSize);} else {font = new Font(pdfWatermarkProperties.getFont(), Font.PLAIN, fontSize);}// 加水印BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);// 画笔Graphics2D g = bufImg.createGraphics();g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);// 颜色g.setColor(color);// 字体g.setFont(font);// 设置水印文字透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, pdfWatermarkProperties.getTransparency()));g.rotate(Math.toRadians(pdfWatermarkProperties.getDegree()), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);int width = text.length() * fontSize;int radio = (int) (width * 1.5);// 绘制图片位置for (int y = -1 * interval; y <= bufImg.getHeight() + 2 * interval; y = y + interval + fontSize) {for (int x = -5 * width; x <= bufImg.getWidth() + 3 * width; x = x + interval + radio) {g.drawString(text, x, y);}}g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));g.dispose();// 释放资源// 输出图片ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bufImg, ext, os);// 输出图片return os.toByteArray();} catch (Exception e) {logger.error("", e);return new byte[0];}}

得到图片新增水印之后的二进制流数据之后,可以替换掉原来的图片输出。

byte[] watermark = WatermarkImgUtils.pdfWatermark(bytes, photoWatermark + user.getAccountName(), "jpg");
OutputStream out = new FileOutputStream(pathname.substring(0, pathname.indexOf(".")));
out.write(watermark);
out.flush();
System.out.println("download success");
out.close();

给图片添加水印,并支持浏览器下载输出相关推荐

  1. Python实现图片添加水印(支持中文、英文和图片)

    欢迎关注个人公众号 DailyJobOps 阅读大纲 图片水印忽大忽小问题研究 中文水印乱码问题 水印的动态展示 背景 在上次CSDN中发表技术文章的时候,文章中涉及到图片,CSDN会自动上传然后添加 ...

  2. php pdf只能查看不能下载,对于pdf文件不支持浏览器下载如何处理?

    最近在工作中遇到这样一个问题,就是知道pdf文件的下载地址,但是所有浏览器对于pdf文件都是在浏览器中打开,不支持下载,需要用户下载下来.于是就做了一个html页面,把下载地址设为downpdf.ph ...

  3. Springboot apache poi 浏览器下载 excel

    在日常干活中,经常会遇到后端实现下载文件的需求,将自己实现的步骤记录下来,以便以后查看方便或者帮助更多的同学. springboot POST 接口,支持浏览器下载excel文件,具体实现实现: 1. ...

  4. java word格式 导出图表和表格 浏览器下载 支持生成扇形图,条形图等

    1.导入依赖 环境 依赖 Apache的POI.FreeMarker和XDocreport xchart <dependency><groupId>fr.opensagres. ...

  5. js 下载Base64格式数据图片(兼容主流浏览器)

    最近的工作内容和前端有关.需要做一个图片下载的功能,然而后台只提供了byte[]  类型的图片数据,并且返回给前端的是Base64格式图片数据.那么,就遇到了最严重的问题了:浏览器兼容. 展示图片的时 ...

  6. java下载附件给(pdf、pptx、word、excel、图片)添加水印

    java下载附件给(pdf.pptx.word.excel.图片)添加水印 使用组件 poi itext spire.xls ooxml-schemas twelvemonkeys.imageio 等 ...

  7. php 怎么支持中文图片显示,给图片添加水印(支持中文)并生成缩略图_php

    // **************************************** // // 功能:给图片添加水印(支持中文)并生成缩略图 // 参数: $srcFile 图片文件名 // $d ...

  8. 基于asp.net + easyui框架,js实现上传图片之前判断图片格式,同时实现预览,兼容各种浏览器+下载...

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做图片上传的一个前台页面,上传图片功能虽然很简单,但是需要我们学习的地方很多.在上传图片之前验证图片的格式,并同时实现预 ...

  9. Android WebView支持文件下载之调起浏览器下载(Java与Kotlin版)

    使用函数 WebView默认没有开启文件下载的功能,如果想使得WebView能够支持文件下载,就需要给WebView设置下载监听器setDownloadListener,每当有文件需要下载时,就会回调 ...

最新文章

  1. MTD NANDFLASH驱动相关知识介绍
  2. domino大百科常见问题总汇1(转载)
  3. Testing BlogJet
  4. ioc spring 上机案例_Spring的IoC入门案例
  5. scala编程第18章学习笔记——有状态的对象
  6. asp.net mvc 简单文件下载
  7. 2.Shell 编程从入门到精通 --- Shell编程基础
  8. FISCO BCOS PBFT网络优化
  9. EditorUtility.SetDirty 设置已改变
  10. [Unity]腾讯SDK踩坑之路(3)--米大师坑 + MSDK坑 (2)
  11. html5 电子白板 直播,基于HTML5技术的智能终端电子白板软件的设计与实现
  12. 如何跟剛認識的女孩發短信(轉)
  13. fb静态区域_FC 与 FB 与 OB 的区别,时间标记冲突与一致性检查 有详细的步骤...
  14. kvm直通sata_KVM虚拟化win10显卡直通一例
  15. YOLO9000, Better, Faster, Stronger论文翻译——中英文对照
  16. 基于Android的家校互动系统app
  17. 什么叫loopback地址?是怎样用的?
  18. [RK3568 Android11] 教程之使用RKDevInfoWriteTool工具烧录SN和MAC地址等
  19. Peter Meer
  20. php 转换 html code,PHP 将 HTML 代码 转换到 UBB 论坛代码

热门文章

  1. 外贸英语:物流行业术语
  2. tensorflow分类任务——TFRecord读取自己制作的数据集
  3. 人工神经网络的基本原理
  4. C语言 函数返回字符串的方法
  5. FILE c语言的使用
  6. [Skr-Shop]购物车设计之需求分析
  7. Paging 3 分组列表
  8. 英文论文--怎样读懂理论部分
  9. 【树莓派】使用树莓派4B搭建简单的局域网Nas
  10. CSS的动画效果-旋转