Java添加图片水印

2019-03-25 13:47|来源: 网络

周末在家上围脖,看到sina围脖上图片都有水印,想到Java有专门Image的处理包,同样应该可以实现水印功能,查了资料小试下来发现java实现水印还是非常方便的,水印可以是图片或者文字,而且还可以选择不同的角度旋转呢,以后有需要可以写个代码批量处理自己的图片了。


本门目录:

  • 图片水印

  • 文字水印

[一]、图片水印

  1. package michael.io.image;  

  2.  

  3. import java.awt.AlphaComposite;  

  4. import java.awt.Graphics2D;  

  5. import java.awt.Image;  

  6. import java.awt.RenderingHints;  

  7. import java.awt.image.BufferedImage;  

  8. import java.io.File;  

  9. import java.io.FileInputStream;  

  10. import java.io.FileOutputStream;  

  11. import java.io.InputStream;  

  12. import java.io.OutputStream;  

  13.  

  14. import javax.imageio.ImageIO;  

  15. import javax.swing.ImageIcon;  

  16.  

  17. import com.sun.image.codec.jpeg.JPEGCodec;  

  18. import com.sun.image.codec.jpeg.JPEGImageDecoder;  

  19. import com.sun.image.codec.jpeg.JPEGImageEncoder;  

  20.  

  21. /**

  22. * 图片水印

  23. * @blog http://sjsky.iteye.com

  24. * @author Michael

  25. */  

  26. public class ImageMarkLogoByIcon {  

  27.  

  28.    /**

  29.     * @param args

  30.     */  

  31.    public static void main(String[] args) {  

  32.        String srcImgPath = "d:/test/michael/myblog_01.png";  

  33.        String iconPath = "d:/test/michael/blog_logo.png";  

  34.        String targerPath = "d:/test/michael/img_mark_icon.jpg";  

  35.        String targerPath2 = "d:/test/michael/img_mark_icon_rotate.jpg";  

  36.        // 给图片添加水印  

  37.        ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath);  

  38.        // 给图片添加水印,水印旋转-45  

  39.        ImageMarkLogoByIcon.markImageByIcon(iconPath, srcImgPath, targerPath2,  

  40.                -45);  

  41.  

  42.    }  

  43.  

  44.    /**

  45.     * 给图片添加水印

  46.     * @param iconPath 水印图片路径

  47.     * @param srcImgPath 源图片路径

  48.     * @param targerPath 目标图片路径

  49.     */  

  50.    public static void markImageByIcon(String iconPath, String srcImgPath,  

  51.            String targerPath) {  

  52.        markImageByIcon(iconPath, srcImgPath, targerPath, null);  

  53.    }  

  54.  

  55.    /**

  56.     * 给图片添加水印、可设置水印图片旋转角度

  57.     * @param iconPath 水印图片路径

  58.     * @param srcImgPath 源图片路径

  59.     * @param targerPath 目标图片路径

  60.     * @param degree 水印图片旋转角度

  61.     */  

  62.    public static void markImageByIcon(String iconPath, String srcImgPath,  

  63.            String targerPath, Integer degree) {  

  64.        OutputStream os = null;  

  65.        try {  

  66.            Image srcImg = ImageIO.read(new File(srcImgPath));  

  67.  

  68.            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),  

  69.                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);  

  70.  

  71.            // 得到画笔对象  

  72.            // Graphics g= buffImg.getGraphics();  

  73.            Graphics2D g = buffImg.createGraphics();  

  74.  

  75.            // 设置对线段的锯齿状边缘处理  

  76.            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,  

  77.                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);  

  78.  

  79.            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg  

  80.                    .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);  

  81.  

  82.            if (null != degree) {  

  83.                // 设置水印旋转  

  84.                g.rotate(Math.toRadians(degree),  

  85.                        (double) buffImg.getWidth() / 2, (double) buffImg  

  86.                                .getHeight() / 2);  

  87.            }  

  88.  

  89.            // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度  

  90.            ImageIcon imgIcon = new ImageIcon(iconPath);  

  91.  

  92.            // 得到Image对象。  

  93.            Image img = imgIcon.getImage();  

  94.  

  95.            float alpha = 0.5f; // 透明度  

  96.            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,  

  97.                    alpha));  

  98.  

  99.            // 表示水印图片的位置  

  100.            g.drawImage(img, 150, 300, null);  

  101.  

  102.            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));  

  103.  

  104.            g.dispose();  

  105.  

  106.            os = new FileOutputStream(targerPath);  

  107.  

  108.            // 生成图片  

  109.            ImageIO.write(buffImg, "JPG", os);  

  110.  

  111.            System.out.println("图片完成添加Icon印章。。。。。。");  

  112.        } catch (Exception e) {  

  113.            e.printStackTrace();  

  114.        } finally {  

  115.            try {  

  116.                if (null != os)  

  117.                    os.close();  

  118.            } catch (Exception e) {  

  119.                e.printStackTrace();  

  120.            }  

  121.        }  

  122.    }  

  123. }  

