Java实现图片添加水印

/**
 * 添加文本水印
 * @author navy
 *
 */
public class TextWaterMarkServiceImpl implements IWaterMarkService{
    @Override
    public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
        FileOutputStream fos=null; //将内存中的图片写出到磁盘
        String newFileName = ""; //添加水印后的图片
        
        try {
            Image image=ImageIO.read(pic); //获取图片信息
            int width=image.getWidth(null);//获取图片的大小
            int height=image.getHeight(null);//获取图片的大小
            
            //1.创建图片缓存对象   高度、宽度和图片颜色
            BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            
            //2.创建Java绘图工具对象
            Graphics2D gp=bufferedImage.createGraphics();
            
            /*
             * 3.使用绘图工具对象将原图绘制到缓存图片对象
             * 绘制图片  要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
             * 绘制图片的高度和宽度
             */
            gp.drawImage(image,0,0,width,height,null);
            
            //4.添加文字水印
            //(1)设置显示文本的样式
            gp.setFont(new Font(FONT_NAME,FONT_STYLE,FONT_SIZE));
            //(2)设置显示文本的颜色
            gp.setColor(FONT_COLOR);
            
            //(3)计算文本的显示位置
            int x=width-FONT_SIZE*getTextLength(MARK_TEXT);
            int y=height-FONT_SIZE;
            
            //(4)设置透明度
            gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));
            
            //(5)绘制文本水印
            gp.drawString(MARK_TEXT,x,y+FONT_SIZE);
            
            //(6)释放工具
            gp.dispose();
            
            
            //5.创建图像编码工具类,对图片对象进行编码处理  JPEGImageEncoder
            newFileName="text_"+picFileName;
            fos=new FileOutputStream(realUploadPath+"/"+newFileName);
            JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);
            //6.使用图像编码工具类,输出缓存图像到目标图片文件
            jie.encode(bufferedImage);
            
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //7.关闭流
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return uploadPath+"/"+newFileName;
    }
    
    /**
     * 计算文本的长度
     * 如果是中文则就是文本长度值,如果是英文或数字,则是一半其长度的一半
     * 两个英文的长度跟一个汉字的长度一样
     * @param text:要计算的文本
     * @return
     */
    public int getTextLength(String text){
        int length=text.length(); 
        String temp;
        for(int i=0;i<text.length();i++){
            temp=String.valueOf(text.charAt(i));
            if(temp.getBytes().length>1){ //如果是汉字,则加1
                length++;
            }
        }
        length=length%2==0?length/2:length/2+1;
        return length;
    } 

}

 

/**
 * 添加多文本水印
 * @author navy
 *
 */
public class TextMoreWaterMarkServiceImpl implements IWaterMarkService{
    @Override
    public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
        FileOutputStream fos=null; //将内存中的图片写出到磁盘
        String newFileName = ""; //添加水印后的图片
        
