zoukankan      html  css  js  c++  java
  • 图片添加文字水印

    测试代码

      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;
         }
    
    }
  • 相关阅读:
    希腊字母写法
    The ASP.NET MVC request processing line
    lambda aggregation
    UVA 10763 Foreign Exchange
    UVA 10624 Super Number
    UVA 10041 Vito's Family
    UVA 10340 All in All
    UVA 10026 Shoemaker's Problem
    HDU 3683 Gomoku
    UVA 11210 Chinese Mahjong
  • 原文地址:https://www.cnblogs.com/SunAutumn/p/8359752.html
Copyright © 2011-2022 走看看