Java 图片水印任何范围覆盖计算

编程 > Java (258) 2025-12-22 20:27:37

Java graphics2D 生成水印(水印文字或水印图片)全角度全覆盖方式。

 

计算覆盖范围

定义范围的四个点

    @Data
    @AllArgsConstructor
    static class Xys{
        double minX;
        double maxX;
        double minY;
        double maxY;
    }

计算覆盖范围的4个点

会员内容

稀缺资源,此处内容需登录后查阅(刷新)

登录/注册

文字水印

/**
     * 文字水印
     * @param sourceImageFileBytes 原始图片的bytes
     * @param watermarkText 文字,如:www.xqlee.com
     * @param fontSize 字体大小,如:12,默认24
     * @param watermarkColor 字体颜色,如:Color.RED,默认Color.GRAY
     * @param degree 倾斜度,如:45,默认-45
     * @param alpha 字体透明度,0-1,如:0.5f,默认0.3f
     * @return 处理好以后的图片文件
     * @throws IOException 处理过程中可能发生的异常
     */
    public static byte [] drawImageTextWatermark(byte[] sourceImageFileBytes,String watermarkText, Integer fontSize,  Color watermarkColor,Integer watermarkXSpace,Integer watermarkYSpace, Integer degree,Float alpha) throws IOException {
        alpha = Objects.isNull(alpha)?0.3f:alpha;
        degree = Objects.isNull(degree)?-45:degree;
        watermarkColor = Objects.isNull(watermarkColor)?Color.GRAY:watermarkColor;
        fontSize = (Objects.isNull(fontSize)||fontSize<=0)?24:fontSize;
        watermarkXSpace = Objects.isNull(watermarkXSpace)?100:watermarkXSpace;
        watermarkYSpace = Objects.isNull(watermarkYSpace)?180:watermarkYSpace;
        //获取源图像的宽度、高度
        Image image = ImageIO.read(new ByteArrayInputStream(sourceImageFileBytes));
        int width = image.getWidth(null);
        int height = image.getHeight(null);

        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //创建绘图工具对象
        Graphics2D graphics2D = bufferedImage.createGraphics();
        //消锯齿
        //文字锯齿
        graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        //图形锯齿
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        //其他
        graphics2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);

        //设置高质量缩放参数(防止水印图片模糊/噪点不清晰)
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);

        //底图绘画,其中的0代表和原图位置一样
        graphics2D.drawImage(image, 0, 0, width, height, null);


        //设置水印文字(设置水印字体样式、粗细、大小)
        graphics2D.setFont(new Font(null, Font.PLAIN, fontSize));
        //设置水印颜色
        graphics2D.setColor(watermarkColor);
        //设置水印透明度
        graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        //设置水印旋转
        double radians = Math.toRadians(degree);
        graphics2D.rotate(radians, (double) bufferedImage.getWidth() / 2, (double) bufferedImage.getHeight() / 2);

        //计算文本占用的宽度和高度
        int fontsWidth = graphics2D.getFontMetrics().stringWidth(watermarkText);
        int fontsHeight = graphics2D.getFontMetrics().getHeight();
        Xys xys = getXys(width, height, radians);
        for (double x = xys.getMinX() - watermarkXSpace; x < xys.maxX+watermarkXSpace; x += (watermarkXSpace + fontsWidth)) {
            for (double y = xys.minY - watermarkYSpace; y < xys.maxY+watermarkYSpace; y += (watermarkYSpace + fontsHeight)) {
                graphics2D.drawString(watermarkText,(float) x, (float)y);
            }
        }

        graphics2D.dispose();
        //重置大小
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
        //直接以png输出,输出jpg格式图片不清晰 / 后续步骤其他工具进行压缩转格式即可
        ImageIO.write(bufferedImage,"png",bos);
        return  bos.toByteArray();
    }

图片水印