        try {
            Image image=ImageIO.read(pic); //获取图片信息
            int width=image.getWidth(null);//获取图片的大小
            int height=image.getHeight(null);//获取图片的大小
            
            //1.创建图片缓存对象   高度、宽度和图片颜色
            BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            
            //2.创建Java绘图工具对象
            Graphics2D gp=bufferedImage.createGraphics();
            
            /*
             * 3.使用绘图工具对象将原图绘制到缓存图片对象
             * 绘制图片  要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
             * 绘制图片的高度和宽度
             */
            gp.drawImage(image,0,0,width,height,null);
            
            //4.添加文字水印
            //(1)设置显示文本的样式
            gp.setFont(new Font(FONT_NAME,FONT_STYLE,FONT_SIZE));
            //(2)设置显示文本的颜色
            gp.setColor(FONT_COLOR);
            
            //(3)计算文本的大小
            int textWidth=FONT_SIZE*getTextLength(MARK_TEXT);
            int textHeight=FONT_SIZE;
            
            //(4)设置透明度
            gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));
            
            //(5)旋转图片  将角度转换为弧度  然后是旋转的中心
            gp.rotate(Math.toRadians(30),bufferedImage.getWidth()/2,bufferedImage.getHeight()/2);
            
            //(6)设置绘制坐标的起始值
            int x=-width/2; //向左移动一半
            int y=-height/2; //向上移动一半
            
            //(7)循环绘制文本水印,此时绘制的区域会增大,我们这里直接扩大一倍
            while(x<width*1.5){
                y=-height/2; //y坐标要重置,以保证从上往下的添加
                while(y<height*1.5){
                    gp.drawString(MARK_TEXT,x,y);//添加水印
                    y+=textHeight+200;
                }
                x+=textWidth+200;  //200为文字与文字之间的间距
            }
            
            
            //(8)释放工具
            gp.dispose();
            
            
            //5.创建图像编码工具类,对图片对象进行编码处理  JPEGImageEncoder
            newFileName="textmore_"+picFileName;
            fos=new FileOutputStream(realUploadPath+"/"+newFileName);
            JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);
            //6.使用图像编码工具类,输出缓存图像到目标图片文件
            jie.encode(bufferedImage);
            
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //7.关闭流
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return uploadPath+"/"+newFileName;
    }
    
    /**
     * 计算文本的长度
     * 如果是中文则就是文本长度值,如果是英文或数字,则是一半其长度的一半
     * 两个英文的长度跟一个汉字的长度一样
     * @param text:要计算的文本
     * @return
     */
    public int getTextLength(String text){
        int length=text.length(); 
        String temp;
        for(int i=0;i<text.length();i++){
            temp=String.valueOf(text.charAt(i));
            if(temp.getBytes().length>1){ //如果是汉字,则加1
                length++;
            }
        }
        length=length%2==0?length/2:length/2+1;
        return length;
    } 

}
 

/**
 * 添加图片水印
 * @author navy
 */
public class ImageWaterMarkServiceImpl implements IWaterMarkService{
    @Override
    public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
        FileOutputStream fos=null; //将内存中的图片写出到磁盘
        String newFileName = ""; //添加水印后的图片
        
        try {
            Image image=ImageIO.read(pic); //获取图片信息
            int width=image.getWidth(null);//获取图片的大小
            int height=image.getHeight(null);//获取图片的大小
            
            //1.创建图片缓存对象   高度、宽度和图片颜色
            BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            
            //2.创建Java绘图工具对象
            Graphics2D gp=bufferedImage.createGraphics();
            
            /*
             * 3.使用绘图工具对象将原图绘制到缓存图片对象
             * 绘制图片  要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
             * 绘制图片的高度和宽度
             */
            gp.drawImage(image,0,0,width,height,null);
            
            //4.添加图片水印
            //(1)获取水印图片路径
            String logoPath=realUploadPath+"/"+LOGO;
            
            //(2)创建文件对象,去指向这个文件
            File logo=new File(logoPath);
            
            //(3)使用Image这个类去操作这个文件
            Image imageLogo=ImageIO.read(logo);
            
            //(4)计算文本的显示位置
            int x=width-imageLogo.getWidth(null);
            int y=height-imageLogo.getHeight(null);
            
            //(5)设置透明度
            gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));
            
            //(6)绘制文本水印
            gp.drawImage(imageLogo,x,y,null);
            
            //(7)释放工具
            gp.dispose();
            
            //5.创建图像编码工具类,对图片对象进行编码处理  JPEGImageEncoder
            newFileName="logo_"+picFileName;
            fos=new FileOutputStream(realUploadPath+"/"+newFileName);
            JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);
            //6.使用图像编码工具类,输出缓存图像到目标图片文件
            jie.encode(bufferedImage);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //7.关闭流
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return uploadPath+"/"+newFileName;
    }
}
 

 

/**
 * 添加图片水印
 * @author navy
 */
