import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.util.Random; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; /** * The tool to adding watermark to images,recommended markImage () methods to create watermark image. * * */ public class ImageWatermark { private static final int OFFSET_X = 10; private static final int OFFSET_Y = 10; public static final int MARK_LEFT_TOP = 1; public static final int MARK_RIGHT_TOP = 2; public static final int MARK_CENTER = 3; public static final int MARK_LEFT_BOTTOM = 4; public static final int MARK_RIGHT_BOTTOM = 5; /** * add a text to an image. as a single color, the effect is rather poor. * @param srcImg * @param text * @param font * @param color * @param offset_x * @param offset_y */ public static void markText(String srcImg,String text, Font font, Color color, int offset_x, int offset_y) { try { File _file = new File(srcImg); Image src = ImageIO.read(_file); int width = src.getWidth(null); int height = src.getHeight(null); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.createGraphics(); g.drawImage(src, 0, 0, width, height, null); // g.setBackground(Color.white); g.setColor(color); g.setFont(font); g.drawString(text, offset_x, height - font.getSize() / 2 - offset_y); g.dispose(); FileOutputStream out = new FileOutputStream(srcImg); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); } catch (Exception e) { e.printStackTrace(); } } /** * A logo picture to picture and watermark, effective this way * one instance : http://www.mvgod.com/images/poster/NaNiYaChuanQi2XKaiSiBinWangZi-10285-12811-19978-13383/3.jpg * @param srcImg -- * source image * @param markImg -- * watermark logo image * @param alpha -- * alpha composite 0 - 1, 0 Full transparency, 1 Opaque * @param mark_position -- * Watermark position, the four corners and central respectively, * and so constant that ImageWatermark.MARK_LEFT_TOP */ public final static void markImage(String srcImg, String markImg, float alpha, int mark_position) { try { File _file = new File(srcImg); if(!_file.exists()) return; Image src = ImageIO.read(_file); int width = src.getWidth(null); int height = src.getHeight(null); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); g.drawImage(src, 0, 0, width, height, null); // watermark image file File markFile = new File(markImg); if(!markFile.exists()) return; Image mark_img = ImageIO.read(markFile); int mark_img_width = mark_img.getWidth(null); int mark_img_height = mark_img.getHeight(null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); switch (mark_position) { case ImageWatermark.MARK_LEFT_TOP: g.drawImage(mark_img, OFFSET_X, OFFSET_Y, mark_img_width, mark_img_height, null); break; case ImageWatermark.MARK_LEFT_BOTTOM: g.drawImage(mark_img, OFFSET_X, (height - mark_img_height - OFFSET_Y), mark_img_width, mark_img_height, null); break; case ImageWatermark.MARK_CENTER: g.drawImage(mark_img, (width - mark_img_width - OFFSET_X) / 2, (height - mark_img_height - OFFSET_Y) / 2, mark_img_width, mark_img_height, null); break; case ImageWatermark.MARK_RIGHT_TOP: g.drawImage(mark_img, (width - mark_img_width - OFFSET_X), OFFSET_Y, mark_img_width, mark_img_height, null); break; case ImageWatermark.MARK_RIGHT_BOTTOM: default: g.drawImage(mark_img, (width - mark_img_width - OFFSET_X), (height - mark_img_height - OFFSET_Y), mark_img_width, mark_img_height, null); } g.dispose(); FileOutputStream out = new FileOutputStream(srcImg); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); } catch (Exception e) { e.printStackTrace(); } } public static void markImage(String srcImg, String markImg, float alpha) { markImage(srcImg, markImg, alpha, ImageWatermark.MARK_RIGHT_BOTTOM); } public static void markImage( String srcImg, String markImg) { markImage(srcImg, markImg, 0.5f, ImageWatermark.MARK_RIGHT_BOTTOM); } public static void markImageRandomPos(String srcImg,String markImg, float alpha) { int[] a = { ImageWatermark.MARK_LEFT_TOP, ImageWatermark.MARK_RIGHT_TOP, ImageWatermark.MARK_LEFT_TOP, ImageWatermark.MARK_LEFT_BOTTOM, ImageWatermark.MARK_RIGHT_BOTTOM, ImageWatermark.MARK_RIGHT_BOTTOM, ImageWatermark.MARK_CENTER }; int i = new Random().nextInt(a.length); markImage(srcImg, markImg, alpha, a[i]); } /** * Semi-transparent, random location imprint. * With a slightly higher risk of lower right corner of the upper left corner, the central minimum risk. * @param srcImg * @param markImg */ public static void markImageRandomPos(String srcImg,String markImg) { markImageRandomPos(srcImg, markImg, 0.5f); } public static void main(String[] args) { //test String src_path = "/home/mvgod/car.jpg"; String markImg = "/home/mvgod/logo.png" float alpha = 0.5f; String text = "MVGod.com"; Font font =new Font("Arial", Font.BOLD, 30) ImageWatermark.markText(text, src_path, font, Color.gray, 5, 5); ImageWatermark.markImage( src_path, markImg, alpha, ImageWatermark.MARK_CENTER); // ImageWatermark.markImageRandomPos(src_path,markImg); } }...
Read more