• 图片添加文字水印


    测试代码

      note:如果linux环境下中文乱码,参考这篇文章:http://blog.csdn.net/itdragons/article/details/72625041

    byte[] markImageByte=ImageRemarkUtil.pressText("水印文字", imgByte, "宋体", "#CD6600", 22, 0.1f, true);

    工具类

    package com.company.wx.util;
    
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.GradientPaint;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.font.GlyphVector;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    
    import javax.imageio.ImageIO;
    
    import org.apache.log4j.Logger;
    
    /**
     * @ClassName: ImageRemarkUtil
     * @Description: TODO(图片水印工具类)
     * @author chenzhangwei
     * @date 2017年12月11日下午3:32:16
     */
    public class ImageRemarkUtil {
        static Logger log=Logger.getLogger(ImageRemarkUtil.class);
        /**
          * 斜水印,重复水印,文字
          * @param pressText  文字
          * @param targetImg  目标图片字节数组
          * @param fontName 字体名称
          * @param colorStr 字体颜色字符串,格式如:#29944f
          * @param fontSize  字体大小
          * @param alpha 透明度(0.1-0.9)
          * @param carelessness true为字体实心,false为字体空心
          * @return
          */
         public static byte[] pressText(String pressText, byte[] fileByte, String fontName, String colorStr, int fontSize, float alpha,boolean carelessness) {
          ByteArrayOutputStream bos=new ByteArrayOutputStream();     
          try {
           Image src = ImageIO.read(new ByteArrayInputStream(fileByte));
           
           //图片宽度
           int width = src.getWidth(null);
           //图片高度
           int height = src.getHeight(null);
           
           BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
           
           Graphics2D g2d  = image.createGraphics();
           //绘原图
           g2d.drawImage(src, 0, 0, width, height, null);
           //比例
           g2d.scale(1, 1);
           
           g2d.addRenderingHints(new RenderingHints(
             RenderingHints.KEY_ANTIALIASING,
             RenderingHints.VALUE_ANTIALIAS_ON));
           g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
             RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
           
           
           //颜色
           Color color = Color.decode(colorStr);
           
           //字体
           Font font = new Font(fontName, Font.PLAIN, fontSize);
           
           
           GlyphVector fontGV = font.createGlyphVector(g2d.getFontRenderContext(),
             pressText);
           Rectangle size = fontGV
             .getPixelBounds(g2d.getFontRenderContext(), 0, 0);
           Shape textShape = fontGV.getOutline();
           double textWidth = size.getWidth();
           double textHeight = size.getHeight();
           AffineTransform rotate45 = AffineTransform
             .getRotateInstance(Math.PI / 4d);
           Shape rotatedText = rotate45.createTransformedShape(textShape);
           g2d.setPaint(new GradientPaint(0, 0, color,
           image.getWidth() / 2, image.getHeight() / 2,color));
           
           //透明度
           g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
           
           
           double yStep = Math.sqrt(textWidth * textWidth / 2) + 5;
           for (double x = -textHeight * 3; x < image.getWidth(); x += (textHeight*5)) {
            double y = -yStep;
            for (; y < image.getHeight(); y += (yStep*1.5)) {
             g2d.draw(rotatedText);
             if(carelessness)//字体实心
             {
              g2d.fill(rotatedText);
             }
             g2d.translate(0, yStep*1.5);
            }
            g2d.translate(textHeight * 5, -(y + yStep));
           }
           
           g2d.dispose();
           ImageIO.write(image, "jpg", bos);
           return bos.toByteArray();
          } catch (Exception e) {
              log.error("水印添加抛出异常:"+e);
          }
          return null;
         }
    
    }
    
    
    package com.company.wx.util;
    
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.GradientPaint;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.font.GlyphVector;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    
    import javax.imageio.ImageIO;
    
    import org.apache.log4j.Logger;
    
    /**
     * @ClassName: ImageRemarkUtil
     * @Description: TODO(图片水印工具类)
     * @author chenzhangwei
     * @date 2017年12月11日下午3:32:16
     */
    public class ImageRemarkUtil {
        static Logger log=Logger.getLogger(ImageRemarkUtil.class);
        /**
          * 斜水印,重复水印,文字
          * @param pressText  文字
          * @param targetImg  目标图片
          * @param fontName 字体名称
          * @param colorStr 字体颜色字符串,格式如:#29944f
          * @param fontSize  字体大小
          * @param alpha 透明度(0.1-0.9)
          * @param carelessness true为字体实心,false为字体空心
          * @return
          */
         public static byte[] pressText(String pressText, byte[] fileByte, String fontName, String colorStr, int fontSize, float alpha,boolean carelessness) {
          ByteArrayOutputStream bos=new ByteArrayOutputStream();    
          try {
           Image src = ImageIO.read(new ByteArrayInputStream(fileByte));
           
           //图片宽度
           int width = src.getWidth(null);
           //图片高度
           int height = src.getHeight(null);
           
           BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
           
           Graphics2D g2d  = image.createGraphics();
           //绘原图
           g2d.drawImage(src, 0, 0, width, height, null);
           //比例
           g2d.scale(1, 1);
           
           g2d.addRenderingHints(new RenderingHints(
             RenderingHints.KEY_ANTIALIASING,
             RenderingHints.VALUE_ANTIALIAS_ON));
           g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
             RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
           
           
           //颜色
           Color color = Color.decode(colorStr);
           
           //字体
           Font font = new Font(fontName, Font.PLAIN, fontSize);
           
           
           GlyphVector fontGV = font.createGlyphVector(g2d.getFontRenderContext(),
             pressText);
           Rectangle size = fontGV
             .getPixelBounds(g2d.getFontRenderContext(), 0, 0);
           Shape textShape = fontGV.getOutline();
           double textWidth = size.getWidth();
           double textHeight = size.getHeight();
           AffineTransform rotate45 = AffineTransform
             .getRotateInstance(Math.PI / 4d);
           Shape rotatedText = rotate45.createTransformedShape(textShape);
           g2d.setPaint(new GradientPaint(0, 0, color,
           image.getWidth() / 2, image.getHeight() / 2,color));
           
           //透明度
           g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
           
           
           double yStep = Math.sqrt(textWidth * textWidth / 2) + 5;
           for (double x = -textHeight * 3; x < image.getWidth(); x += (textHeight*5)) {
            double y = -yStep;
            for (; y < image.getHeight(); y += (yStep*1.5)) {
             g2d.draw(rotatedText);
             if(carelessness)//字体实心
             {
              g2d.fill(rotatedText);
             }
             g2d.translate(0, yStep*1.5);
            }
            g2d.translate(textHeight * 5, -(y + yStep));
           }
           
           g2d.dispose();
           ImageIO.write(image, "jpg", bos);
           return bos.toByteArray();
          } catch (Exception e) {
              log.error("水印添加抛出异常:"+e);
          }
          return null;
         }
    
    }
  • 相关阅读:
    2.操作系统基础
    6.Linux基础3
    DRAM 内存介绍(一)
    131127新的一天
    Java中的super关键字何时使用
    JAVA的引用类型变量(C/C++中叫指针)
    System.out.println()的含义
    Java面试题
    HTML基础知识
    子域名查找
  • 原文地址:https://www.cnblogs.com/SunAutumn/p/8359752.html
Copyright © 2020-2023  润新知