图片生成水印,可设置角度,位子,


    /**
     * 判断水印是否在显示的图片像素内
     * 显示位子x轴向
     * 显示位子y轴向
     * 水印图片宽度
     * 水印图片高度
     * 源图宽度
     * 源图高度
     * @param degree
     */
    public static String watermarkGps(int ...position){
        String erorr = null;
        int x = position[0];
        int y = position[1];
        int iconPathX = position[2];
        int iconPathY = position[3];
        int imgSrcX = position[4];
        int imgSrcY = position[5];
        if(x > (imgSrcX - iconPathX)){
            erorr ="您所设置的宽度已经超出,建议请在"+(imgSrcX - iconPathX)+"以内";
            return erorr;
        }
        if(y > (imgSrcY - iconPathY)){
            erorr ="您所设置的高度已经超出,建议请在"+(imgSrcY - iconPathY)+"以内";
            return erorr;
        }
        return erorr;
    }
    
    /**
     * 生成水印图片,可添加角度,水印在图片显示的位置
     * @param imgSrc 源图片路径
     * @param degree 水印图片旋转角度
     * @param iconPath 水印图片路径  
     * @param targerPath 目标图片路径  
     */
    public static boolean addImageWatermark(String imgSrc,Integer degree,String iconPath,String targerPath,int x,int y){
        OutputStream os = null;
        try {
            //读取图片
            Image srcImage = ImageIO.read(new File(imgSrc));
            //创建一个不带透明色的BufferedImage对象
            BufferedImage buffImage = new BufferedImage(srcImage.getWidth(null), srcImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
            /*
             * 创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中
             * 用于绘制到此图像中的 Graphics2D
             *
             * Graphics2D定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式;
             * 设定平移、旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。图形状态属性用特定的对象存储
             */
            //Graphics2D 绘图属性  ,得到画笔对象
            Graphics2D g = buffImage.createGraphics();
            /*
             * RenderingHints 类包含可由 Graphics2D 类,以及实现 BufferedImageOp 和 Raster 的类使用的呈现提示
             * KEY_INTERPOLATION 插值提示键
             * VALUE_INTERPOLATION_BILINEAR  插值提示值——INTERPOLATION_BILINEAR。
             * */
            //设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            
            /*参数1: 在呈现之前要应用到图像的过滤器
             *参数2: 要呈现的指定 BufferedImage 如果 img 为 null,则此方法不执行任何动作。
             *参数3: 该位置的 x 坐标,它位于呈现该图像左上角的用户空间中
             *参数4:该位置的 y 坐标,它位于呈现该图像左上角的用户空间中
             *
             * getScaledInstance() 方法说明:
             *     创建此图像的缩放版本。返回一个新的 Image 对象,默认情况下,该对象按指定的 width 和 height 呈现图像。
             *     即使已经完全加载了初始源图像,新的 Image 对象也可以被异步加载。
             *    如果 width 或 height 为负数,则替换该值以维持初始图像尺寸的高宽比。如果 width 和 height 都为负,则使用初始图像尺寸 。
             *    width - 将图像缩放到的宽度。
                height - 将图像缩放到的高度。
                hints - 指示用于图像重新取样的算法类型的标志。
             */
            g.drawImage(srcImage.getScaledInstance(srcImage.getWidth(null), srcImage.getHeight(null), srcImage.SCALE_SMOOTH),0,0,null);
            if(null != degree){
                /*g.rotate();
                 *将当前的 Graphics2D Transform 与平移后的旋转转换连接。后续呈现的变换是平移到指定位置,旋转指定弧度,然后向回平移相同的距离
                 *参数1:旋转的角度,以弧度表示
                 *参数2:旋转原点的 x 坐标
                 *参数3:旋转原点的 x 坐标
                 */
                // 设置水印旋转
                g.rotate(Math.toRadians(degree),buffImage.getWidth()/2,buffImage.getHeight()/2);
            }
            
            //获取水印图象的路径 水印一般为gif或者png的,这样可设置透明度
            ImageIcon imageIcon = new ImageIcon(iconPath);
            //判断水印显示的位置是否在图片像素内
            String pd = watermarkGps(x,y,imageIcon.getIconWidth(),imageIcon.getIconHeight(),buffImage.getWidth(), buffImage.getHeight());
            if(null != pd){
                System.out.println(pd);
                return false;
            }
            //得到 Image 对象
            Image image = imageIcon.getImage();
            /*1 - 在呈现之前要应用到图像的过滤器
              2 - 要呈现的指定 BufferedImage 如果 img 为 null,则此方法不执行任何动作。
              3 - 该位置的 x 坐标,它位于呈现该图像左上角的用户空间中
              4 - 该位置的 y 坐标,它位于呈现该图像左上角的用户空间中
             */
            // 表示水印图片的位置   
            g.drawImage(image, x, y, null);  
            
            /*setComposite() 指定新的像素如何在呈现过程中与图形设备上的现有像素组合
             *AlphaComposite 类实现一些基本的 alpha 合成规则,将源色与目标色组合,在图形和图像中实现混合和透明效果
             *SRC_OVER 在目标色之上合成源色
             */
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            
            //释放此图形的上下文并释放它所使用的所有系统资源
            g.dispose();
            
            //图片输出流
            os = new FileOutputStream(targerPath);
            ImageIO.write(buffImage, "jpg", os);
            
        } catch (Exception  e) {
            e.printStackTrace();
            return false;
        }finally{
            try{
                if(os != null){
                    os.close();
                    return true;
                }
            }catch(Exception e){
                e.printStackTrace();
                return false;
            }
        }
        return false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值