继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java实现图片生成水印

大叔_fighting
关注TA
已关注
手记 81
粉丝 44
获赞 400

要先得到缓存图片对象
3个工具类:
BufferedImage,Graphics2D,JPEGImageEncoder

文字水印: // 读取原图片信息
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);
g.setColor(markContentColor); //根据图片的背景设置水印颜色
g.setFont(font); //设置字体

        //设置水印的坐标
        int x = srcImgWidth - 2*getWatermarkLength(waterMarkContent, g);  
        int y = srcImgHeight - 2*getWatermarkLength(waterMarkContent, g);  
        g.drawString(waterMarkContent, x, y);  //画出水印
        g.dispose();  
        // 输出图片  
        FileOutputStream outImgStream = new FileOutputStream(tarImgPath);  
        ImageIO.write(bufImg, "jpg", outImgStream);
        System.out.println("添加水印完成");  
        outImgStream.flush();  
        outImgStream.close();  

图片水印:/**

  • 给图片添加水印、可设置水印图片旋转角度
  • @param iconPath 水印图片路径
  • @param srcImgPath 源图片路径
  • @param targerPath 目标图片路径
  • @param degree 水印图片旋转角度
    */
    public static void markImageByIcon(String iconPath, String srcImgPath,
    String targerPath, Integer degree) {
    OutputStream os = null;
    try {
    Image srcImg = ImageIO.read(new File(srcImgPath));

        BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),   
                srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);   
    
        // 得到画笔对象   
        // Graphics g= buffImg.getGraphics();   
        Graphics2D g = buffImg.createGraphics();   
    
        // 设置对线段的锯齿状边缘处理   
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,   
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);   
    
        g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg   
                .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);   
    
        if (null != degree) {   
            // 设置水印旋转   
            g.rotate(Math.toRadians(degree),   
                    (double) buffImg.getWidth() / 2, (double) buffImg   
                            .getHeight() / 2);   
        }   
    
        // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度   
        ImageIcon imgIcon = new ImageIcon(iconPath);   
    
        // 得到Image对象。   
        Image img = imgIcon.getImage();   
    
        float alpha = 0.5f; // 透明度   
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,   
                alpha));   
    
        // 表示水印图片的位置   
        g.drawImage(img, 150, 300, null);   
    
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));   
    
        g.dispose();   
    
        os = new FileOutputStream(targerPath);   
    
        // 生成图片   
        ImageIO.write(buffImg, "JPG", os);   
    
        System.out.println("图片完成添加Icon印章。。。。。。");   
    } catch (Exception e) {   
        e.printStackTrace();   
    } finally {   
        try {   
            if (null != os)   
                os.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   

    }

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP

热门评论

你好 我用这方法在在并发的情况下处理2M的图片加水印时抛OOM异常 该怎么处理 还望指导一下 谢谢

查看全部评论