图片已经上传阿里云,打完文字水印后重新上传,顶替原图片

public void watermark(){// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。String accessId = ossConfig.getAccessId();String accessKey = ossConfig.getAccessKey();// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = ossConfig.getEndpoint();// 填写Bucket名称,例如examplebucket。String bucket = ossConfig.getBucket();// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);//oss中文件名String objectName = "undefined2022/03/31/c9dfebb468440be08b3f9f9d3f281d9.jpg";try{//判断文件是否存在。如果返回值为true,则文件存在,否则存储空间或者文件不存在。boolean found = ossClient.doesObjectExist(bucket, objectName);if(found){List<String> list = new ArrayList<>();list.add("时间:2020");list.add("经度:111");list.add("纬度:23");String sbuff = "png";//打水印和上传,因为我是很多文件处理,所以抽取方法upload(ossClient,bucket,objectName,list,sbuff);}}catch(Exception e){e.printStackTrace();}finally {if (ossClient != null) {ossClient.shutdown();}}
}
/*** * @param ossClient OSSClient实例* @param bucket Bucket名称* @param objectName 文件名称* @param list 文字水印内容* @param sbuff 文件后缀名* @throws Exception*/
public void upload(OSS ossClient, String bucket, String objectName,List<String> list, String sbuff) throws Exception{try {// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。OSSObject ossObject = ossClient.getObject(bucket, objectName);//获取文件流,转成ImageImage img = ImageIO.read(ossObject.getObjectContent());//图片打完水印再转为文件流,然后重新上传到阿里云InputStream inputStream = ImgUtil.addWorkMarkUpperLeftToInputStreamFile(img, list, sbuff);// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, objectName, inputStream);// ossObject对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。// 上传文件。ossClient.putObject(putObjectRequest);ossObject.close();} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (Throwable ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());}
}

打水印方法

// 水印文字颜色
private static Color color = new Color(255, 255, 255);/*** 单个字符长度** @Param [c, g]* @Author: Smily* @Date: 2020/9/9 14:20*/public static int getCharLen(char c, Graphics2D g) {return g.getFontMetrics(g.getFont()).charWidth(c);}/*** * @param img 图片* @param logoText 文字水印内容* @param suffix 图片后缀名* @return* @throws IOException*/public static InputStream addWorkMarkUpperLeftToInputStreamFile(Image img, List<String> logoText, String suffix) throws IOException {//获取图片大小int width = img.getWidth(null);int height = img.getHeight(null);//通过原图计算出字体大小int FONT_SIZE = width / 27;//设置字体Font font = new Font("宋体", Font.BOLD, FONT_SIZE);//画图,获取与原来图片大小一样的画布BufferedImage bufImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);// 得到画笔Graphics2D g = bufImg.createGraphics();// 对线段的锯齿状边缘处理g.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);//水印图片的坐标点g.drawImage(img, 0, 0, width, height, null);// 设置水印文字颜色g.setColor (color);// 设置水印文字Fontg.setFont (font);// 设置水印文字透明度g.setComposite(AlphaComposite.getInstance (AlphaComposite.SRC_ATOP, 0.8f));int x,y;//水印文字x轴原点,水印文字y轴原点//添加多行文字水印,水印文字也在图片左上角for (int i = 0;i < logoText.size();i++){if (!logoText.get(i).contains("地点")){x = 15;y = (i + 2) * FONT_SIZE;g.drawString (logoText.get(i), x, y);}else {//如果包含地址信息,文字可能超过图片宽度,这时需要换行操作(注意:地址信息一定要在logoText数组的最后一个)x = 15;y = (i + 2) * FONT_SIZE;int tempCharLen = 0;//单字符长度int tempLineLen = 0;//单行字符总长度StringBuffer sb = new StringBuffer();for (int j = 0; j < logoText.get(i).length(); j++) {char tempChar = logoText.get(i).charAt(j);tempCharLen = getCharLen(tempChar, g);tempLineLen += tempCharLen;//判断长度时,将照片宽度减少一个字体的长度if (tempLineLen >= width - tempCharLen) {//长度已经满一行,进行文字叠加g.drawString(sb.toString(), x, y);//清空内容,重新赋值追加sb.delete(0, sb.length());int k = (i + 2);k++;y = k * FONT_SIZE;tempLineLen = 0;}sb.append(tempChar);//追加字符}//最后叠加余下的文字g.drawString(sb.toString(), x, y);}}g.dispose();ByteArrayOutputStream bs = new ByteArrayOutputStream();ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);ImageIO.write(bufImg, suffix, imOut);InputStream is = new ByteArrayInputStream(bs.toByteArray());//返回加了水印的上传对象return is;}

Java 阿里云图片添加水印相关推荐

  1. Java 阿里云实人认证

    阿里云实人认证 java 后台代码 前端请求后台后台返回token和自己创建的ticketId给前端 @PostMapping("/AliAuthen")public Result ...

  2. 阿里云图像搜索的尝试

    阿里云图像搜索 官方文档 什么是图像搜索 引用阿里官方文档的话: 图像搜索服务 (Image Search)是以深度学习和大规模机器学习技术为核心,通过图像识别和搜索功能,实现以图搜图的智能图像搜索产 ...

  3. 阿里云图数据库GDB揭秘

    作者 泽贤kevin 背景 如果你关注过db-engines.com,你很可能会发现有一种类别的数据库在最近几年正以火箭般的速度迅速流行起来,那就是Graph DBMS.阿里云于2019年3月重磅发布 ...

  4. 关于picgo中阿里云图床的设置

    关于picgo中阿里云图床的设置 1.登录阿里云 阿里云-上云就上阿里云 (aliyun.com) 点击控制台 点击三道杠 看到了吗? 点击常用入口这儿 点击查看 建议保存到自己的密码仓库里,以后复制 ...

  5. 在Java生成的html页面加水印,Java在Excel中添加水印的实现(单一水印、平铺水印)...

    在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...

  6. js优化阿里云图片加载(二)

    导语:上篇js优化阿里云图片加载中,总结了一种优化的方法,但是每个实现图片缓存的界面都需要注入相关代码,因此考虑是不是有另外一种方式. 优化后的方案:定义一个全局的缓存池来缓存真实路径. 纠结的点:在 ...

  7. js优化阿里云图片加载(一)

    获取阿里云图片的过程 服务器返回图片地址--请求服务器返回图片真实地址--获取图片 目前遇到的问题 重复进行1的过程影响性能,实现图片加速加载. 在实际开发中的表现 ·滑动列表时滑出去的item再次显 ...

  8. 阿里云图数据库GDB V3引擎发布,加速开启“图智”未来

    简介:无论是学术界还是产业界,都对图数据库有比较高的预期.Gartner发布的<2021年十大数据和分析技术趋势>中提到:"到2025年图技术在数据和分析创新中的占比将从2021 ...

  9. java阿里云短信服务开通验证码功能实现(1)

    java阿里云短信验证码功能实现篇(一) 最近有朋友咨询java短信验证码,系统注册登录,修改密码时使用,作为小白的我也是第一次搞这个,若有不好之处,忘见谅,废话不多说,我将写两篇文章来说明如何开通短 ...

最新文章

  1. Eclipse-Java代码规范和质量检查插件-阿里编码规约
  2. hdu4685 最大匹配可能性
  3. Ios之label自适应里面的文字,自动调整宽度和高度的
  4. 解决jmeter响应中文乱码及解码
  5. mac php7 mysql.so_mac下安装php7详解
  6. 数据结构-冒泡排序最优代码(C语言)
  7. sql server 2008学习8 sql server存储和索引结构
  8. B 树、B+ 树、B* 树
  9. tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册
  10. 限流中间件IpRateLimitMiddleware的使用
  11. apk去除签名验证工具安卓版_App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!...
  12. MapReduce运行机制
  13. ccf推荐期刊和会议目录_重磅快讯:大数据入选CCF推荐中文科技期刊目录!
  14. Java会走向晦暗吗?Kotlin会取而代之吗
  15. 你们骂我骂的舒服么?
  16. UIImageView的animationImages动画
  17. Orchard Core 使用工作流处理页面提交
  18. 【图像分割】基于matlab随机游走算法图像分割【含Matlab源码 149期】
  19. Photoshop CC2019安装教程
  20. 光耦合器的工作原理和作用

热门文章

  1. Java中的statis用法
  2. latex参考文献居中_latex参考文献常见问题
  3. 科学计算基础软件包NumPy入门讲座(5):常用函数
  4. 【数值分析】Jacobi、Seidel和Sor迭代法求解线性方程组(附matlab代码)
  5. mysql utf8mb4 错_MYSQL保存特殊字符失败,用编码utf8mb4解决错误 Incorrect string value ...解决方法...
  6. MySQL数据库——常用数据库大汇总(附带优缺点)
  7. 【洛谷P1903】数颜色
  8. 盘一盘那些提效/创意的宝藏网站
  9. 离散数学中 集合、关系、群 的证明方法(英文证明附例题)
  10. Simplicity Studio V5 建立一个空工程后如何添加外设驱动