Pure java的圖片操作,不依賴操作系統的功能,圖片運算量比較大,如果批處理圖片或圖片size較大的話(如1M左右的圖片)的話,性能肯定不能滿足;用JNI(java本地調用),依賴操作系統提供的功能, 操作批量、大圖片,就成為首選方案。
我在winxp環境下安裝調試JMagick,并成功運行了測試code,實現了圖片的多種操作,縮略圖、旋轉、設置邊框、設置背景等等...,下面記錄安裝及配置歷史,分享給大家:
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加入系統path(有些版本自己會默認添加),以便能調用dll.保險起見,
然后再把安裝目錄下的所有dll文件復制到C:\WINDOWS\system32下(因為我出現過只添加路徑而不復制這些文件到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")). 打印出當前環境的路徑,然后再把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環境的安裝配置
1:下載安裝ImageMagick-6.3.4-10-Q16-windows-dll.exe
2:把install path加入系統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文件中改變如下設置
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 )
下面把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){
}
}
-------------------------------------------------------------------------------------------------------------------------
JMagick是一個開源API,利用JNI(Java Native Interface)技術實現了對ImageMagickAPI的Java訪問接口,因此也將比純Java實現的圖片操作函數在速度上要快。JMagick只實現了ImageMagicAPI的一部分功能,它的發行遵循LGPL協議。
ImageMagick請參考其官方網站或ImageMagick學習。
下載安裝
安裝要求:
- 如果通過CVS下載的源碼,則需要GNU Autoconf
- GNU Make 3.77或更新版本(我用的是3.7.9).
- 一個ANSI C 編譯器,建議用 GNU 或 EGCS 的編譯器
- ImageMagick 5.5.6或更新版本
- Java2 JDK( JMagick是在 Sun JDK 1.4.1上開發,但運行好象不用那么高,我用的是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包。
根據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,實現JSP上傳圖片文件后生成縮略圖的功能
Jmagick自身帶的Test.java程序,演示了如何使用JMagick來實現圖片的復制、信息獲取、斜角、特效、組合、改變大小、加邊框、旋轉、切片、改變格式、去色等等功能,編程的重要參考。
下面主要描述如何實現將用JSP上傳的圖片,進行壓縮生成縮略圖。用jsp上傳文件的全部代碼,參見利用apache-commons-fileupload寫jsp上傳文件,下面只描述圖片壓縮的實現。
$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(100, 80);//小圖片文件的大小.
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
然后我把所有的*.dll文件全部COPY到system32目錄下,結果,它不報錯了,直接把WEB服務器給搞停了。
已經按照各位的方法,但還是不行,報錯:無法找到動態鏈接庫CORE_RL_magick_.dll。
JMagick包內沒有PicResize.java類,而我恰恰需要縮略圖功能!
to Hilton
我裝了imagemagick6,然后也把jmagick.dll拷到system32下,但是為什么運行時還是報錯啊。報錯:無法定位程序輸入點DestroyMagickInfo于動態鏈接庫CORE_RL_magick_.dll上
我明明在windowsXP的 cmd 中 運行 class文件,是可以處理圖片的,但是為什么放到 tomcat 里面去運行,就報Internal error() 呢???
而且internal error() 那一大串的東西,我根本看部懂,又不是說找不到 什么其他的類,
啊!! 煩啊!!! 大哥指教一下好嗎???
樓上這位朋友我現在正在看imageJ的東西,但一下子沒有搞好,想得到你的幫助呀!
聯系一下!QQ 4414155
我在LINUX下安裝他出現Unable to find ImageMagick header files
這是怎么回事?然后跳出安裝。我是在他主頁上下載了安裝的。試了兩個版本都如此。
about java.lang.UnsatisfiedLinkError: no JMagick in java.library.path.
copy libJMagick.so $resin_home/lib
老板又要我研究用JMagicK做動畫,又要研究了。。。。。
問一下版主,怎么用depends看一個dll依賴于哪些文件?謝謝。
呵呵,我的也是在Windows下運行的,折騰了一個星期,總算成功了,要把那個jmagick.dll考到系統的System32目錄下面,然后下載一個ImageMagick-5.5.7-Q16-windows-dll.exe安裝了,一切都OK了。
呵呵,我的也是在Windows下運行的,折騰了一個星期,總算成功了,要把那個jmagick.dll考到系統的System32目錄下面,然后下載一個ImageMagick-5.5.7-Q16-windows-dll.exe安裝了,一切都OK了。
是不是需要裝imagemagick?
你用depends看看,這個dll依賴于哪些文件?
真不好意思,我用jmagick是在linux下的,所以對windows下的東東不是很熟悉。
Hilton
我把jmagick.dll和jmagick.jar都放到system32下但出現java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\JMagick.dll: Can't find dependent libraries。我是在IDEA開發中調用的,總是不成功,為什么jmagick還要有dll?不象其他java的工具包?
我在JmagicK的主頁上找不到JmagicK實現的API的有關文檔,所以還是不知道具體怎么用JmagicK,請問版主那里有文檔嗎?或者有其他助于學JmagicK的好東東。
放在運行程序時的當前目錄,或者放到windows的system32目錄下試試。
請問我在運行是出現java.lang.UnsatisfiedLinkError: no JMagick in java.library.path錯誤。jmagick.dll應該怎么用?
你好,我最近也在看基于JAVA的圖像處理:
你看看這個如何:ImageJ
http://www.infomall.cn/cgi-bin/mallgate/20040514/http://rsb.info.nih.gov/ij/
我想利用這個包將圖片動態生成各種幅面的縮略圖(包含站點水印)。然后圖片可以通過PATH_INFO解析參數,比如生成一個200*150的水印:
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的參數傳入。 MagickImage 是處理圖片的主要類。
MagickImage image= new MagickImage(info);
再對MagickImage的對象選取方法。進行縮放。scaleImage(w, h),第一個參數指按比例縮放后的寬度,第二個就是高度了。
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新圖片了。
第二個常用的功能截取(cropImage)。
首先初始化一個ImageInfo對象,就是加載要處理的圖片路徑.
ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
再初始化一個合適的寬度和高度,以及起始坐標。就是要處理后圖片的大小形狀(矩形)。
Rectangle rect = new Rectangle(0, 0, 40, 80);
x,y就是起始點的坐標,一般從圖片的左上角開始,默認為0.w,h就是實際的寬度和高度了,不是按比例截取后的寬度和高度。
這一點與上面的不同。
然后再把圖片信息ImageInfo作為構造MagickImage的參數傳入。 MagickImage 是處理圖片的主要類。
MagickImage image= new MagickImage(info);
再對MagickImage的對象選取方法。進行實際大小的截取。cropImage(rect),參數指圖片的范圍。
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新圖片了。原圖片的規格一定大于40X80,要不然截取的有空白了。自己試試就知道了。
最后一個常用的功能復制(copy),這個最簡單了。
首先初始化一個ImageInfo對象,就是加載要處理的圖片路徑.
ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
然后再把圖片信息ImageInfo作為構造MagickImage的參數傳入。 MagickImage 是處理圖片的主要類。
MagickImage image= new MagickImage(info);
最后把處理完的圖片命名(1_copy.jpg)存放到指定的目錄下(F:/images)。
image.setFileName("F:\\images\\1_copy.jpg");
writeImage指定源圖片的ImageInfo 對象。
image.writeImage(info);
這個沒有用到(cloneImage)方法,簡單的理解為改變圖片的存放路徑就可以了,這樣就很輕松的實現了copy了,比它自帶的cloneImage簡單多了。