這是個很經常使用的操做,通常咱們的網站在用戶上傳圖片時都會給圖片添加一個水印以防止其餘站點盜圖的行爲java
實現功能:①給圖片增長文字水印②給圖片增長圖片水印測試
// 加文字水印 public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) { Graphics2D g = bufImg.createGraphics(); g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null); g.setColor(color); g.setFont(font); g.drawString(text, x, y); g.dispose(); }
// 加圖片水印 public void mark(BufferedImage bufImg, Image img, Image markImg, int width, int height, int x, int y) { Graphics2D g = bufImg.createGraphics(); g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null); g.drawImage(markImg, x, y, width, height, null); g.dispose(); }
補充:字體
爲何要這麼寫?網站
考慮到該方法不只能夠用於給圖片文件增長水印,並且還能夠給視頻的每一幀圖像也添加,因此爲了方便不一樣場合重複使用,去除了沒必要要的依賴關係。ui
有了核心的兩個方法就咱們能夠給圖片文件增長水印了spa
/** * 給圖片增長文字水印 * * @param imgPath * -要添加水印的圖片路徑 * @param outImgPath * -輸出路徑 * @param text-文字 * @param font * -字體 * @param color * -顏色 * @param x * -文字位於當前圖片的橫座標 * @param y * -文字位於當前圖片的豎座標 */ public void mark(String imgPath, String outImgPath, String text, Font font, Color color, int x, int y) { try { // 讀取原圖片信息 File imgFile = null; Image img = null; if (imgPath != null) { imgFile = new File(imgPath); } if (imgFile != null && imgFile.exists() && imgFile.isFile() && imgFile.canRead()) { img = ImageIO.read(imgFile); } int imgWidth = img.getWidth(null); int imgHeight = img.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); mark(bufImg, img, text, font, color, x, y); // 輸出圖片 FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (Exception e) { e.printStackTrace(); } }
/** * 給圖片增長圖片水印 * * @param inputImg * -源圖片,要添加水印的圖片 * @param markImg * - 水印圖片 * @param outputImg * -輸出圖片(能夠是源圖片) * @param width * - 水印圖片寬度 * @param height * -水印圖片高度 * @param x * -橫座標,相對於源圖片 * @param y * -縱座標,同上 */ public void mark(String inputImg, String markImg, String outputImg, int width, int height, int x, int y) { // 讀取原圖片信息 File inputImgFile = null; File markImgFile = null; Image img = null; Image mark = null; try { if (inputImg != null && markImg != null) { inputImgFile = new File(inputImg); markImgFile = new File(markImg); } if (inputImgFile != null && inputImgFile.exists() && inputImgFile.isFile() && inputImgFile.canRead()) { img = ImageIO.read(inputImgFile); } if (markImgFile != null && markImgFile.exists() && markImgFile.isFile() && markImgFile.canRead()) { mark = ImageIO.read(markImgFile); } int imgWidth = img.getWidth(null); int imgHeight = img.getHeight(null); BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); mark(bufImg, img, mark, width, height, x, y); FileOutputStream outImgStream = new FileOutputStream(outputImg); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (IOException e) { e.printStackTrace(); } }
文字水印的字體和顏色須要自行定義,這裏咱們使用宋體,14號字體,顏色選擇橙色 - -!,座標是x軸0,y軸等於字體的大小,也就是圖片的左上角。.net
public static void main(String[] args) { Font font = new Font("宋體", Font.PLAIN, 14); // 原圖位置, 輸出圖片位置, 水印文字顏色, 水印文字 // new MarkText4J().mark("eguidMarkText2.jpg", "eguidMarkText2.jpg", "水印效果測試", font, Color.ORANGE, 0, 14); // 增長圖片水印 new MarkText4J().mark("eguidMarkText2.jpg", "eguid.jpg", "eguidMarkText3.jpg", 40, 20, 0, 14); }簡直棒極了,至此咱們能夠隨意的給圖片任意位置添加任意文字或者圖片水印了。
最後,額。。。導出的圖片比本來圖片還小是什麼鬼?歡迎加入討論羣一塊兒討論:371249677。- -!
code