/**
     *  图片水印
     * @param sourceImageFileBytes 处理图片
     * @param watermarkImageFileBytes 水印图片
     * @param watermarkXSpace 水印x(横向)间隔
     * @param watermarkYSpace 水印y(纵向)间隔
     * @param degree 旋转角度,如:-45
     * @param alpha  透明度,如:0.3f
     * @return 处理后图像
     * @throws IOException 异常
     */
    public static byte [] drawImageWatermark(byte[] sourceImageFileBytes,byte[] watermarkImageFileBytes,Integer watermarkXSpace,Integer watermarkYSpace, Integer degree, Float alpha) throws IOException {
        alpha = Objects.isNull(alpha)?0.3f:alpha;
        degree = Objects.isNull(degree)?-45:degree;
        watermarkXSpace = Objects.isNull(watermarkXSpace)?100:watermarkXSpace;
        watermarkYSpace = Objects.isNull(watermarkYSpace)?180:watermarkYSpace;
        //获取源图像的宽度、高度
        Image image = ImageIO.read(new ByteArrayInputStream(sourceImageFileBytes));
        int width = image.getWidth(null);
        int height = image.getHeight(null);

        //获取水印宽度和高度
        BufferedImage watermarkImage = ImageIO.read(new ByteArrayInputStream(watermarkImageFileBytes));
        int watermarkImageHeight = watermarkImage.getHeight(null);
        int watermarkImageWidth = watermarkImage.getWidth(null);


        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //创建绘图工具对象
        Graphics2D graphics2D = bufferedImage.createGraphics();

        //消锯齿
        //文字锯齿
        graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        //图形锯齿
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

        //设置高质量缩放参数(防止水印图片模糊/噪点不清晰)
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);

        //绘画底图(原图片)其中的0代表和原图位置一样
        graphics2D.drawImage(image, 0, 0, width, height, null);

        //设置水印透明度
        graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));

        //设置水印旋转
        double radians = Math.toRadians(degree);
        graphics2D.rotate(radians, (double) bufferedImage.getWidth() / 2, (double) bufferedImage.getHeight() / 2);

        //计算文本占用的宽度和高度
        Xys xys = getXys(width, height, radians);
        for (double x = xys.getMinX() - watermarkXSpace; x < xys.maxX+watermarkXSpace; x += (watermarkXSpace + watermarkImageWidth)) {
            for (double y = xys.minY - watermarkYSpace; y < xys.maxY+watermarkYSpace; y += (watermarkYSpace + watermarkImageHeight)) {
                graphics2D.drawImage(watermarkImage,(int) x, (int)y,watermarkImageWidth,watermarkImageHeight,null);
            }
        }

        graphics2D.dispose();
        //重置大小
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
        //直接以png输出,输出jpg格式图片不清晰 / 后续步骤其他工具进行压缩转格式即可
        ImageIO.write(bufferedImage,"png",bos);
        return  bos.toByteArray();
    }

 

关联:

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
Java graphics2D 生成水印(水印文字或水印图片)全角度全覆盖方式。 计算覆盖范围定义范围的四个点 @Data @AllArgsConstructo
问题描述在Java绘制图片/画图/添加文字水印等文字内容时候,总感觉y轴有一定的偏差,导致与预期效果不一致,尤其是生产证书类型业务,对不准很影响观感。drawS
坐标原点位于左上角,以像素为单位横坐标为x坐标,正方形水平向右,表示当前位置为水平方向,距离坐标原点x个像素;纵坐标为y坐标,正方形垂直向下,表示当前位置为垂
Newifi3 D2 硬件参数信息 Newifi3 D2 硬件配置信息 SOCMT7621A2.4G无线芯片MT7603EN5G 无线芯片MT7612EN5G 功放芯片SKY85717-21RA...
功能说明:1.指定图片大小缩放图片(reSize);2.指定图片的宽度,高度根据比例缩放(reSizeByWith);3.指定图片的高度,宽度根据比例缩放(reSizeByHeight);4.判...
一、Newifi 3(新路由3) D2刷Breed资源准备​硬件准备:Newifi 3(新路由3) D2 原厂固件路由器一台;电脑一台;网线一根; 软件准备:winscp( 文件复制工具)put...
java 图片 无损压缩。随着科技进步,大家手机拍的照片也从之前的几百KB变成几MB或者10MB了,有些情况我们需要压缩一下图片节省网络资源。这里将会讲解如何采用Java语音进行图片的无损压缩
Java编程中,很多报表系统需要导出Excel文件,并且某些时候需要导出一定的图形统计,其实就是将图片放在Excel中,下面讲解Java如何实现Excel图片编辑插入
前言本文主要对新路由3 D2和小米路由3G做一个实际的使用测评
Java图片等比缩放 //重置大小(太宽没啥用)最大支持1.5倍图(1150*1.5) int maxWidth=(int)(920*1.5); //大小重置
spring boot 入门之security oauth2 jwt完美整合例子,Java编程中spring boot框架+spring security框架+spring security o...
java实现生成彩色背景图片验证码,在登陆和注册可以使用,工具类将图片的IO流通过response输出到浏览器,在浏览器中可以使用 img标签的src属性路径写上该工具类的访问路径即可。
问题描述idea启动maven的JavaFX项目报错:Exception in Application start method java.lang.reflect.InvocationTarg...
Java编程中处理图片文件与base64串的图片相互转化工具类,方便在编程中处理前端传递过来的base64图片。
本文主要翻译spring官方的基于spring security框架的oauth2开发指南,spring,oauth2,spring框架,Java编程