[图像处理] Java 给图片增加 水印图片 水印文字
javapub
2010-09-07
很多时候会用到给图片增加水印,这个时候我推荐利用“光影魔术手”,它完成水印的功能非常强大,而且也可以批处理,不过Java也可以非常轻松的完成这些事情,但效果也打点折扣,坦诚点说吧,java在图像处理方面确实不如c++,不过这本来就不是java的强项,都可以理解。
利用Java给图片增加水印道理很简单:利用Java在内存中加载一副图片,然后在此基础上加载第二幅图片,而这叠加就成了水印,同时第二幅图片您可以控制图片的透明度。水印文字也一个道理。利用这个道理,你甚至可以做到组合图片等等操作,只有想不到,没有做不到。 代码正在整理最近随后放上去。这里就把算法说一下。 水印图片的方法是:Graphics2D的drawImage(waterImage, x, y, width, height, null); 水印文字的方法是:Graphics2D的drawString(pressText, x, y); /** * 添加图片水印 * * @param targetImg * 目标图片路径,如:C:\\kutuku.jpg * @param waterImg * 水印图片路径,如:C:\\kutuku.png * @param x * 水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间 * @param y * 水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间 * @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, file); } catch (IOException e) { e.printStackTrace(); } } /** * 添加文字水印 * * @param targetImg * 目标图片路径,如:C:\\kutoku.jpg * @param pressText * 水印文字, 如:kutuku.com * @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, file); } catch (Exception e) { e.printStackTrace(); } } 文章地址:http://javapub.iteye.com/blog/711045 相关文章 Java图像图片 边缘检测 http://javapub.iteye.com/blog/685468 Java图像变灰 http://javapub.iteye.com/blog/687082 Java 给图片增加 水印图片 水印文字 [url]Java 给图片增加 水印图片 水印文字[/url] Java图像渐变 http://javapub.iteye.com/blog/736799 Java将大图片转成小图片 http://javapub.iteye.com/blog/666607 |