当前位置:首页 > Java技术 > java常用开发工具类之 图片水印,文字水印,缩放,补白工具类

java常用开发工具类之 图片水印,文字水印,缩放,补白工具类

2022年08月06日 10:44:05Java技术6

 

import java.awt.AlphaComposite;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Graphics2D;
 import java.awt.Image;
 import java.awt.geom.AffineTransform;
 import java.awt.image.AffineTransformOp;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 
 import javax.imageio.ImageIO;
 
 /**
  * 图片工具类, 图片水印,文字水印,缩放,补白等
  */
 public final class ImageUtils {
     
     
     /**图片格式:JPG*/
     private static final String PICTRUE_FORMATE_JPG = "jpg";
     
     private ImageUtils(){}
     /**
      * 添加图片水印
      * @param targetImg 目标图片路径,如:C://myPictrue//1.jpg
      * @param waterImg  水印图片路径,如:C://myPictrue//logo.png
      * @param x 水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间
      * @param y 水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间
      * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
 */
     public final static void pressImage(String targetImg, String waterImg, int x, int y, float alpha) {
             try {
                 File file = new File(targetImg);
                 Image image = ImageIO.read(file);
                 int width = image.getWidth(null);
                 int height = image.getHeight(null);
                 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                 Graphics2D g = bufferedImage.createGraphics();
                 g.drawImage(image, 0, 0, width, height, null);
             
                 Image waterImage = ImageIO.read(new File(waterImg));    // 水印文件
                 int width_1 = waterImage.getWidth(null);
                 int height_1 = waterImage.getHeight(null);
                 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
                 
                 int widthDiff = width - width_1;
                 int heightDiff = height - height_1;
                 if(x < 0){
                     x = widthDiff / 2;
                 }else if(x > widthDiff){
                     x = widthDiff;
                 }
                 if(y < 0){
                     y = heightDiff / 2;
                 }else if(y > heightDiff){
                     y = heightDiff;
                 }
                 g.drawImage(waterImage, x, y, width_1, height_1, null); // 水印文件结束
                 g.dispose();
                 ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);
             } catch (IOException e) {
                 e.printStackTrace();
             }
     }
 
     /**
      * 添加文字水印
      * @param targetImg 目标图片路径,如:C://myPictrue//1.jpg
      * @param pressText 水印文字, 如:中国证券网
      * @param fontName 字体名称,    如:宋体
      * @param fontStyle 字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)
      * @param fontSize 字体大小,单位为像素
      * @param color 字体颜色
      * @param x 水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间
      * @param y 水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间
      * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
 */
     public static void pressText(String targetImg, String pressText, String fontName, int fontStyle, int fontSize, Color color, int x, int y, float alpha) {
         try {
             File file = new File(targetImg);
             
             Image image = ImageIO.read(file);
             int width = image.getWidth(null);
             int height = image.getHeight(null);
             BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
             Graphics2D g = bufferedImage.createGraphics();
             g.drawImage(image, 0, 0, width, height, null);
             g.setFont(new Font(fontName, fontStyle, fontSize));
             g.setColor(color);
             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
             
             int width_1 = fontSize * getLength(pressText);
             int height_1 = fontSize;
             int widthDiff = width - width_1;
             int heightDiff = height - height_1;
             if(x < 0){
                 x = widthDiff / 2;
             }else if(x > widthDiff){
                 x = widthDiff;
             }
             if(y < 0){
                 y = heightDiff / 2;
             }else if(y > heightDiff){
                 y = heightDiff;
             }
             
             g.drawString(pressText, x, y + height_1);
             g.dispose();
             ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
     
     /**
      * 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符
      * @param text
      * @return 字符长度,如:text="中国",返回 2;text="test",返回 2;text="中国ABC",返回 4.
 */
     public static int getLength(String text) {
         int textLength = text.length();
         int length = textLength;
         for (int i = 0; i < textLength; i++) {
             if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
                 length++;
             }
         }
         return (length % 2 == 0) ? length / 2 : length / 2 + 1;
     }
 
     /**
      * 图片缩放
      * @param filePath 图片路径
      * @param height 高度
      * @param width 宽度
      * @param bb 比例不对时是否需要补白
 */
     public static void resize(String filePath, int height, int width, boolean bb) {
         try {
             double ratio = 0; //缩放比例    
             File f = new File(filePath);   
             BufferedImage bi = ImageIO.read(f);   
             Image itemp = bi.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH);   
             //计算比例   
             if ((bi.getHeight() > height) || (bi.getWidth() > width)) {   
                 if (bi.getHeight() > bi.getWidth()) {   
                     ratio = (new Integer(height)).doubleValue() / bi.getHeight();   
                 } else {   
                     ratio = (new Integer(width)).doubleValue() / bi.getWidth();   
                 }   
                 AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);   
                 itemp = op.filter(bi, null);   
             }   
             if (bb) {   
                 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   
                 Graphics2D g = image.createGraphics();   
                 g.setColor(Color.white);   
                 g.fillRect(0, 0, width, height);   
                 if (width == itemp.getWidth(null))   
                     g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);   
                 else  
                     g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);   
                 g.dispose();   
                 itemp = image;   
             }
             ImageIO.write((BufferedImage) itemp, "jpg", f);   
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 
     public static void main(String[] args) throws IOException {
       //添加文字水印
       //pressText("D:/1.jpg", "test", "宋体", Font.BOLD, 24, Color.red, 50, 50, 0.3f);
       //图片缩放
       resize("D:/1.jpg", 100, 600, false);
       System.out.println("处理完毕!");
     }
     
 }

 

