JAVA图片水印、压缩

JAVA图片水印、压缩


java--BufferedImage 与byte[]的互转


java-Java 里把 InputStream 转换成 String 的几种方法


java-页面数据生成图片


java--图片和BYTE数组的那些事


java--有关前台展示图片流的用法


JAVA--将二进制流转换成图片文件


 


 


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


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


 


/**


 * 图片工具类, 图片水印,文字水印,缩放,补白等


 *


 * @author gp


 */


public final class WaterPress {


         /** 图片格式:JPG */


         private static final String PICTRUE_FORMATE_JPG = "jpg";


 


         private WaterPress() {


         }


 


         /**


          * 添加图片水印


          *


          * @param targetImg


          *            目标图片路径,如:d:/1.jpg


          * @param waterImg


          *            水印图片路径,如:d:/2.png


          * @param x


          *            水印的横坐标


          * @param y


          *            水印的纵坐标


          * @param alpha


          *            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)


          */


         public final static void pressImage(String targetImg, String waterImg,


                           int x, int y, float alpha) {


                  try {


                           File file = new File(targetImg);


                           Image image = ImageIO.read(file);


                           int width = image.getWidth(null);


                           int height = image.getHeight(null);


                           BufferedImage bufferedImage = new BufferedImage(width, height,


                                             BufferedImage.TYPE_INT_RGB);


                           Graphics2D g = bufferedImage.createGraphics();


                           g.drawImage(image, 0, 0, width, height, null);


 


                           Image waterImage = ImageIO.read(new File(waterImg)); // 水印文件


                           int width_1 = waterImage.getWidth(null);


                           int height_1 = waterImage.getHeight(null);


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


                                             alpha));


 


                           int widthDiff = width - width_1;


                           int heightDiff = height - height_1;


                           if (x < 0) {


                                    x = widthDiff / 2;


                           } else if (x > widthDiff) {


                                    x = widthDiff;


                           }


                           if (y < 0) {


                                    y = heightDiff / 2;


                           } else if (y > heightDiff) {


                                    y = heightDiff;


                           }


                           g.drawImage(waterImage, x, y, width_1, height_1, null); // 水印文件结束


                           g.dispose();


                           // 将已经做过水印处理的图片流写到本地


                           ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, new File("d://3.jpg"));


                  } catch (IOException e) {


                           e.printStackTrace();


                  }


         }


 


         /**


          * 添加文字水印


          *


          * @param targetImg


          *            目标图片路径,如:C://myPictrue//1.jpg


          * @param pressText


          *            水印文字, 如:中国证券网


          * @param fontName


          *            字体名称, 如:宋体


          * @param fontStyle


          *            字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)


          * @param fontSize


          *            字体大小,单位为像素


          * @param color


          *            字体颜色


          * @param x


          *            水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间


          * @param y


          *            水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间


          * @param alpha


          *            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)


          */


         public static void pressText(String targetImg, String pressText,


                           String fontName, int fontStyle, int fontSize, Color color, int x,


                           int y, float alpha) {


                  try {


                           File file = new File(targetImg);


 


                           Image image = ImageIO.read(file);


                           int width = image.getWidth(null);


                           int height = image.getHeight(null);


                           BufferedImage bufferedImage = new BufferedImage(width, height,


                                             BufferedImage.TYPE_INT_RGB);


                           Graphics2D g = bufferedImage.createGraphics();


                           g.drawImage(image, 0, 0, width, height, null);


                           g.setFont(new Font(fontName, fontStyle, fontSize));


                           g.setColor(color);


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


                                             alpha));


 


                           int width_1 = fontSize * getLength(pressText);


                           int height_1 = fontSize;


                           int widthDiff = width - width_1;


                           int heightDiff = height - height_1;


                           if (x < 0) {


                                    x = widthDiff / 2;


                           } else if (x > widthDiff) {


                                    x = widthDiff;


                           }


                           if (y < 0) {


                                    y = heightDiff / 2;


                           } else if (y > heightDiff) {


                                    y = heightDiff;


                           }


 


                           g.drawString(pressText, x, y + height_1);


                           g.dispose();


                           ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, new File("d://4.jpg"));


                  } catch (Exception e) {


                           e.printStackTrace();


                  }


         }


 


         /**


          * 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符


          *


          * @param text


          * @return 字符长度,如:text="中国",返回 2text="test",返回 2text="中国ABC",返回 4.


          */


         public static int getLength(String text) {


                  int textLength = text.length();


                  int length = textLength;


                  for (int i = 0; i < textLength; i++) {


                           if (String.valueOf(text.charAt(i)).getBytes().length > 1) {


                                    length++;


                           }


                  }


                  return (length % 2 == 0) ? length / 2 : length / 2 + 1;


         }


 


         /**


          * 图片缩放


          *


          * @param filePath


          *            图片路径


          * @param height


          *            高度


          * @param width


          *            宽度


          * @param bb


          *            比例不对时是否需要补白


          */


         public static void resize(String filePath, int height, int width, boolean bb) {


                  try {


                           double ratio = 0; // 缩放比例


                           File f = new File(filePath);


                           BufferedImage bi = ImageIO.read(f);


                           Image itemp = bi.getScaledInstance(width, height,


                                             BufferedImage.SCALE_SMOOTH);


                           // 计算比例


                           if ((bi.getHeight() > height) || (bi.getWidth() > width)) {


                                    if (bi.getHeight() > bi.getWidth()) {


                                             ratio = (new Integer(height)).doubleValue()


                                                               / bi.getHeight();


                                    } else {


                                             ratio = (new Integer(width)).doubleValue() / bi.getWidth();


                                    }


                                    AffineTransformOp op = new AffineTransformOp(AffineTransform


                                                      .getScaleInstance(ratio, ratio), null);


                                    itemp = op.filter(bi, null);


                           }


                           if (bb) {


                                    BufferedImage image = new BufferedImage(width, height,


                                                      BufferedImage.TYPE_INT_RGB);


                                    Graphics2D g = image.createGraphics();


                                    g.setColor(Color.white);


                                    g.fillRect(0, 0, width, height);


                                    if (width == itemp.getWidth(null))


                                             g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,


                                                               itemp.getWidth(null), itemp.getHeight(null),


                                                               Color.white, null);


                                    else


                                             g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,


                                                               itemp.getWidth(null), itemp.getHeight(null),


                                                               Color.white, null);


                                    g.dispose();


                                    itemp = image;


                           }


                           ImageIO.write((BufferedImage) itemp, "jpg", new File("d://5.jpg"));


                  } catch (IOException e) {


                           e.printStackTrace();


                  }


         }


 


         public static void main(String[] args) throws IOException {


                  // 打水印图片


                  pressImage("d://1.jpg", "d://2.png", 400, 1500, 0.5f);


                  // 打水印文字


                  pressText("d://1.jpg", "GP之印", "宋体", Font.BOLD | Font.ITALIC, 60,


                                    Color.YELLOW, 400, 100, 1f);


                  // 图片压缩


                  resize("d://1.jpg", 1000, 500, true);


         }


}


 


 


 


获取图片流写法:


public static byte[] getPicture(String str) throws Exception {  


    BufferedImage bu = ImageIO.read(new File(str));  


    ByteArrayOutputStream imageStream = new ByteArrayOutputStream();  


    try {  


        boolean resultWrite = ImageIO.write(bu, "jpg", imageStream);  


    } catch (Exception e) {  


        e.printStackTrace();  


    }  


    imageStream.flush();  


    byte[] tagInfo = imageStream.toByteArray();  


  


    return tagInfo;  


}  


 


  • 发表于 2017-11-24 16:14
  • 阅读 ( 1618 )
  • 分类:Java

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
HJ社区-肖峰

IT

29 篇文章

作家榜 »

  1. 威猛的小站长 124 文章
  2. Jonny 65 文章
  3. 江南烟雨 36 文章
  4. - Nightmare 33 文章
  5. doublechina 31 文章
  6. HJ社区-肖峰 29 文章
  7. 伪摄影 22 文章
  8. Alan 14 文章