原始图片myblog_01.jpg:

水印图片blog_logo.png:

添加水印后的效果图:


[二]、文字水印

  1. package michael.io.image;  

  2.  

  3. import java.awt.AlphaComposite;  

  4. import java.awt.Color;  

  5. import java.awt.Font;  

  6. import java.awt.Graphics2D;  

  7. import java.awt.Image;  

  8. import java.awt.RenderingHints;  

  9. import java.awt.image.BufferedImage;  

  10. import java.io.File;  

  11. import java.io.FileOutputStream;  

  12. import java.io.InputStream;  

  13. import java.io.OutputStream;  

  14.  

  15. import javax.imageio.ImageIO;  

  16.  

  17. /**

  18. * 文字水印

  19. * @blog http://sjsky.iteye.com

  20. * @author Michael

  21. */  

  22. public class ImageMarkLogoByText {  

  23.  

  24.    /**

  25.     * @param args

  26.     */  

  27.    public static void main(String[] args) {  

  28.        String srcImgPath = "d:/test/michael/myblog_01.jpg";  

  29.        String logoText = "[ 测试文字水印 http://sjsky.iteye.com ]";  

  30.        String targerPath = "d:/test/michael/img_mark_text.jpg";  

  31.  

  32.        String targerPath2 = "d:/test/michael/img_mark_text_rotate.jpg";  

  33.  

  34.        // 给图片添加水印  

  35.        ImageMarkLogoByText.markByText(logoText, srcImgPath, targerPath);  

  36.  

  37.        // 给图片添加水印,水印旋转-45  

  38.        ImageMarkLogoByText.markByText(logoText, srcImgPath, targerPath2, -45);  

  39.    }  

  40.  

  41.    /**

  42.     * 给图片添加水印

  43.     * @param logoText

  44.     * @param srcImgPath

  45.     * @param targerPath

  46.     */  

  47.    public static void markByText(String logoText, String srcImgPath,  

  48.            String targerPath) {  

  49.        markByText(logoText, srcImgPath, targerPath, null);  

  50.    }  

  51.  

  52.    /**

  53.     * 给图片添加水印、可设置水印的旋转角度

  54.     * @param logoText

  55.     * @param srcImgPath

  56.     * @param targerPath

  57.     * @param degree

  58.     */  

  59.    public static void markByText(String logoText, String srcImgPath,  

  60.            String targerPath, Integer degree) {  

  61.        // 主图片的路径  

  62.        InputStream is = null;  

  63.        OutputStream os = null;  

  64.        try {  

  65.            Image srcImg = ImageIO.read(new File(srcImgPath));  

  66.  

  67.            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),  

  68.                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);  

  69.  

  70.            // 得到画笔对象  

  71.            // Graphics g= buffImg.getGraphics();  

  72.            Graphics2D g = buffImg.createGraphics();  

  73.  

  74.            // 设置对线段的锯齿状边缘处理  

  75.            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,  

  76.                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);  

  77.  

  78.            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg  

  79.                    .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);  

  80.  

  81.            if (null != degree) {  

  82.                // 设置水印旋转  

  83.                g.rotate(Math.toRadians(degree),  

  84.                        (double) buffImg.getWidth() / 2, (double) buffImg  

  85.                                .getHeight() / 2);  

  86.            }  

  87.  

  88.            // 设置颜色  

  89.            g.setColor(Color.red);  

  90.  

  91.            // 设置 Font  

  92.            g.setFont(new Font("宋体", Font.BOLD, 30));  

  93.  

  94.            float alpha = 0.5f;  

  95.            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,  

  96.                    alpha));  

  97.  

  98.            // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) .  

  99.            g.drawString(logoText, 150, 300);  

  100.  

  101.            g.dispose();  

  102.  

  103.            os = new FileOutputStream(targerPath);  

  104.  

  105.            // 生成图片  

  106.            ImageIO.write(buffImg, "JPG", os);  

  107.  

  108.            System.out.println("图片完成添加文字印章。。。。。。");  

  109.        } catch (Exception e) {  

  110.            e.printStackTrace();  

  111.        } finally {  

  112.            try {  

  113.                if (null != is)  

  114.                    is.close();  

  115.            } catch (Exception e) {  

  116.                e.printStackTrace();  

  117.            }  

  118.            try {  

  119.                if (null != os)  

  120.                    os.close();  

  121.            } catch (Exception e) {  

  122.                e.printStackTrace();  

  123.            }  

  124.        }  

  125.    }  

  126. }  

