一,准備步驟
1.1 原圖:D:\\文件表\\9252150_092049419327_2.jpg
1.2 logo圖片:D:\\文件表\\img\\生物質燃燒.png
二,源碼
根據自己的需要適當調整
1 /** 2 * 3 * @param srcImgPath 原圖片的路徑 4 * @param tarImgPath 新圖片的路徑 5 * @param Content1 水印的內容1 6 * @param logoImg logo圖片路徑 7 * @param Content2 水印的內容2 8 */ 9 public void mark(String srcImgPath,String tarImgPath,String Content1,String logoImg,String Content2) { 10 try { 11 12 /*// 打開服務器圖片路徑 13 URL url = new URL(srcImgPath); 14 URLConnection connection = url.openConnection(); 15 // 通過輸入流獲取圖片數據 16 InputStream is = connection.getInputStream(); 17 BufferedImage srcImg = ImageIO.read(is);*/ 18 19 Image srcImg = ImageIO.read(new File(srcImgPath));//圖片來源是本地路徑的讀取 20 //獲取原始圖片的寬和高 21 int srcImgwidth = srcImg.getWidth(null); 22 int srcImgheight = srcImg.getHeight(null); 23 24 //畫水印需要一個畫板 創建一個畫板 25 BufferedImage buffImg = new BufferedImage(srcImgwidth,srcImgheight,BufferedImage.TYPE_INT_RGB); 26 //創建一個2D的圖像 27 Graphics2D g = buffImg.createGraphics(); 28 //畫出來 29 g.drawImage(srcImg, 0, 0, srcImgwidth, srcImgheight,null); 30 31 //黑色 32 g.setColor(Color.BLACK); 33 // 1.0f為透明度 ,值從0-1.0,依次變得不透明 34 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.3f)); 35 //畫圖層 36 g.fillRect(srcImgwidth-230,srcImgheight-410, 200, 310); 37 38 //白色 39 g.setColor(Color.WHITE); 40 //設置畫筆的寬度. 越大,邊框越粗 41 g.setStroke(new BasicStroke(2F)); 42 // 設置線條透明度 ,值從0-1.0,依次變得不透明 43 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); 44 //畫矩形 45 g.drawRect(srcImgwidth-215, srcImgheight-395, 170, 280); 46 47 //設置水印的字體樣式 48 Font font = new Font("微軟雅黑", Font.PLAIN, 20); 49 g.setFont(font); 50 //根據獲取的坐標 在相應的位置畫出水印 51 g.drawString("林格曼黑度:",srcImgwidth-200, srcImgheight-360); 52 53 //設置水印的字體樣式 54 Font fonts = new Font("微軟雅黑", Font.PLAIN, 30); 55 g.setFont(fonts); 56 //根據獲取的坐標 在相應的位置畫出水印 57 g.drawString("3級",srcImgwidth-100, srcImgheight-355); 58 59 60 //設置水印的字體樣式 61 Font font1 = new Font("微軟雅黑", Font.BOLD, 34); 62 g.setFont(font1); 63 //根據獲取的坐標 在相應的位置畫出水印 64 g.drawString(Content1,srcImgwidth-205, srcImgheight-310); 65 66 67 //設置水印的字體樣式 68 Font font2 = new Font("微軟雅黑", Font.PLAIN, 20); 69 g.setFont(font2); 70 //根據獲取的坐標 在相應的位置畫出水印 71 g.drawString("區域實時AQI",srcImgwidth-190, srcImgheight-190); 72 73 //設置水印的字體樣式 74 Font font3 = new Font("微軟雅黑", Font.PLAIN, 60); 75 g.setFont(font3); 76 //根據獲取的坐標 在相應的位置畫出水印 77 g.drawString(Content2,srcImgwidth-180, srcImgheight-130); 78 79 // 水印logo圖象的路徑 水印一般為gif或者png的,這樣可設置透明度 80 ImageIcon imgIcon = new ImageIcon(logoImg); 81 // 得到Image對象。 82 Image img = imgIcon.getImage(); 83 // 透明度 84 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP)); 85 // 表示水印圖片的位置 86 g.drawImage(img, srcImgwidth-160, srcImgheight-290,imgIcon.getIconWidth()/2,imgIcon.getIconHeight()/2, null); 87 //g.drawImage(img.getScaledInstance(450,300,Image.SCALE_SMOOTH), 40, 450, this); 88 //釋放畫板的資源 89 g.dispose(); 90 91 //輸出新的圖片 92 FileOutputStream outputStream = new FileOutputStream(tarImgPath); 93 94 //創建新的圖片 95 ImageIO.write(buffImg, "png", outputStream); 96 System.out.println("水印添加完成!"); 97 98 //刷新流 99 outputStream.flush(); 100 //關閉流 101 outputStream.close(); 102 103 } catch (IOException e) { 104 e.printStackTrace(); 105 } 106 }
1 public static void main(String[] args) throws FileNotFoundException, URISyntaxException { 2 long startTime = System.currentTimeMillis(); 3 //log圖片位置 4 String logo ="D:\\文件表\\img\\生物質燃燒.png"; 5 6 //原圖1,服務器圖片 7 //String srcImgPath ="http://xxx.xxx.xxxx.xxx:8080/20191015/D54088974/111.53.146.19_01_20191015102934821_FIRE_SOURCE_DETECTION.jpg"; 8 //原圖2,本地圖片 9 String srcImgPath ="D:\\文件表\\9252150_092049419327_2.jpg"; 10 //加水印后圖片位置 11 String tarImgPath = "D:\\文件表\\生物質燃燒.jpg"; 12 String Content1 = "工業煙羽"; 13 String Content2 = "122"; 14 // 原圖位置, 輸出圖片位置, 水印文字顏色, 水印文字 15 new WaterMarkUtils().myuanark(srcImgPath, tarImgPath,Content1,logo,Content2); 16 long endTime = System.currentTimeMillis(); 17 System.out.println("程序運行時間:" + (endTime - startTime) + "ms"); //輸出程序運行時間 18 }
三,運行結果:
打開本地位置:D:\\文件表\\生物質燃燒.jpg
四.亂碼解決
4.1 以上代碼在本地win10運行一切正常,把代碼布置到linux上跑出的圖片如下,中文部分會亂碼
4.2 原因出在這里,我們設置的字體類型是“微軟雅黑”,而微軟雅黑字體,找不到對應的字庫,所以中文會亂碼,
4.3 解決辦法:
4.3.1 在c:/windows/fonts 文件夾下找到對應的字體,
4.3.2 進入jdk的字體庫
cd /usr/share/fonts/
4.3.3 在此路徑下建文件/chinese
mkdir chinese
4.3.4 把以上需要的字體庫拷入/usr/share/fonts/chinese
mkfontscale mkfontdir
mkfontscale和mkfontdir這兩個命令在有些服務器中會出現command not fount問題,這需要對命令進行安裝,具體可以通過百度這兩個命令查看yum安裝的命令。
4.3.5 執行命令,fc-cache掃描字體目錄並生成字體信息的緩存,然后應用程序就可以立即使用這些新安裝的字體。
fc-cache -fv //刷新系統字體緩存即刻生效
4.3.6 檢查字體是否添加成功
fc-list | grep 雅黑
4.3.7 最后重新啟動需要用到這個字體的項目