java–图片水印、压缩

有关图片增加水印图片、水印文字、图片压缩,代码如下:

源码来源于网上,稍作改动。

 

[java][/java] view plaincopy

  1. package com.test;
  2. import java.awt.AlphaComposite;
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics2D;
  6. import java.awt.Image;
  7. import java.awt.geom.AffineTransform;
  8. import java.awt.image.AffineTransformOp;
  9. import java.awt.image.BufferedImage;
  10. import java.io.ByteArrayOutputStream;
  11. import java.io.File;
  12. import java.io.IOException;
  13. import javax.imageio.ImageIO;
  14. /**
  15.  * 图片工具类, 图片水印,文字水印,缩放,补白等
  16.  *
  17.  * @author gp
  18.  */
  19. public final class WaterPress {
  20.     /** 图片格式:JPG */
  21.     private static final String PICTRUE_FORMATE_JPG = “jpg”;
  22.     private WaterPress() {
  23.     }
  24.     /**
  25.      * 添加图片水印
  26.      *
  27.      * @param targetImg
  28.      *            目标图片路径,如:d:/1.jpg
  29.      * @param waterImg
  30.      *            水印图片路径,如:d:/2.png
  31.      * @param x
  32.      *            水印的横坐标
  33.      * @param y
  34.      *            水印的纵坐标
  35.      * @param alpha
  36.      *            透明度(0.0 — 1.0, 0.0为完全透明,1.0为完全不透明)
  37.      */
  38.     public final static void pressImage(String targetImg, String waterImg,
  39.             int x, int y, float alpha) {
  40.         try {
  41.             File file = new File(targetImg);
  42.             Image image = ImageIO.read(file);
  43.             int width = image.getWidth(null);
  44.             int height = image.getHeight(null);
  45.             BufferedImage bufferedImage = new BufferedImage(width, height,
  46.                     BufferedImage.TYPE_INT_RGB);
  47.             Graphics2D g = bufferedImage.createGraphics();
  48.             g.drawImage(image, 0, 0, width, height, null);
  49.             Image waterImage = ImageIO.read(new File(waterImg)); // 水印文件
  50.             int width_1 = waterImage.getWidth(null);
  51.             int height_1 = waterImage.getHeight(null);
  52.             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  53.                     alpha));
  54.             int widthDiff = width – width_1;
  55.             int heightDiff = height – height_1;
  56.             if (x < 0) {
  57.                 x = widthDiff / 2;
  58.             } else if (x > widthDiff) {
  59.                 x = widthDiff;
  60.             }
  61.             if (y < 0) {
  62.                 y = heightDiff / 2;
  63.             } else if (y > heightDiff) {
  64.                 y = heightDiff;
  65.             }
  66.             g.drawImage(waterImage, x, y, width_1, height_1, null); // 水印文件结束
  67.             g.dispose();
  68.             // 将已经做过水印处理的图片流写到本地
  69.             ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, new File(“d://3.jpg”));
  70.         } catch (IOException e) {
  71.             e.printStackTrace();
  72.         }
  73.     }
  74.     /**
  75.      * 添加文字水印
  76.      *
  77.      * @param targetImg
  78.      *            目标图片路径,如:C://myPictrue//1.jpg
  79.      * @param pressText
  80.      *            水印文字, 如:中国证券网
  81.      * @param fontName
  82.      *            字体名称, 如:宋体
  83.      * @param fontStyle
  84.      *            字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)
  85.      * @param fontSize
  86.      *            字体大小,单位为像素
  87.      * @param color
  88.      *            字体颜色
  89.      * @param x
  90.      *            水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间
  91.      * @param y
  92.      *            水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间
  93.      * @param alpha
  94.      *            透明度(0.0 — 1.0, 0.0为完全透明,1.0为完全不透明)
  95.      */
  96.     public static void pressText(String targetImg, String pressText,
  97.             String fontName, int fontStyle, int fontSize, Color color, int x,
  98.             int y, float alpha) {
  99.         try {
  100.             File file = new File(targetImg);
  101.             Image image = ImageIO.read(file);
  102.             int width = image.getWidth(null);
  103.             int height = image.getHeight(null);
  104.             BufferedImage bufferedImage = new BufferedImage(width, height,
  105.                     BufferedImage.TYPE_INT_RGB);
  106.             Graphics2D g = bufferedImage.createGraphics();
  107.             g.drawImage(image, 0, 0, width, height, null);
  108.             g.setFont(new Font(fontName, fontStyle, fontSize));
  109.             g.setColor(color);
  110.             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
  111.                     alpha));
  112.             int width_1 = fontSize * getLength(pressText);
  113.             int height_1 = fontSize;
  114.             int widthDiff = width – width_1;
  115.             int heightDiff = height – height_1;
  116.             if (x < 0) {
  117.                 x = widthDiff / 2;
  118.             } else if (x > widthDiff) {
  119.                 x = widthDiff;
  120.             }
  121.             if (y < 0) {
  122.                 y = heightDiff / 2;
  123.             } else if (y > heightDiff) {
  124.                 y = heightDiff;
  125.             }
  126.             g.drawString(pressText, x, y + height_1);
  127.             g.dispose();
  128.             ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, new File(“d://4.jpg”));
  129.         } catch (Exception e) {
  130.             e.printStackTrace();
  131.         }
  132.     }
  133.     /**
  134.      * 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符
  135.      *
  136.      * @param text
  137.      * @return 字符长度,如:text=”中国”,返回 2;text=”test”,返回 2;text=”中国ABC”,返回 4.
  138.      */
  139.     public static int getLength(String text) {
  140.         int textLength = text.length();
  141.         int length = textLength;
  142.         for (int i = 0; i < textLength; i++) {
  143.             if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
  144.                 length++;
  145.             }
  146.         }
  147.         return (length % 2 == 0) ? length / 2 : length / 2 + 1;
  148.     }
  149.     /**
  150.      * 图片缩放
  151.      *
  152.      * @param filePath
  153.      *            图片路径
  154.      * @param height
  155.      *            高度
  156.      * @param width
  157.      *            宽度
  158.      * @param bb
  159.      *            比例不对时是否需要补白
  160.      */
  161.     public static void resize(String filePath, int height, int width, boolean bb) {
  162.         try {
  163.             double ratio = 0; // 缩放比例
  164.             File f = new File(filePath);
  165.             BufferedImage bi = ImageIO.read(f);
  166.             Image itemp = bi.getScaledInstance(width, height,
  167.                     BufferedImage.SCALE_SMOOTH);
  168.             // 计算比例
  169.             if ((bi.getHeight() > height) || (bi.getWidth() > width)) {
  170.                 if (bi.getHeight() > bi.getWidth()) {
  171.                     ratio = (new Integer(height)).doubleValue()
  172.                             / bi.getHeight();
  173.                 } else {
  174.                     ratio = (new Integer(width)).doubleValue() / bi.getWidth();
  175.                 }
  176.                 AffineTransformOp op = new AffineTransformOp(AffineTransform
  177.                         .getScaleInstance(ratio, ratio), null);
  178.                 itemp = op.filter(bi, null);
  179.             }
  180.             if (bb) {
  181.                 BufferedImage image = new BufferedImage(width, height,
  182.                         BufferedImage.TYPE_INT_RGB);
  183.                 Graphics2D g = image.createGraphics();
  184.                 g.setColor(Color.white);
  185.                 g.fillRect(0, 0, width, height);
  186.                 if (width == itemp.getWidth(null))
  187.                     g.drawImage(itemp, 0, (height – itemp.getHeight(null)) / 2,
  188.                             itemp.getWidth(null), itemp.getHeight(null),
  189.                             Color.white, null);
  190.                 else
  191.                     g.drawImage(itemp, (width – itemp.getWidth(null)) / 2, 0,
  192.                             itemp.getWidth(null), itemp.getHeight(null),
  193.                             Color.white, null);
  194.                 g.dispose();
  195.                 itemp = image;
  196.             }
  197.             ImageIO.write((BufferedImage) itemp, “jpg”, new File(“d://5.jpg”));
  198.         } catch (IOException e) {
  199.             e.printStackTrace();
  200.         }
  201.     }
  202.     public static void main(String[] args) throws IOException {
  203.         // 打水印图片
  204.         pressImage(“d://1.jpg”, “d://2.png”, 400, 1500, 0.5f);
  205.         // 打水印文字
  206.         pressText(“d://1.jpg”, “GP之印”, “宋体”, Font.BOLD | Font.ITALIC, 60,
  207.                 Color.YELLOW, 400, 100, 1f);
  208.         // 图片压缩
  209.         resize(“d://1.jpg”, 1000, 500, true);
  210.     }
  211. }

标签