public class ImageMoreWaterMarkServiceImpl implements IWaterMarkService{
    @Override
    public String waterMark(File pic, String picFileName, String uploadPath, String realUploadPath) {
        FileOutputStream fos=null; //将内存中的图片写出到磁盘
        String newFileName = ""; //添加水印后的图片
        
        try {
            Image image=ImageIO.read(pic); //获取图片信息
            int width=image.getWidth(null);//获取图片的大小
            int height=image.getHeight(null);//获取图片的大小
            
            //1.创建图片缓存对象   高度、宽度和图片颜色
            BufferedImage bufferedImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            
            //2.创建Java绘图工具对象
            Graphics2D gp=bufferedImage.createGraphics();
            
            /*
             * 3.使用绘图工具对象将原图绘制到缓存图片对象
             * 绘制图片  要绘制的图片对象 绘制的开始坐标(跟原图一样,所以都是0)
             * 绘制图片的高度和宽度
             */
            gp.drawImage(image,0,0,width,height,null);
            
            //4.添加图片水印
            //(1)获取水印图片路径
            String logoPath=realUploadPath+"/"+LOGO;
            
            //(2)创建文件对象,去指向这个文件
            File logo=new File(logoPath);
            
            //(3)使用Image这个类去操作这个文件
            Image imageLogo=ImageIO.read(logo);
            
            //(4)计算图片水印的大小
            int imageWidth=imageLogo.getWidth(null);
            int imageHeight=imageLogo.getHeight(null);
            
            //(5)设置透明度
            gp.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,ALPHA));
            
            //(6)旋转图片  将角度转换为弧度  然后是旋转的中心
            gp.rotate(Math.toRadians(30),bufferedImage.getWidth()/2,bufferedImage.getHeight()/2);
            
            //(7)设置绘制坐标的起始值
            int x=-width/2; //向左移动一半
            int y=-height/2; //向上移动一半
            
            //(7)循环绘制文本水印,此时绘制的区域会增大,我们这里直接扩大一倍
            while(x<width*1.5){
                y=-height/2; //y坐标要重置,以保证从上往下的添加
                while(y<height*1.5){
                    gp.drawImage(imageLogo,x,y,null);
                    y+=imageWidth+300;
                }
                x+=imageHeight+300;  //300为文字与文字之间的间距
            }
            
            //(8)释放工具
            gp.dispose();
            
            //5.创建图像编码工具类,对图片对象进行编码处理  JPEGImageEncoder
            newFileName="logomore_"+picFileName;
            fos=new FileOutputStream(realUploadPath+"/"+newFileName);
            JPEGImageEncoder jie=JPEGCodec.createJPEGEncoder(fos);
            //6.使用图像编码工具类,输出缓存图像到目标图片文件
            jie.encode(bufferedImage);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //7.关闭流
            if(fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return uploadPath+"/"+newFileName;
    }
}
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Java 中的 `javax.imageio.ImageIO` 和 `java.awt.Graphics2D` 类来实现图片添加水印的功能,并将结果转换为 Base64 格式返回。以下是一个示例代码: ```java import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Base64; public class WatermarkUtil { public static String addWatermark(InputStream imageStream, String watermarkText) throws IOException { // 读取输入流中的图片 BufferedImage image = ImageIO.read(imageStream); // 创建一个新的 BufferedImage,并使用原始图片的宽度、高度和类型 BufferedImage watermarkedImage = new BufferedImage( image.getWidth(), image.getHeight(), image.getType()); // 创建 Graphics2D 对象,用于在新图片上绘制水印 Graphics2D g2d = watermarkedImage.createGraphics(); // 在新图片上绘制原始图片 g2d.drawImage(image, 0, 0, null); // 设置水印的字体、大小和颜色 Font font = new Font("Arial", Font.BOLD, 36); g2d.setFont(font); g2d.setColor(Color.RED); // 计算水印文本的坐标,居中显示在图片上 FontMetrics fontMetrics = g2d.getFontMetrics(); int x = (image.getWidth() - fontMetrics.stringWidth(watermarkText)) / 2; int y = image.getHeight() / 2; // 绘制水印文本 g2d.drawString(watermarkText, x, y); // 释放资源 g2d.dispose(); // 将水印图片转换为 Base64 字符串 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(watermarkedImage, "png", outputStream); byte[] imageBytes = outputStream.toByteArray(); String base64Image = Base64.getEncoder().encodeToString(imageBytes); return base64Image; } } ``` 你可以调用 `addWatermark` 方法,传入原始图片的输入流和水印文本,它将返回添加水印后的图片的 Base64 字符串。 请注意,上述代码假设输入的图片格式为 PNG,并使用了默认的字体、大小、颜色等设置。你可以根据实际需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值