添加文字水印后的效果图如下:

文字旋转后的效果图如下:



本文链接:Java添加图片水印,转自:Michael's blog @ http://sjsky.iteye.com

相关问答

更多
  • Canvas类是AWT包下的。 它有paint方法。 所以我推荐的思路是,覆盖它的paint方法。 比如说: 另外新建一个类MyCanvas,继承Canvas, 然后覆盖paint(Graphics g){ // } 方法体内部这样写 g.drawImage( new ImageIcon("src/test.jpg").getImage(), 0, 0, 100, 100, this); } 然后在现在这个类里要用的话,用MyCanvas代替Canvas,要改变绘图的话,只需要调用repaint方法即可。
  • java图片处理[2022-05-31]

    使用Java动态处理图片非常方便,可以用于很多应用场合,比如动态输入股市线,缩略图,动态banner图片、动态的界面风格等等。笔者也在 java图片处理:
  • import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import javax.swing.ImageIcon; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.im ...
  • 第一步,运行TSR Watermark Image程序,点击Next。 第二步:选择程序所安装的路径。 第三步:是否添加快捷方式至桌面,按默认的即可。 第四步:安装完成,选择Launch Watermark Image打开本款软件。 第五步:打开软件之后,系统会提示你是否自动检查版本,选择否即可。
  • 平时大家使用的最频繁的截图工具估计是QQ自带的ctrl+alt+a截图了,不过这个截图方式在聊天中用用尚可,有时候需要给截好的图作修改就比较不方便了。西西给大家介绍一款很不错的截图工具snagit,这款截图软件默认的快捷键是windows系统自带的截图按钮printscreen,而且功能还很多。今天教大家如何用snagit给图片添加水印。   软件下载:snagit下载   软件介绍:   上面给大家提供的snagit是小编平时喜欢用的版本,这个版本是绿色版不用安装破解导入注册表即可使用,非常方便。下载完毕 ...
  • 软件下载:snagit下载 软件介绍: 上面给大家提供的snagit是小编平时喜欢用的版本,这个版本是绿色版不用安装破解导入注册表即可使用,非常方便。下载完毕后解压缩到指定位置,找到程序文件夹中的“请导入注册表.reg”文件并点击导入。 导入成功后点击Snagit.exe打开程序,Snagit有一个主界面用于设置截图的预设方案以及水印添加设置,另外还有一个Snagit编辑器可以修改图片并保存截图。 Snagit主界面 Snagit编辑器 如何用snagit给图片加水印: snagit可以先预设一个要添加的水 ...
  • PHP手册中的一个很好的例子 : // Load the stamp and the photo to apply the watermark to $stamp = imagecreatefrompng('stamp.png'); $im = imagecreatefromjpeg('photo.jpeg'); // Set the margins for the stamp and get the height/width of the stamp image $marge_right = 10; $ ...
  • 理论上? 是的。 大多数可以生成水印的Java库可能都是用纯Java编写的,因此您可以自己编写该功能。 几乎? 没有(据我所知,如果我错了请纠正我)任何允许你以这种方式操作PDF的核心库,所以你可以投入大量工作来基本复制部分iTexts功能或只需使用一个库。 In theory? Yes, it is. Most Java libraries that can produce watermarks are probably written in pure Java, so you could write t ...
  • 这就是我想要的: http : //phpthumb.sourceforge.net/以下是另一种选择: https : //code.google.com/p/timthumb/ This is what I was looking for: http://phpthumb.sourceforge.net/ Here is an alternative too: https://code.google.com/p/timthumb/