ImageMagick for java 使用Jmagick壓縮高質量圖片

    轉帖:http://www.i5a6.com/?p=142

    在做pdf文檔轉成jpg的時候,發現了Jmagick的創建高質量的圖片的一個java類庫,自己以前使用另外的一個類庫,感覺這個更好點,就試着用了下,感覺不錯。

1.使用的windows下的jmagick-win-6.3.9-Q16.zip 地址是:

http://downloads.jmagick.org/6.3.9/

2.doc對應的api地址:http://downloads.jmagick.org/jmagick-doc/

3.安裝ImageMagick,官方網站:http://www.imagemagick.org/

我使用的是:ImageMagick-6.4.6-4-Q16-windows-dll.exe點擊下載

4. 安裝ImageMagick-6.4.6-4-Q16-windows-dll.exe,將 安裝目錄下(按自己所安裝的目錄找) 下的所有dll文件 copy 到系統盤下的 “C:\WINDOWS\system32\”文件夾裏

5. 配置環境變量
再環境變量path裏添加新的值 “C:\Program Files\ImageMagick-6.4.6-4-Q16“使用IDE可以不用配置

6.解壓jmagick-win-6.3.9-Q16.zip
將 jmagick.dll 複製到系統盤下的 “C:\WINDOWS\system32\”文件夾裏 和 複製到jdk的bin(例“D:\jdk6\bin”)文件裏各一份
將 jmagick.jar 複製到Tomcat下的lib文件夾裏 和 所使用項目的WEB-INF下lib文件裏各一份
;還要將jmagick.jar複製到/jre/lib/ext下

7.web應用如果部署到tomcat下,那麼最好在catalina.bat文件中改變如下設置
set JAVA_OPTS=%JAVA_OPTS% -Xms256M -Xmx768M -XX:MaxPermSize=128M – Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager – Djava.util.logging.config.file=”${catalina.base}\conf\logging.properties”
避免heap溢出的問題,參數看你自己的機器而定。( -Xms256M -Xmx768M -XX:MaxPermSize=128M )

8.還要注意如果部署到web應用,你在使用的class裏面需要
System.setProperty(“jmagick.systemclassloader”,”no”);
要不然會報出UnsatisfiedLinkError: no JMagick in java.library.path.
實例測試code:

 

  1. package com.utils;  
  2.    
  3. import magick.ImageInfo;  
  4. import magick.MagickApiException;  
  5. import magick.MagickException;  
  6. import magick.MagickImage;  
  7.    
  8. public class Treamspdf {  
  9.  public static void main(String[] args) {  
  10. resetsize("E:/mylearn/workspace/TTPDF/src/com/utils/http_imgload.jpg","new.jpg");  
  11. }  
  12.     public static void resetsize(String picFrom,String picTo){  
  13.         try{  
  14.             ImageInfo info=new ImageInfo(picFrom);  
  15.             MagickImage image=new MagickImage(new ImageInfo(picFrom));  
  16.             MagickImage scaled=image.scaleImage(12097);  
  17.             scaled.setFileName(picTo);  
  18.             scaled.writeImage(info);  
  19.         }catch(MagickApiException ex){  
  20.             ex.printStackTrace();  
  21.         } catch(MagickException   ex)   {  
  22.             ex.printStackTrace();  
  23.         }  
  24.     }  
  25. }   

