void

          ImageMagick & JMagick的使用(高品質高效率縮略圖的解決方案, 4 Windows & Linux)

          Pure java的圖片操作,不依賴操作系統(tǒng)的功能,圖片運算量比較大,如果批處理圖片或圖片size較大的話(如1M左右的圖片)的話,性能肯定不能滿足;用JNI(java本地調用),依賴操作系統(tǒng)提供的功能, 操作批量、大圖片,就成為首選方案。

          我在winxp環(huán)境下安裝調試JMagick,并成功運行了測試code,實現(xiàn)了圖片的多種操作,縮略圖、旋轉、設置邊框、設置背景等等...,下面記錄安裝及配置歷史,分享給大家:
          ImageMagick, JMagick安裝、配置及使用:
          平臺:winXP
          1. 安裝ImageMagick(ImageMagick website:http://www.imagemagick.org/script/index.php)
              下載并安裝ImageMagick。file name: ImageMagick-6.2.6-8-Q16-windows-dll.exe
               download address: http://prdownloads.sourceforge.net/imagemagick/ImageMagick-6.2.6-8-Q16-windows-dll.exe?download
              安裝成功后,

          把install path加入系統(tǒng)path(有些版本自己會默認添加),以便能調用dll.保險起見,

          然后再把安裝目錄下的所有dll文件復制到C:\WINDOWS\system32下(因為我出現(xiàn)過只添加路徑而不復制這些文件到C:\WINDOWS\system32,程序運行提示出錯的情況)

          2. 安裝JMagick(JMagick website: http://www.yeo.id.au/jmagick/
              下載JMatick。file name: jmagick-6.2.6-win.zip
              download address: http://www.yeo.id.au/jmagick/quickload/win-6.2.6/jmagick-6.2.6-win.zip
              解壓后

          把jmagick-6.2.6-win\q16\jmagick.dll copy 到c:\windows\system32目錄下,如果程序在運行的時候提示:找不到jmagick路徑,用System.out.println(System.getProperty("java.library.path")). 打印出當前環(huán)境的路徑,然后再把jmagick.dll 復制到其中的一個路徑文件夾中

           

          notes: If you are using Tomcat, or other java applications which have their own classloaders,

          方法1: 把jmagick-6.2.6-win\jar\jmagick.jar copy到項目的WEB-INF\lib目錄下,然后在服務啟動初始化的時候,System.setProperty("jmagick.systemclassloader","no");   (可以在過濾器的那個類里面加上這句話,也可以自己手動建立一個初始化的serverlet,然后加上這句話)

          方法2:簡單的方法,把jmagick-6.2.6-win\jar\jmagick.jar 復制到%JAVA_HOME%\jre\lib\ext.就ok了

           

          下面總結下windows + tomcat環(huán)境的安裝配置

          1:下載安裝ImageMagick-6.3.4-10-Q16-windows-dll.exe

          2:把install path加入系統(tǒng)path,然后把install path下的dll文件復制到C:\WINDOWS\system32

          3:下載JMatick。file name:jmagick-6.2.6-win-im-6.2.9.zip

          4:把q16目錄下的jmagick.dll復制到D:\Tomcat5.0\bin下(D:\tomcat是安裝路徑)

          5:把jar_15目錄下的jmagick.jar復制到%JAVA_HOME%\jre\lib\ext.

          6:完畢,測試

           

          PS:

          web應用如果部署到tomcat下,那么最好在catalina.bat文件中改變?nèi)缦略O置

          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溢出的問題,參數(shù)看你自己的機器而定。( -Xms256M -Xmx768M -XX:MaxPermSize=128M )

           

           

          下面把jmagick-6.2.6-win-im-6.2.9目錄下的說明文檔附在這里,注意看他的Getting Started和Notes部分

          This archive contains jmagick.dll 6.2.6 compiled against
          ImageMagick 6.2.9.

          q8 contains jmagick.dll compiled against ImageMagick 6.2.9-Q8
          http://www.imagemagick.org/download/binaries/ImageMagick-6.2.9-4-Q8-windows-dll.exe

          q16 contains jmagick.dll compiled against ImageMagick 6.2.9-Q16
          http://www.imagemagick.org/download/binaries/ImageMagick-6.2.9-4-Q16-windows-dll.exe

          It was built with gcc mingw 3.4.2 on Windows 2000 and Sun JDK 1.5.0 release 5.


          Getting Started:

          1. Install ImageMagick
          2. Copy the jmagick.dll corresponding with the Q8 or Q16 ImageMagick you installed to
              somewhere in your PATH. I would put it in the same directory as ImageMagick.
          3. Put jmagick.jar in your java classpath. If you are using Tomcat, or other java
              applications which have their own classloaders, move the jar up to a more global scope.
              If you had placed the jar in WEB-INF/lib and reload the webapp, java will attempt to
              reload jmagick.dll twice, and it will fail. By moving the jar up, the library will only
              be loaded once per jvm lifetime. I place mine in %JAVA_HOME%\jre\lib\ext.

          Notes:
          -------------------------------------------------------------------------------------------------
          If you see exceptions such as UnsatisfiedLinkError, you did one of the above steps incorrectly
          or you are not using the JVM/ImageMagick versions you think you are. Have your java code
          print out the java.library.path -- System.getProperty("java.library.path"). Check to ensure
          that jmagick.dll is in one of those directories.

          -------------------------------------------------------------------------------------------------
          If you run your java application as a service, any changes to the PATH environment variable will
          not be visible to java until you reboot.

          -------------------------------------------------------------------------------------------------
          This is the first time I have built jmagick.dll using gcc/mingw. Let me know if you have any issues.

          Mark Deneen
          mdeneen at gmail dot com

           

          ---------------------------------------------------------------------------------------------------------------------------------

          例子:


          /**
           * 以正方形比例輸出縮放圖片
           *
           * MaxBorderLen : 正方形邊長
          */
          public void CoutImage4Square(String srcImage, String DestImage, int MaxBorderLen){
             
              System.setProperty(
          "jmagick.systemclassloader","no");
             
              
          try{  

                 ImageInfo info 
          = new ImageInfo(srcImage);
                 MagickImage image 
          = new MagickImage(info);
                
                 
          //取長寬
                 Dimension dim = image.getDimension();
                 
          double wImage = dim.getWidth();
                 
          double hImage = dim.getHeight();
                
                 Boolean bWBig 
          = wImage > hImage? true:false ;
                
                 
          if (bWBig)
                 {
          //長大過高
                  hImage = MaxBorderLen * ( hImage / wImage);
                  wImage 
          = MaxBorderLen;
                 }
                 
          else
                 {
          //反之
                  wImage = MaxBorderLen * ( wImage / hImage);
                  hImage 
          = MaxBorderLen;
                 }

                 
          //輸出
                 MagickImage scaled = image.scaleImage((int)wImage, (int)hImage);
                 scaled.setFileName(DestImage);  
                 scaled.writeImage(info);  

                 }
          catch(MagickApiException ex){
                 }
          catch(MagickException ex){
              }
          }

           

           

          -------------------------------------------------------------------------------------------------------------------------

          jmagicklogo.png  JMagick是一個開源API,利用JNI(Java Native Interface)技術實現(xiàn)了對ImageMagickAPI的Java訪問接口,因此也將比純Java實現(xiàn)的圖片操作函數(shù)在速度上要快。JMagick只實現(xiàn)了ImageMagicAPI的一部分功能,它的發(fā)行遵循LGPL協(xié)議。
            ImageMagick請參考其官方網(wǎng)站ImageMagick學習。

           

          下載安裝

            安裝要求:

          1. 如果通過CVS下載的源碼,則需要GNU Autoconf
          2. GNU Make 3.77或更新版本(我用的是3.7.9).
          3. 一個ANSI C 編譯器,建議用 GNU 或 EGCS 的編譯器
          4. ImageMagick 5.5.6或更新版本
          5. Java2 JDK( JMagick是在 Sun JDK 1.4.1上開發(fā),但運行好象不用那么高,我用的是1.3.1)


          下載過程如下:
          用CVS取源碼:

          cvs -d :pserver:anonymous@jmagick.yeo.nu:/var/cvs/jmagick login
          Password: jmagick
          cvs -d :pserver:anonymous@jmagick.yeo.nu:/var/cvs/jmagick checkout Jmagick


          也可以直接下載JMagick-5.5.6-X.tar.gz包。
          根據(jù)INSTALL文檔指示,編譯如下:

          對下載包:
          tar zxvf Jmagick-5.5.6-X.tar.gz
          cd Jmagick-5.5.6-X
          對CVS取回來的源碼
          cd JMagick
          autoconf
          以下為兩種情況都相同的部分
          ./configure
          make all
          su
          make install
          make javadoc
          make test <--如果x-win沒有啟動,大部分測試是成功的,但也會顯示一些錯誤信息,因為沒法顯示圖片。

           

          通過JMagick,實現(xiàn)JSP上傳圖片文件后生成縮略圖的功能


            Jmagick自身帶的Test.java程序,演示了如何使用JMagick來實現(xiàn)圖片的復制、信息獲取、斜角、特效、組合、改變大小、加邊框、旋轉、切片、改變格式、去色等等功能,編程的重要參考。
            下面主要描述如何實現(xiàn)將用JSP上傳的圖片,進行壓縮生成縮略圖。用jsp上傳文件的全部代碼,參見利用apache-commons-fileupload寫jsp上傳文件,下面只描述圖片壓縮的實現(xiàn)。






          $TOMCATHOME/webapps/yourproject/WEB-INF/classes/com/hedong/JMagick/PicResize.java

          package com.hedong.JMagick;
          import org.apache.log4j.*;
          import java.awt.Dimension;
          import java.awt.Rectangle;
          import magick.ImageInfo;
          import magick.MagickImage;
          import magick.MagickException;
          import magick.QuantizeInfo;
          import magick.ColorspaceType;
          import magick.MagickApiException;
          import magick.PixelPacket;
          import magick.DrawInfo;
          import magick.ResolutionType;
          import magick.ProfileInfo;
          import magick.MontageInfo;
          import magick.Magick;
          import magick.MagickInfo;
          import java.io.IOException;
          import java.io.FileOutputStream;
          public class PicResize {
             
          static Logger logger = Logger.getLogger(PicResize.class.getName());
             
          public void resize(String picFrom,String picTo) {
               
          try {
                 
          // Resize
                 ImageInfo info = new ImageInfo(picFrom);
                 MagickImage image 
          = new MagickImage(new ImageInfo(picFrom));
                 MagickImage scaled 
          = image.scaleImage(10080);//小圖片文件的大小.
                 scaled.setFileName(picTo);
                 scaled.writeImage(info);
                 logger.info(
          "alter pic form "+picFrom +" to "+picTo);
               } 
          catch(MagickApiException ex) {
                 logger.error(
          "MagickException: " + ex + "" + ex.getReason() + "" + ex.getDescription());
               } 
          catch(MagickException ex) {
                 logger.error(
          "MagickException: " + ex);
               }
             }
          }


          注意,需要將編譯JMagick生成的lib/jmagick.jar包,復制到$TOMCATHOME/webapps/yourproject/WEB-INF/lib目錄下。

           

          Posted by Hilton at October 29, 2003 12:13 AM | TrackBack

          Comments

          然后我把所有的*.dll文件全部COPY到system32目錄下,結果,它不報錯了,直接把WEB服務器給搞停了。

          Posted by: rosen at April 27, 2004 01:42 PM

          已經(jīng)按照各位的方法,但還是不行,報錯:無法找到動態(tài)鏈接庫CORE_RL_magick_.dll。

          Posted by: rosen at April 27, 2004 01:21 PM

          Sorry 心急看錯了?。?!

          Posted by: rosen at April 27, 2004 12:32 PM

          JMagick包內(nèi)沒有PicResize.java類,而我恰恰需要縮略圖功能!

          Posted by: rosen at April 27, 2004 12:24 PM

          to Hilton
          我裝了imagemagick6,然后也把jmagick.dll拷到system32下,但是為什么運行時還是報錯啊。報錯:無法定位程序輸入點DestroyMagickInfo于動態(tài)鏈接庫CORE_RL_magick_.dll上

          Posted by: heyq at April 21, 2004 02:40 PM

          today is my birthday :)

          Posted by: t-shirts-man at April 6, 2004 05:20 PM

          我明明在windowsXP的 cmd 中 運行 class文件,是可以處理圖片的,但是為什么放到 tomcat 里面去運行,就報Internal error() 呢???
          而且internal error() 那一大串的東西,我根本看部懂,又不是說找不到 什么其他的類,
          ?。?! 煩?。。?! 大哥指教一下好嗎???

          Posted by: Sean CWJ at April 3, 2004 06:42 PM

          樓上這位朋友我現(xiàn)在正在看imageJ的東西,但一下子沒有搞好,想得到你的幫助呀!
          聯(lián)系一下!QQ 4414155

          Posted by: david at March 23, 2004 11:07 AM

          先裝ImageMagick.

          Posted by: Hilton at February 18, 2004 01:19 PM

          我在LINUX下安裝他出現(xiàn)Unable to find ImageMagick header files
          這是怎么回事?然后跳出安裝。我是在他主頁上下載了安裝的。試了兩個版本都如此。

          Posted by: huifei at February 18, 2004 01:15 PM

          To Hilton :

          謝謝你的幫助。

          BTW,與初用者分享一點:win環(huán)境下,只下載jmagick.jar和jmagick.dll是不夠的,還需要下載其他的dll一起使用才可以,給大家一個鏈接http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.yeo.id.au/jmagick/quickload/win-5.5.7/ImageMagick-5.5.7-Q8-windows-dll.exe,安裝后記得要重新啟動pc。我聽從下面前輩的也將jmagick.dll放在了system32目錄下面了。

          Posted by: ryan at January 13, 2004 10:56 AM

          To ryan;

            在$JAMGICKHOME/src/test目錄下。我把它打了個包,你也可以從 http://www.infomall.cn/cgi-bin/mallgate/20040514/http://hedong.3322.org/archives/docs/test.tar.gz 下載。

          Posted by: Hilton at January 12, 2004 11:52 AM

          你們說的Test.java在哪兒?

          Posted by: ryan at January 12, 2004 11:44 AM

          //…………………………………………………………
          我在JmagicK的主頁上找不到JmagicK實現(xiàn)的API的有關文檔,所以還是不知道具體怎么用JmagicK,請問版主那里有文檔嗎?或者有其他助于學JmagicK的好東東。

          Posted by: zhm at December 12, 2003 08:39 AM
          //…………………………………………………………

          zhm,你可以去下載http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.yeo.id.au/jmagick/quickload/JMagick-5.5.1-bin-win32.zip
          這個包,里面包括了doc。

          Posted by: at January 12, 2004 11:39 AM

          about java.lang.UnsatisfiedLinkError: no JMagick in java.library.path.
          copy libJMagick.so $resin_home/lib

          Posted by: 湯湯 at January 2, 2004 12:14 PM

          imagesj
          應用

          Posted by: QQ吧精彩 at December 30, 2003 01:12 PM

          老板又要我研究用JMagicK做動畫,又要研究了。。。。。

          Posted by: zhm at December 24, 2003 06:48 PM

          To zhm;

            祝賀你安裝jmagick成功!

            去http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.dependencywalker.com/ 下載這個程序,安裝運行它,然后利用其"open"功能打開要看的程序就可以了。

          Hilton

          Posted by: Hilton at December 19, 2003 01:32 PM

          問一下版主,怎么用depends看一個dll依賴于哪些文件?謝謝。

          Posted by: zhm at December 19, 2003 10:22 AM

          呵呵,我的也是在Windows下運行的,折騰了一個星期,總算成功了,要把那個jmagick.dll考到系統(tǒng)的System32目錄下面,然后下載一個ImageMagick-5.5.7-Q16-windows-dll.exe安裝了,一切都OK了。

          Posted by: zhm at December 19, 2003 10:21 AM

          呵呵,我的也是在Windows下運行的,折騰了一個星期,總算成功了,要把那個jmagick.dll考到系統(tǒng)的System32目錄下面,然后下載一個ImageMagick-5.5.7-Q16-windows-dll.exe安裝了,一切都OK了。

          Posted by: zhm at December 19, 2003 10:21 AM

          是不是需要裝imagemagick?
          你用depends看看,這個dll依賴于哪些文件?

          真不好意思,我用jmagick是在linux下的,所以對windows下的東東不是很熟悉。

          Hilton

          Posted by: Hilton at December 13, 2003 09:39 PM

          我把jmagick.dll和jmagick.jar都放到system32下但出現(xiàn)java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\JMagick.dll: Can't find dependent libraries。我是在IDEA開發(fā)中調用的,總是不成功,為什么jmagick還要有dll?不象其他java的工具包?

          Posted by: at December 13, 2003 11:59 AM

          To zhm,

          JMagick的文檔確實很少,你可以參考http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.yeo.id.au/cgi-bin/jmagick/fom ?;蛉mageMagick的主頁看一下,因為jmagick僅是對imagemagick的一個java包裝。

            另外,這個包中的Test.java,把幾乎所有的功能都演示了一下,也可以看看。

          Hilton

          Posted by: Hilton at December 12, 2003 08:45 AM

          我在JmagicK的主頁上找不到JmagicK實現(xiàn)的API的有關文檔,所以還是不知道具體怎么用JmagicK,請問版主那里有文檔嗎?或者有其他助于學JmagicK的好東東。

          Posted by: zhm at December 12, 2003 08:39 AM

          放在運行程序時的當前目錄,或者放到windows的system32目錄下試試。

          Posted by: Hilton at December 11, 2003 10:00 PM

          請問我在運行是出現(xiàn)java.lang.UnsatisfiedLinkError: no JMagick in java.library.path錯誤。jmagick.dll應該怎么用?

          Posted by: at December 11, 2003 06:11 PM

          你好,我最近也在看基于JAVA的圖像處理:
          你看看這個如何:ImageJ
          http://www.infomall.cn/cgi-bin/mallgate/20040514/http://rsb.info.nih.gov/ij/

          我想利用這個包將圖片動態(tài)生成各種幅面的縮略圖(包含站點水?。?。然后圖片可以通過PATH_INFO解析參數(shù),比如生成一個200*150的水?。?br /> http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.chedong.com/thumb/200/150/orig.jpg

           

          ---------------------------------------------------------------------------------------------------------------------------------

           

          MagickImage大家可能都用過,它主要處理一些圖片,它可以處理90多種的圖片類型.它的功能非常強大,而我們在實際的應用中,主要用到它的縮放,截取,復制功能。其他的一些如寫入文字,加背景色,旋轉。。。用的少。

              第一個常用的功能縮放(scaleImage)。

              首先初始化一個ImageInfo對象,就是加載要處理的圖片路徑.
              ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
              然后再把圖片信息ImageInfo作為構造MagickImage的參數(shù)傳入。 MagickImage 是處理圖片的主要類。                                                                                                   
              MagickImage image= new MagickImage(info);
              再對MagickImage的對象選取方法。進行縮放。scaleImage(w, h),第一個參數(shù)指按比例縮放后的寬度,第二個就是高度了。
              MagickImage cropped= image .scaleImage(40, 80);
              最后把處理完的圖片命名(1_scale.jpg)存放到指定的目錄下(F:/images)。
              cropped.setFileName("F:\\images\\1_scale.jpg");
              writeImage指定源圖片的ImageInfo 對象。
              cropped.writeImage(info);
             
              這樣就簡單的把原來的圖片縮放成40X80的1_scale.jpg新圖片了。


              第二個常用的功能截?。╟ropImage)。

              首先初始化一個ImageInfo對象,就是加載要處理的圖片路徑.
              ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
              再初始化一個合適的寬度和高度,以及起始坐標。就是要處理后圖片的大小形狀(矩形)。
              Rectangle rect = new Rectangle(0, 0, 40, 80);
              x,y就是起始點的坐標,一般從圖片的左上角開始,默認為0.w,h就是實際的寬度和高度了,不是按比例截取后的寬度和高度。
              這一點與上面的不同。
              然后再把圖片信息ImageInfo作為構造MagickImage的參數(shù)傳入。 MagickImage 是處理圖片的主要類。                                                                                                   
              MagickImage image= new MagickImage(info);
              再對MagickImage的對象選取方法。進行實際大小的截取。cropImage(rect),參數(shù)指圖片的范圍。
              MagickImage cropped = image.cropImage(rect);
              最后把處理完的圖片命名(1_crop.jpg)存放到指定的目錄下(F:/images)。
              cropped.setFileName("F:\\images\\1_crop.jpg");
              writeImage指定源圖片的ImageInfo 對象。
              cropped.writeImage(info);
             
              這樣就簡單的把原來的圖片截取成40X80的1_crop.jpg新圖片了。原圖片的規(guī)格一定大于40X80,要不然截取的有空白了。自己試試就知道了。
             
            
              最后一個常用的功能復制(copy),這個最簡單了。

              首先初始化一個ImageInfo對象,就是加載要處理的圖片路徑.
              ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
            
              然后再把圖片信息ImageInfo作為構造MagickImage的參數(shù)傳入。 MagickImage 是處理圖片的主要類。                                                                                                   
              MagickImage image= new MagickImage(info);

              最后把處理完的圖片命名(1_copy.jpg)存放到指定的目錄下(F:/images)。
              image.setFileName("F:\\images\\1_copy.jpg");
              writeImage指定源圖片的ImageInfo 對象。
              image.writeImage(info);
              這個沒有用到(cloneImage)方法,簡單的理解為改變圖片的存放路徑就可以了,這樣就很輕松的實現(xiàn)了copy了,比它自帶的cloneImage簡單多了。

          posted on 2008-07-19 11:54 void 閱讀(3924) 評論(1)  編輯  收藏 所屬分類: Jmagick

          Feedback

          # re: ImageMagick & JMagick的使用(高品質高效率縮略圖的解決方案, 4 Windows & Linux) 2011-10-19 11:20 易元

          嘿嘿,剛看的時候感覺很給力,然后再提高的時候發(fā)現(xiàn)問題了。
          原來你是復制、粘貼來的啊, 你還不如給個鏈接呢,幾篇相關的文章里好多重復內(nèi)容。
          不好還是謝謝你了,加油,下次做個好的教程。  回復  更多評論   

          主站蜘蛛池模板: 曲水县| 济源市| 九江市| 唐河县| 阳原县| 磐石市| 九龙坡区| 建德市| 灵山县| 达州市| 太和县| 朝阳市| 郓城县| 武川县| 玉田县| 金乡县| 永修县| 体育| 邵阳市| 凉城县| 巴中市| 乌恰县| 商南县| 汾西县| 桂林市| 时尚| 漳州市| 邮箱| 陵川县| 宿迁市| 建始县| 鹿邑县| 黄陵县| 六枝特区| 五家渠市| 中西区| 台南县| 普陀区| 阿克苏市| 五指山市| 潍坊市|