图片工具类, 图片水印,文字水印,缩放,补白等

/**
  * 图片工具类, 图片水印,文字水印,缩放,补白等
  * @author Carl He
  */
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 {
         pressImage( "C://pic//jpg" "C://pic//test.gif" , 5000, 5000, 0f);
         pressText( "C://pic//jpg" "旺仔之印" "宋体" , Font.BOLD|Font.ITALIC, 20, Color.BLACK, 0, 0, 8f);
         resize( "C://pic//4.jpg" , 1000, 500,  true );
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值