zoukankan      html  css  js  c++  java
  • 图片水印

      添加图片水印,换行

    
    
    // 用来调整水印的间距
    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);
        }
  • 相关阅读:
    两数交换不借助第三变量
    linux磁盘文件系统管理
    Fedora15设置开机进入终端模式
    快速构建Windows 8风格应用8贴靠视图
    快速构建Windows 8风格应用6GridView数据控件
    快速构建Windows 8风格应用4FlipView数据控件
    快速构建Windows 8风格应用9竖直视图
    快速构建Windows 8风格应用1开发工具安装及模拟器使用
    快速构建Windows 8风格应用5ListView数据控件
    快速构建Windows 8风格应用2创建调试应用
  • 原文地址:https://www.cnblogs.com/djq-jone/p/15263200.html
Copyright © 2011-2022 走看看