图片水印

  添加图片水印,换行


// 用来调整水印的间距
private static final int space = 5;
private static int getCharLen(char c, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charWidth(c);
    }

    /**
     *
     * @param srcImgFile 待添加水印的图片
     * @param outImgPath 添加完成的输出路径
     * @param markContentColor 文字颜色
     * @param waterMarkContent 水印内容, 需要换行用||连接
     */
    public static void drawCaterMark(File srcImgFile, String outImgPath, Color markContentColor, String waterMarkContent,int topEmptySpace) {
        try {
            String[] waterMarkContents = waterMarkContent.split("\\|\\|");
            // 读取原图片信息
//            File srcImgFile = new File(srcImgPath);
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 得到画笔对象
            Graphics2D g = bufImg.createGraphics();
            // 设置起点
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            int fontSize = srcImg.getWidth(null) / 300 * 10;
            Font font = new Font("微软雅黑", Font.PLAIN, fontSize);
            // 设置水印颜色
            g.setColor(markContentColor);
            // 设置水印文字字体
            g.setFont(font);
            // 抗锯齿
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);

            List<String> waterMarkContentList = new ArrayList<>();
            // 将换行后的文字放入新的集合
            for (String markContent : waterMarkContents) {
                // 单字符长度
                int tempCharLen = 0;
                // 单行字符总长度临时计算
                int tempLineLen = 0;
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < markContent.length(); i++) {
                    char tempChar = markContent.charAt(i);
                    tempCharLen = getCharLen(tempChar, g);
                    tempLineLen += tempCharLen;
                    // 文字长度大于图片宽度-2*间距-字体大小
                    if (tempLineLen > srcImgWidth - space * 2 - tempCharLen) {
                        // 长度已经满一行
                        waterMarkContentList.add(sb.toString());
                        // 清空内容,重新追加
                        sb.delete(0, sb.length());
                        tempLineLen = 0;
                    }
                    // 追加字符
                    sb.append(tempChar);
                }
                waterMarkContentList.add(sb.toString());
            }

            // 绘制水印
            int tempY = fontSize + space;
            for (int i = 0; i < waterMarkContentList.size(); i++) {
                String s = waterMarkContentList.get(i);
                //左上角
                System.out.println("x="+space+",y="+((i+1) * tempY + topEmptySpace));
                g.drawString(s, space,  (i+1) * tempY + topEmptySpace);
            }
            g.dispose();

            // 输出图片
            if (StrUtil.isNotBlank(outImgPath)) {
                FileOutputStream outImgStream = new FileOutputStream(outImgPath);
                ImageIO.write(bufImg, "jpg", outImgStream);
                outImgStream.flush();
                outImgStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 原图位置, 输出图片位置, 水印文字颜色, 水印文字
        String font = "这是第一个水印||这是第二个水印||2020-05-27 17:00:00";
        drawCaterMark(new File("C:\\Users\\ming\\Pictures\\2.jpg"),
                "C:\\Users\\ming\\Pictures\\\\2_mark.jpg", Color.red,  font,0);
    }

 

上一篇:synchronized优化手段:锁膨胀、锁消除、锁粗化和自适应自旋锁...


下一篇:原生JS上传大文件分享