使用imgIo技术包用java程序将图片添加水印,并防止图片文字水印溢出

使用java实现文字叫水印,并且防止文字水印溢出图片

IMGIO详细了解

  • 由于我们加水印是根据图片的像素值大小变化的, 我们需要去知道我们的图片像素,比如我们设置的文字像素是20,本来是有100个文字,
  • 那么我们图片的像素就要是比两千像素大,但是图片是用户传的,我们控制不了呀,我们只能控制字体大小或者换行,那么如果文字有1000个
  • 那么只有换行,因为缩小那样影响我们便于查看的意义.那么我这里是采取的换行实现不溢出的一个方法,大家可以参考一下哦.
public static void waterPress(File srcImgFile, Color markContentColor, String waterMarkContent) {
        try {
        	//将String水印分为三份,既三行,分别是时间,位置信息,还有坐标经纬度,这里考虑到的是||是这三个信息里不会出现的字段所以用此来分割
            String[] waterMarkContents = waterMarkContent.split("\\|\\|");
            // 读取原图片信息
            Image srcImg = ImageIO.read(srcImgFile);
            //获取图片宽度和高度
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            //BufferedImage是image实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个			图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等

            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 得到画笔对象
            Graphics2D g = bufImg.createGraphics();
            // 设置水印起点
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            // 设置水印字体为黑体
            Font font = new Font("SimHei", Font.PLAIN, srcImg.getWidth(null) / 300 * 10);
            // 根据图片的背景设置水印颜色
            g.setColor(markContentColor);
            // 设置水印文字字体
            g.setFont(font);
            //透明度
            float alpha = 0.5f; // 透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            // 数组长度,及是因基础行数
            int contentLength = waterMarkContents.length;
            // 长度过长需要增加的行数
            int watermarkIncreaseTheNumberOfLines = 0;
            // 获取水印文字中最长的,最长的那行
            int maxLength = 0;
            for (int i = 0; i < contentLength; i++) {
                int fontlen = getWatermarkLength(waterMarkContents[i], g);
                if (maxLength < fontlen) {
                    maxLength = fontlen;
                }
            }
            //获取水印的像素大小
            Integer[] textLengths = new Integer[waterMarkContents.length];
            for (int i = 0; i < contentLength; i++) {
                int fontlen = getWatermarkLength(waterMarkContents[i], g);
                textLengths[i] = fontlen;
            }
            //获取单个数字像素大小
            int pixelSize = textLengths[0] / waterMarkContents[0].length();
            //判断每行文字水印的像素是否超过图片像素宽度,如果超过则加行数
            for (Integer textLength :textLengths) {
                if ((0.0 + textLength) / srcImgWidth > 1.0) {
                    int watermarkIncreaseTheNumberOfLines1 = textLength / (srcImgWidth - pixelSize);
                    watermarkIncreaseTheNumberOfLines += watermarkIncreaseTheNumberOfLines1;
                }
            }
            //每次往下递增的行数
            int addition = 0;
            for (int j = 0; j < contentLength; j++) {
                waterMarkContent = waterMarkContents[j];
                int tempX = 10;
                int tempY = srcImg.getWidth(null) / 300 * 10;
                // 单字符长度
                int tempCharLen = 0;
                // 单行字符总长度临时计算
                int tempLineLen = 0;
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < waterMarkContent.length(); i++) {
                    char tempChar = waterMarkContent.charAt(i);
                    tempCharLen = getCharLen(tempChar, g);
                    tempLineLen += tempCharLen;
                    if (tempLineLen >= (srcImgWidth-pixelSize) || tempLineLen+(pixelSize*2) >= (srcImgWidth-pixelSize)) {
                        // 长度已经满一行,进行文字叠加
                        //g.drawString(sb.toString(), tempX, tempY);
                        g.drawString(sb.toString(), tempY, srcImgHeight - ((contentLength+watermarkIncreaseTheNumberOfLines - (j+addition) - 1) * tempY + tempY));
                        addition +=1;
                        // 清空内容,重新追加
                        sb.delete(0, sb.length());
                        tempLineLen = 0;
                    }
                    // 追加字符
                    sb.append(tempChar);
                }
                // 通过设置后两个输入参数给水印定位
                g.drawString(sb.toString(), tempY, srcImgHeight - ((contentLength+watermarkIncreaseTheNumberOfLines - (j+addition) - 1) * tempY + tempY));
            }
            g.dispose();

            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(srcImgFile.getPath());
            String suffix = srcImgFile.getPath().substring(srcImgFile.getPath().lastIndexOf(".")).substring(1);
            ImageIO.write(bufImg, suffix, outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值