Pure java的圖片操作,不依賴操作系統(tǒng)的功能,圖片運(yùn)算量比較大,如果批處理圖片或圖片size較大的話(如1M左右的圖片)的話,性能肯定不能滿足;用JNI(java本地調(diào)用),依賴操作系統(tǒng)提供的功能, 操作批量、大圖片,就成為首選方案。
我在winxp環(huán)境下安裝調(diào)試JMagick,并成功運(yùn)行了測(cè)試code,實(shí)現(xiàn)了圖片的多種操作,縮略圖、旋轉(zhuǎn)、設(shè)置邊框、設(shè)置背景等等...,下面記錄安裝及配置歷史,分享給大家:
ImageMagick, JMagick安裝、配置及使用:
平臺(tái):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(有些版本自己會(huì)默認(rèn)添加),以便能調(diào)用dll.保險(xiǎn)起見,
然后再把安裝目錄下的所有dll文件復(fù)制到C:\WINDOWS\system32下(因?yàn)槲页霈F(xiàn)過只添加路徑而不復(fù)制這些文件到C:\WINDOWS\system32,程序運(yùn)行提示出錯(cuò)的情況)
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目錄下,如果程序在運(yùn)行的時(shí)候提示:找不到j(luò)magick路徑,用System.out.println(System.getProperty("java.library.path")). 打印出當(dāng)前環(huán)境的路徑,然后再把jmagick.dll 復(fù)制到其中的一個(gè)路徑文件夾中
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到項(xiàng)目的WEB-INF\lib目錄下,然后在服務(wù)啟動(dòng)初始化的時(shí)候,System.setProperty("jmagick.systemclassloader","no"); (可以在過濾器的那個(gè)類里面加上這句話,也可以自己手動(dòng)建立一個(gè)初始化的serverlet,然后加上這句話)
方法2:簡(jiǎn)單的方法,把jmagick-6.2.6-win\jar\jmagick.jar 復(fù)制到%JAVA_HOME%\jre\lib\ext.就ok了
下面總結(jié)下windows + tomcat環(huán)境的安裝配置
1:下載安裝ImageMagick-6.3.4-10-Q16-windows-dll.exe
2:把install path加入系統(tǒng)path,然后把install path下的dll文件復(fù)制到C:\WINDOWS\system32
3:下載JMatick。file name:jmagick-6.2.6-win-im-6.2.9.zip
4:把q16目錄下的jmagick.dll復(fù)制到D:\Tomcat5.0\bin下(D:\tomcat是安裝路徑)
5:把jar_15目錄下的jmagick.jar復(fù)制到%JAVA_HOME%\jre\lib\ext.
6:完畢,測(cè)試
PS:
web應(yīng)用如果部署到tomcat下,那么最好在catalina.bat文件中改變?nèi)缦略O(shè)置
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ù)看你自己的機(jī)器而定。( -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 : 正方形邊長(zhǎng)
*/
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);
//取長(zhǎng)寬
Dimension dim = image.getDimension();
double wImage = dim.getWidth();
double hImage = dim.getHeight();
Boolean bWBig = wImage > hImage? true:false ;
if (bWBig)
{//長(zhǎng)大過高
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是一個(gè)開源API,利用JNI(Java Native Interface)技術(shù)實(shí)現(xiàn)了對(duì)ImageMagickAPI的Java訪問接口,因此也將比純Java實(shí)現(xiàn)的圖片操作函數(shù)在速度上要快。JMagick只實(shí)現(xiàn)了ImageMagicAPI的一部分功能,它的發(fā)行遵循LGPL協(xié)議。
ImageMagick請(qǐng)參考其官方網(wǎng)站或ImageMagick學(xué)習(xí)。
下載安裝
安裝要求:
- 如果通過CVS下載的源碼,則需要GNU Autoconf
- GNU Make 3.77或更新版本(我用的是3.7.9).
- 一個(gè)ANSI C 編譯器,建議用 GNU 或 EGCS 的編譯器
- ImageMagick 5.5.6或更新版本
- Java2 JDK( JMagick是在 Sun JDK 1.4.1上開發(fā),但運(yùn)行好象不用那么高,我用的是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文檔指示,編譯如下:
對(duì)下載包:
tar zxvf Jmagick-5.5.6-X.tar.gz
cd Jmagick-5.5.6-X
對(duì)CVS取回來的源碼
cd JMagick
autoconf
以下為兩種情況都相同的部分
./configure
make all
su
make install
make javadoc
make test <--如果x-win沒有啟動(dòng),大部分測(cè)試是成功的,但也會(huì)顯示一些錯(cuò)誤信息,因?yàn)闆]法顯示圖片。
通過JMagick,實(shí)現(xiàn)JSP上傳圖片文件后生成縮略圖的功能
Jmagick自身帶的Test.java程序,演示了如何使用JMagick來實(shí)現(xiàn)圖片的復(fù)制、信息獲取、斜角、特效、組合、改變大小、加邊框、旋轉(zhuǎn)、切片、改變格式、去色等等功能,編程的重要參考。
下面主要描述如何實(shí)現(xiàn)將用JSP上傳的圖片,進(jìn)行壓縮生成縮略圖。用jsp上傳文件的全部代碼,參見利用apache-commons-fileupload寫jsp上傳文件,下面只描述圖片壓縮的實(shí)現(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(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包,復(fù)制到$TOMCATHOME/webapps/yourproject/WEB-INF/lib目錄下。
Posted by Hilton at October 29, 2003 12:13 AM | TrackBack
然后我把所有的*.dll文件全部COPY到system32目錄下,結(jié)果,它不報(bào)錯(cuò)了,直接把WEB服務(wù)器給搞停了。
已經(jīng)按照各位的方法,但還是不行,報(bào)錯(cuò):無法找到動(dòng)態(tài)鏈接庫CORE_RL_magick_.dll。
JMagick包內(nèi)沒有PicResize.java類,而我恰恰需要縮略圖功能!
to Hilton
我裝了imagemagick6,然后也把jmagick.dll拷到system32下,但是為什么運(yùn)行時(shí)還是報(bào)錯(cuò)啊。報(bào)錯(cuò):無法定位程序輸入點(diǎn)DestroyMagickInfo于動(dòng)態(tài)鏈接庫CORE_RL_magick_.dll上
我明明在windowsXP的 cmd 中 運(yùn)行 class文件,是可以處理圖片的,但是為什么放到 tomcat 里面去運(yùn)行,就報(bào)Internal error() 呢???
而且internal error() 那一大串的東西,我根本看部懂,又不是說找不到 什么其他的類,
啊!! 煩啊!!! 大哥指教一下好嗎???
樓上這位朋友我現(xiàn)在正在看imageJ的東西,但一下子沒有搞好,想得到你的幫助呀!
聯(lián)系一下!QQ 4414155
我在LINUX下安裝他出現(xiàn)Unable to find ImageMagick header files
這是怎么回事?然后跳出安裝。我是在他主頁上下載了安裝的。試了兩個(gè)版本都如此。
about java.lang.UnsatisfiedLinkError: no JMagick in java.library.path.
copy libJMagick.so $resin_home/lib
老板又要我研究用JMagicK做動(dòng)畫,又要研究了。。。。。
問一下版主,怎么用depends看一個(gè)dll依賴于哪些文件?謝謝。
呵呵,我的也是在Windows下運(yùn)行的,折騰了一個(gè)星期,總算成功了,要把那個(gè)jmagick.dll考到系統(tǒng)的System32目錄下面,然后下載一個(gè)ImageMagick-5.5.7-Q16-windows-dll.exe安裝了,一切都OK了。
呵呵,我的也是在Windows下運(yùn)行的,折騰了一個(gè)星期,總算成功了,要把那個(gè)jmagick.dll考到系統(tǒng)的System32目錄下面,然后下載一個(gè)ImageMagick-5.5.7-Q16-windows-dll.exe安裝了,一切都OK了。
是不是需要裝imagemagick?
你用depends看看,這個(gè)dll依賴于哪些文件?
真不好意思,我用jmagick是在linux下的,所以對(duì)windows下的東東不是很熟悉。
Hilton
我把jmagick.dll和jmagick.jar都放到system32下但出現(xiàn)java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\JMagick.dll: Can't find dependent libraries。我是在IDEA開發(fā)中調(diào)用的,總是不成功,為什么jmagick還要有dll?不象其他java的工具包?
我在JmagicK的主頁上找不到JmagicK實(shí)現(xiàn)的API的有關(guān)文檔,所以還是不知道具體怎么用JmagicK,請(qǐng)問版主那里有文檔嗎?或者有其他助于學(xué)JmagicK的好東東。
放在運(yùn)行程序時(shí)的當(dāng)前目錄,或者放到windows的system32目錄下試試。
請(qǐng)問我在運(yùn)行是出現(xiàn)java.lang.UnsatisfiedLinkError: no JMagick in java.library.path錯(cuò)誤。jmagick.dll應(yīng)該怎么用?
你好,我最近也在看基于JAVA的圖像處理:
你看看這個(gè)如何:ImageJ
http://www.infomall.cn/cgi-bin/mallgate/20040514/http://rsb.info.nih.gov/ij/
我想利用這個(gè)包將圖片動(dòng)態(tài)生成各種幅面的縮略圖(包含站點(diǎn)水印)。然后圖片可以通過PATH_INFO解析參數(shù),比如生成一個(gè)200*150的水印:
http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.chedong.com/thumb/200/150/orig.jpg
---------------------------------------------------------------------------------------------------------------------------------
MagickImage大家可能都用過,它主要處理一些圖片,它可以處理90多種的圖片類型.它的功能非常強(qiáng)大,而我們?cè)趯?shí)際的應(yīng)用中,主要用到它的縮放,截取,復(fù)制功能。其他的一些如寫入文字,加背景色,旋轉(zhuǎn)。。。用的少。
第一個(gè)常用的功能縮放(scaleImage)。
首先初始化一個(gè)ImageInfo對(duì)象,就是加載要處理的圖片路徑.
ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
然后再把圖片信息ImageInfo作為構(gòu)造MagickImage的參數(shù)傳入。 MagickImage 是處理圖片的主要類。
MagickImage image= new MagickImage(info);
再對(duì)MagickImage的對(duì)象選取方法。進(jìn)行縮放。scaleImage(w, h),第一個(gè)參數(shù)指按比例縮放后的寬度,第二個(gè)就是高度了。
MagickImage cropped= image .scaleImage(40, 80);
最后把處理完的圖片命名(1_scale.jpg)存放到指定的目錄下(F:/images)。
cropped.setFileName("F:\\images\\1_scale.jpg");
writeImage指定源圖片的ImageInfo 對(duì)象。
cropped.writeImage(info);
這樣就簡(jiǎn)單的把原來的圖片縮放成40X80的1_scale.jpg新圖片了。
第二個(gè)常用的功能截取(cropImage)。
首先初始化一個(gè)ImageInfo對(duì)象,就是加載要處理的圖片路徑.
ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
再初始化一個(gè)合適的寬度和高度,以及起始坐標(biāo)。就是要處理后圖片的大小形狀(矩形)。
Rectangle rect = new Rectangle(0, 0, 40, 80);
x,y就是起始點(diǎn)的坐標(biāo),一般從圖片的左上角開始,默認(rèn)為0.w,h就是實(shí)際的寬度和高度了,不是按比例截取后的寬度和高度。
這一點(diǎn)與上面的不同。
然后再把圖片信息ImageInfo作為構(gòu)造MagickImage的參數(shù)傳入。 MagickImage 是處理圖片的主要類。
MagickImage image= new MagickImage(info);
再對(duì)MagickImage的對(duì)象選取方法。進(jìn)行實(shí)際大小的截取。cropImage(rect),參數(shù)指圖片的范圍。
MagickImage cropped = image.cropImage(rect);
最后把處理完的圖片命名(1_crop.jpg)存放到指定的目錄下(F:/images)。
cropped.setFileName("F:\\images\\1_crop.jpg");
writeImage指定源圖片的ImageInfo 對(duì)象。
cropped.writeImage(info);
這樣就簡(jiǎn)單的把原來的圖片截取成40X80的1_crop.jpg新圖片了。原圖片的規(guī)格一定大于40X80,要不然截取的有空白了。自己試試就知道了。
最后一個(gè)常用的功能復(fù)制(copy),這個(gè)最簡(jiǎn)單了。
首先初始化一個(gè)ImageInfo對(duì)象,就是加載要處理的圖片路徑.
ImageInfo info= new ImageInfo(“F:\\images\\1.jpg”);
然后再把圖片信息ImageInfo作為構(gòu)造MagickImage的參數(shù)傳入。 MagickImage 是處理圖片的主要類。
MagickImage image= new MagickImage(info);
最后把處理完的圖片命名(1_copy.jpg)存放到指定的目錄下(F:/images)。
image.setFileName("F:\\images\\1_copy.jpg");
writeImage指定源圖片的ImageInfo 對(duì)象。
image.writeImage(info);
這個(gè)沒有用到(cloneImage)方法,簡(jiǎn)單的理解為改變圖片的存放路徑就可以了,這樣就很輕松的實(shí)現(xiàn)了copy了,比它自帶的cloneImage簡(jiǎn)單多了。