常用的水印,切圖,壓縮等簡單程序工具類,繼續下面

  1. package com.utils;     
  2.    
  3. import java.awt.Dimension;  
  4. import java.awt.Rectangle;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Date;     
  7.    
  8. import magick.CompositeOperator;  
  9. import magick.CompressionType;  
  10. import magick.DrawInfo;  
  11. import magick.ImageInfo;  
  12. import magick.MagickException;  
  13. import magick.MagickImage;  
  14. import magick.PixelPacket;  
  15. import magick.PreviewType;     
  16.    
  17. public class Aa {     
  18.    
  19.     static{  
  20.         //不能漏掉這個,不然jmagick.jar的路徑找不到  
  21.         System.setProperty("jmagick.systemclassloader","no");  
  22.     }     
  23.    
  24.     /**  
  25.      * 壓縮圖片  
  26.      * @param filePath 源文件路徑  
  27.      * @param toPath   縮略圖路徑  
  28.      */ 
  29.     public static void createThumbnail(String filePath, String toPath) throws MagickException{  
  30.         ImageInfo info = null;  
  31.         MagickImage image = null;  
  32.         Dimension imageDim = null;  
  33.         MagickImage scaled = null;  
  34.         try{  
  35.             info = new ImageInfo(filePath);  
  36.             image = new MagickImage(info);  
  37.             imageDim = image.getDimension();  
  38.             int wideth = imageDim.width;  
  39.             int height = imageDim.height;  
  40.             if (wideth > height) {  
  41.                 height = 660 * height / wideth;  
  42.                 wideth = 660;  
  43.             }  
  44.             scaled = image.scaleImage(wideth, height);//小圖片文件的大小.  
  45.             scaled.setFileName(toPath);  
  46.             scaled.writeImage(info);  
  47.         }finally{  
  48.             if(scaled != null){  
  49.                 scaled.destroyImages();  
  50.             }  
  51.         }  
  52.     }     
  53.    
  54.     /**  
  55.      * 水印(圖片logo)  
  56.      * @param filePath  源文件路徑  
  57.      * @param toImg     修改圖路徑  
  58.      * @param logoPath  logo圖路徑  
  59.      * @throws MagickException  
  60.      */ 
  61.     public static void initLogoImg(String filePath, String toImg, String logoPath) throws MagickException {  
  62.         ImageInfo info = new ImageInfo();  
  63.         MagickImage fImage = null;  
  64.         MagickImage sImage = null;  
  65.         MagickImage fLogo = null;  
  66.         MagickImage sLogo = null;  
  67.         Dimension imageDim = null;  
  68.         Dimension logoDim = null;  
  69.         try {  
  70.             fImage = new MagickImage(new ImageInfo(filePath));  
  71.             imageDim = fImage.getDimension();  
  72.             int width = imageDim.width;  
  73.             int height = imageDim.height;  
  74.             if (width > 660) {  
  75.                 height = 660 * height / width;  
  76.                 width = 660;  
  77.             }  
  78.             sImage = fImage.scaleImage(width, height);     
  79.    
  80.             fLogo = new MagickImage(new ImageInfo(logoPath));  
  81.             logoDim = fLogo.getDimension();  
  82.             int lw = width / 8;  
  83.             int lh = logoDim.height * lw / logoDim.width;  
  84.             sLogo = fLogo.scaleImage(lw, lh);     
  85.    
  86.             sImage.compositeImage(CompositeOperator.AtopCompositeOp, sLogo,  width-(lw + lh/10), height-(lh + lh/10));  
  87.             sImage.setFileName(toImg);  
  88.             sImage.writeImage(info);  
  89.         } finally {  
  90.             if(sImage != null){  
  91.                 sImage.destroyImages();  
  92.             }  
  93.         }  
  94.     }     
  95.    
  96.     /**  
  97.      * 水印(文字)  
  98.         * @param filePath 源文件路徑  
  99.      * @param toImg    修改圖路徑  
  100.      * @param text     名字(文字內容自己隨意)  
  101.      * @throws MagickException  
  102.      */ 
  103.     public static void initTextToImg(String filePath, String toImg,  String text) throws MagickException{  
  104.             ImageInfo info = new ImageInfo(filePath);  
  105.             if (filePath.toUpperCase().endsWith("JPG") || filePath.toUpperCase().endsWith("JPEG")) {  
  106.                 info.setCompression(CompressionType.JPEGCompression); //壓縮類別爲JPEG格式  
  107.                 info.setPreviewType(PreviewType.JPEGPreview); //預覽格式爲JPEG格式  
  108.                 info.setQuality(95);  
  109.             }  
  110.             MagickImage aImage = new MagickImage(info);  
  111.             Dimension imageDim = aImage.getDimension();  
  112.             int wideth = imageDim.width;  
  113.             int height = imageDim.height;  
  114.             if (wideth > 660) {  
  115.                 height = 660 * height / wideth;  
  116.                 wideth = 660;  
  117.             }  
  118.             int a = 0;  
  119.             int b = 0;  
  120.             String[] as = text.split("");  
  121.             for (String string : as) {  
  122.                 if(string.matches("[\u4E00-\u9FA5]")){  
  123.                     a++;  
  124.                 }  
  125.                 if(string.matches("[a-zA-Z0-9]")){  
  126.                     b++;  
  127.                 }  
  128.             }  
  129.             int tl = a*12 + b*6 + 300;  
  130.             MagickImage scaled = aImage.scaleImage(wideth, height);  
  131.             if(wideth > tl && height > 5){  
  132.                 DrawInfo aInfo = new DrawInfo(info);  
  133.                 aInfo.setFill(PixelPacket.queryColorDatabase("white"));  
  134.                 aInfo.setUnderColor(new PixelPacket(0,0,0,100));  
  135.                 aInfo.setPointsize(12);  
  136.                 //解決中文亂碼問題,自己可以去隨意定義個自己喜歡字體,我在這用的微軟雅黑  
  137.                 String fontPath = "C:/WINDOWS/Fonts/MSYH.TTF";  
  138. //              String fontPath = "/usr/maindata/MSYH.TTF";  
  139.                 aInfo.setFont(fontPath);  
  140.                 aInfo.setTextAntialias(true);  
  141.                 aInfo.setOpacity(0);  
  142.                 aInfo.setText(" " + text + "於 " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 上傳於XXXX網,版權歸作者所有!");  
  143.                 aInfo.setGeometry("+" + (wideth-tl) + "+" + (height-5));  
  144.                 scaled.annotateImage(aInfo);  
  145.             }  
  146.             scaled.setFileName(toImg);  
  147.             scaled.writeImage(info);  
  148.             scaled.destroyImages();  
  149.     }     
  150.    
  151.     /**  
  152.      * 切圖  
  153.      * @param imgPath 源圖路徑  
  154.      * @param toPath  修改圖路徑  
  155.      * @param w  
  156.      * @param h  
  157.      * @param x  
  158.      * @param y  
  159.      * @throws MagickException  
  160.      */ 
  161.     public static void cutImg(String imgPath, String toPath, int w, int h, int x, int y) throws MagickException {  
  162.         ImageInfo infoS = null;  
  163.         MagickImage image = null;  
  164.         MagickImage cropped = null;  
  165.         Rectangle rect = null;  
  166.         try {  
  167.             infoS = new ImageInfo(imgPath);  
  168.             image = new MagickImage(infoS);  
  169.             rect = new Rectangle(x, y, w, h);  
  170.             cropped = image.cropImage(rect);  
  171.             cropped.setFileName(toPath);  
  172.             cropped.writeImage(infoS);     
  173.    
  174.         } finally {  
  175.             if (cropped != null) {  
  176.                 cropped.destroyImages();  
  177.             }  
  178.         }  
  179.     }  
  180. }   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章