`
qq396151722
  • 浏览: 12149 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

JAVA图片水印、缩放

阅读更多

package com.hmw.picMark;
 
 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;
 
 /**
  * 图片工具类, 图片水印,文字水印,缩放,补白等
  * @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);
     }
 }
 
分享到:
评论

相关推荐

    java 图片水印 改变图片大小

    总结来说,Java提供了丰富的API来处理图片水印和大小改变,而Struts2则提供了强大的Web开发支持。结合这两者,我们可以构建出高效、灵活的图片处理服务。理解并熟练掌握这些技术,对于提升Java Web开发能力大有裨益...

    java高清图片缩放、压缩、切割、水印源码例子

    高清缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等 功能非常强大,并且很清晰,请给好评:)

    java处理图片大小等比例缩放,自定义修改图片大小,截取,水印

    在压缩包中的"java图片大小转换"文件中,很可能包含了实现这些功能的示例代码和使用说明,可以参考学习以加深理解。在实际开发中,我们还可以借助第三方库如`ImageMagick`、`Java Advanced Imaging (JAI)`或`JavaFX`...

    java 图片缩放、加水印

    图片操作类源代码,该类主要用于给图片进行缩放、加水印和得到图片的高、宽及类型。 具体操作请自己参照方法说明自己测试改写。

    java图片处理 文字水印 图片水印 缩放 补白

    第二种是添加图片水印和文字水印两种方法,水印图片可以是GIF,PNG透明的文件,我一般采用的是PNG的,因为它的质量和GIF相比要高一些; 适用人群:Java开发者 使用场景:版权信息标注 目标:可以直接拿来用

    java 水印(水印适应图片大小,但个别图片太小不支持)

    本知识点主要探讨如何在Java中实现自适应图片大小的水印功能,以及遇到图片过小时的处理策略。 首先,我们需要理解水印的基本概念。水印是在图像或文档上添加的一种视觉标记,它可以是文字、图像或者图形,用于表明...

    java实现图片缩放

    这是个工具类,可以实现图片的等比缩放,坑根据图片百分比,或者固定尺寸等进行缩放,还可以给图片增加水印,很好用

    JAVA图片或文字水印以及图片缩放

    包含了一些java对图片操作处理的方法: 1.给图片添加图片水印 2.给图片添加文字水印 3.图片缩放 *主方法测试代码简单易懂

    基于Java给图片添加文字或图片水印

    在Java编程环境中,给图片添加文字或图片水印是一项常见的图像处理任务,广泛应用于版权保护、品牌宣传等领域。本项目“基于Java给图片添加文字或图片水印”旨在教授如何利用Java实现这一功能,适用于大学生的课程...

    Java盲水印BlindWatermark工具使用教程.pptx.pptx

    而鲁棒性则意味着即使图像经过缩放、剪裁、压缩、滤波等处理,水印仍然能够被准确识别,确保了水印的稳定性。 在Java盲水印BlindWatermark的实现中,通常有两种主要的方法:空域方法和频域方法。空域方法直接修改...

    JAVA实现给图片增加图片水印或者文字水印-依赖包

    在实际应用中,你可能还需要处理更多细节,比如根据图片的宽高比动态调整水印的位置和大小,或者支持图片水印,这需要对图像处理有更深入的理解。但以上代码已经足够作为基础,帮助你开始在Java中实现图片加水印的...

    Java图片处理 (文字水印、图片水印、缩放、补白)代码实例

    在这个实例中,我们将探讨如何在Java中实现文字水印、图片水印、图像缩放以及补白功能。以下是一些关键知识点: 1. **Java AWT 和 Swing 图形库**: Java中的`java.awt`和`javax.swing`包提供了丰富的图形用户界面...

    java实现图片水印添加

    在Java编程语言中,添加图片水印是一项常见的图像处理任务,尤其在版权保护、品牌推广等领域广泛应用。通过编写代码,我们可以灵活控制水印的位置、透明度、大小以及文本或图像内容。下面将详细介绍如何使用Java实现...

    java实现图片上传并添加水印效果(文字水印,蒙版,logo图片),自动进行文字大小行数位置匹配 ,文字自动换行

    2. **水印类型**:水印分为文字水印、蒙版水印和logo图片水印。文字水印涉及在图像上绘制文字,需要调整字体、颜色、透明度和角度;蒙版水印则是在图像上覆盖一层半透明的图案或颜色;logo图片水印则是将一个图片...

    自动图片缩放水印程序

    4. **图片水印**:图片水印通常是将logo、图标或签名等图像作为水印,同样通过调整透明度和位置来实现与原图的融合。相比文字水印,图片水印更具有识别度,但处理起来也相对复杂。 5. **批量处理**:自动图片缩放...

    java 水印 图像处理 图片分割 裁剪 缩放

    Java图像处理技术是Java开发中的一个重要领域,涵盖了多种操作,如添加水印、图像分割、裁剪和缩放。在本项目中,这些功能被整合到一个完整的程序中,并通过单元测试进行了验证,确保了各个功能的正确性。此外,程序...

    java 图片处理,水印,缩放,放大,叠加等功能

    在Java编程语言中,处理图片是一项常见的任务,涵盖了多种功能,如添加水印、缩放、放大以及图像的叠加操作。这些功能对于开发图形用户界面(GUI)应用、网站、移动应用或者任何需要处理视觉元素的项目至关重要。...

    java操作水印的jar包

    Java操作水印的jar包主要用于在PDF、Word文档和图片上添加水印,这是一种常见的文件保护和版权声明方法。在Java编程中,处理水印涉及多个技术领域,包括IO流处理、图像处理、文档解析等。下面将详细介绍这些知识点。...

    java图片加水印工具类

    这个“java图片加水印工具类”正是为了简化这一过程而设计的,它允许开发者通过调用预定义的方法,快速地在图片上添加文字或图形水印,无需每次都手动编写相同的功能代码。 首先,我们需要了解什么是水印。水印通常...

    java图片水印

    Java图片水印技术是将特定的文字、图案或者logo等元素以半透明或全透明的方式叠加在原图上,以此来实现对图片的标识或保护。这项技术广泛应用于各种场景,如品牌宣传、版权保护、社交媒体分享等。在Java中实现图片...

Global site tag (gtag.js) - Google Analytics