Java给图片添加水印(图像类库Graphics2D使用)

    最近要做个红包分享的功能,分享完成后要弹出一个页面,提示某某某获得多少元红包。其中一步是在原有图片基础上添加用户头像和用户名的水印。像一些网站的图片一般也会打上网站的标志,比如CSDN下方的水印。

    来一个给红包添加水印的demo,代码如下

package nosence;

/**
 * @author uiao
 * @Title: 给图片加图片和文字水印
 * @date 2018/8/1519:35
 */

import org.apache.log4j.Logger;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;


public class WaterMarkUtil {

    private static Font shareFont = new Font("微软雅黑", Font.PLAIN, 40);
    private static Color shareColor = new Color(255, 255, 255, 255);

    private static Logger logger = Logger.getLogger(WaterMarkUtil.class);

    /**
     * @param srcImgPath       源图片路径
     * @param markImgPath      水印图片路径
     * @param tarImgPath       保存的图片路径
     * @param waterMarkContent 水印内容
     */
    public static void addWaterMark(String srcImgPath, String markImgPath, String tarImgPath, String waterMarkContent) {

        try {
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高

            // 读取水印图片信息
            File markImgFile = new File(markImgPath);
            Image markImg = ImageIO.read(markImgFile);

            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);

            // 绘制图像
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            g.setColor(shareColor);
            g.setFont(shareFont);

            // 70为头像宽度,30为头像和文字间距
            int x = (srcImgWidth - getWatermarkLength(waterMarkContent, g) - 70 - 30) / 2;
            int y = srcImgHeight / 2 - 100;

            // 给图片加图片水印
            g.drawImage(markImg, x, y, 70, 70, null);
            // 给图片加文字水印
            g.drawString(waterMarkContent, x + 100, y + 50);

            g.dispose();

            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            logger.info("水印添加完成");
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            logger.info("水印添加失败");
            e.printStackTrace();
        }
    }

    /**
     * 获取文字的宽度
     *
     * @param waterMarkContent
     * @param g
     * @return
     */
    private static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }
}

测试类

package nosence;

/**
 * @author uiao
 * @Title: 测试水印生成效果
 * @date 2018/8/1714:41
 */
public class WaterMarkTest {
    public static void main(String[] args) {
        String srcImgPath = "C:\\Users\\Administrator\\Desktop\\coder\\three_red_packet_1080.jpg"; // 源图片地址
        String markImgPath = "C:\\Users\\Administrator\\Desktop\\coder\\avatar.jpg"; // 水印图片地址
        String tarImgPath = "C:\\Users\\Administrator\\Desktop\\coder\\water_marked_after.jpg"; //目的地址
        String waterMarkContent = "南安安";  //水印内容
        WaterMarkUtil.addWaterMark(srcImgPath, markImgPath, tarImgPath, waterMarkContent);
    }
}

添加水印之前的图片

加上水印之后的图片

猜你喜欢

转载自blog.csdn.net/fanxing1964/article/details/81778395
今日推荐