作者:souvc
来源链接:https://www.cnblogs.com/liuhongfeng/p/4149002.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/18204.html

分享给朋友:

“java常用开发工具类之 图片水印,文字水印,缩放,补白工具类” 的相关文章

Java 常用工具类(21) : 计算百分比,去整数/小数

import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; /** * @Auther: liyue * @Date: 2018/8/31 15:31...

Java的Collection工具类的常用方法

public static <T> void show(List<T> list){ for (T t : list) { System.out.print(t+" "); } }...

java项目常用工具类之http请求工具类

jdk1.8+spring4.3.12 一、问题描述及试用场景: 在项目开发中,经常用调用http接口,下面是封装apache的httpclient工具类。 二、样例代码: package org.egg.utils; im...

209 01 Android 零基础入门  03 Java常用工具类 04 Java集合 05 集合总结 01 集合知识点总结

209 01 Android 零基础入门 03 Java常用工具类 04 Java集合 05 集合总结 01 集合知识点总结

209 01 Android 零基础入门 03 Java常用工具类 04 Java集合 05 集合总结 01 集合知识点总结 本文知识点:集合知识点总结 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进行了截图记录,没有对截图步骤进行详细的文字说明(后面博主时间...

JAVA常用工具类(三) SystemUtils类

常用的函数操作,基于commons-lang-2.5。 1.获取Java Home目录,返回File SystemUtils.getJavaHome() 2.获取Java IO临时目录文件,返回File SystemUtils.getJavaIoTmpD...

JAVA常用的工具类

JAVA常用的工具类

目录 1 集合工具类 1.1 java.util.Collections 1.1.1 基本操作 1.1.2 转换线程安全集合 1.2 org.springframework.util.CollectionUtils 1.3&...

java常用工具类组件 总结

常用组件 json操作: fastjson,jackson,gson md5等:commons-codec 工具集合:guava 数组操作:ArrayUtils(org.apache.commons.lang3.Array...

Java 并发编程(四)常用同步工具类

同步工具类可以使任何一种对象,只要该对象可以根据自身的状态来协调控制线程的控制流。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括:信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)。 闭锁 首先我们来...

java/web开发date日期-String字符串互转工具类

java/web开发date日期-String字符串互转工具类 web开发中最常用的一个工具类,date日期-String字符串转换工具类,直接放在java类文件里面,调用即可。 源码如下: import java.tex...

java的常用包

java的常用包如下: java的核心都在java的包以及其子包下,而java的扩展类都放在javax包以及其子包下。其实这些类就是我们常说以及常用的API。 java语言常用包如下:   1. java.lang 这个包下包含了ja...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。