圖片加水印信息處理及中文亂碼解決


一,准備步驟

 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 最后重新啟動需要用到這個字體的項目 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM