Jmagick java 處理圖片
在處理圖片的時候用到jmagick,起初以為引入一個pom依賴,就可以用java代碼直接操作了,誰知道一直報no JMagick in java.library.path錯誤。后來在網上查了一番資料發現,并不是那樣的,jmagick只是imagemagick的一個java封裝,imagemagick是用c++編寫的,所以這就用到了java的JNI進行本地庫的調用。
1.jmagick下載地址:http://downloads.jmagick.org/6.4.0 (目前最新版本是6.4.0),不過說實話里面只有doc,沒有demo,如果沒有資料,還真不知道怎么用,還好google夠強大,搜出了前輩們是怎么操作的。
2.imagemagick Windows下載地址:http://www.imagemagick.org/script/binary-releases.php#windows
這里我下的是![]()
下好,解壓,將.DLL文件訪問System32的文件里,在把jar放入項目里,在測試當前類的時候寫一個靜態塊用來初始化java庫,System.setProperty(“jmagick.systemclassloader”, “no”);
下面上傳下圖片處理的java代碼:
/**處理圖片 */
public static void processImage(File source, File dest, double width, double height)
throws MagickException {
MagickImage sourceImage = null;
MagickImage destImage = null;
try {
ImageInfo info = new ImageInfo(source.getPath());
//設置圖片質量
info.setQuality(IMG_QUALITY);
sourceImage = new MagickImage(info);
Dimension dimension = sourceImage.getDimension();
Double sourceWidth = dimension.getWidth();
Double sourceHeight = dimension.getHeight();
Double destWidth = null;
Double destHeight = null;
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
if (width == 0 && height == 0) {
width = sourceWidth;
height = sourceHeight;
}
if (sourceWidth > sourceHeight) {
destWidth = width;
destHeight = width / sourceWidth * sourceHeight;
if (destHeight > height && height != 0) {
destHeight = height;
destWidth = height / sourceHeight * sourceWidth;
}
} else {
destHeight = height;
destWidth = height / sourceHeight * sourceWidth;
if (destWidth > width || height == 0) {
destWidth = width;
destHeight = width / sourceWidth * sourceHeight;
}
}
destImage = sourceImage.zoomImage(destWidth.intValue(), destHeight.intValue());
// .sharpenImage(SHARPEN_IMG_RADUIS, SHARPEN_IMG_SIGMA);
//水平分辨率DPI
destImage.setXResolution(IMG_XRES);
//垂直分辨率DPI
destImage.setYResolution(IMG_YRES);
destImage.profileImage("*", null);
//設置圖片壓縮
destImage.setCompression(CompressionType.JPEGCompression);
//設置對比度
destImage.contrastImage(true);
destImage.setFileName(dest.getPath());
destImage.writeImage(info);
info = null;
} finally {
if (destImage != null) {
destImage.destroyImages();
}
if (sourceImage != null) {
sourceImage.destroyImages();
}
}
} 這樣在windows 32bit下面,用java處理jmagick就完成了。但是有個問題,如果你是64bitjdk的話就有問題,Can't load IA 32-bit .dll on a AMD 64-bit platform這個錯誤就會出現,經過搜索,說是卸掉64bit換個32bit就可以了。但是我覺得有點不合適,所以又查了下,有個im4java,是imagemagick的另外一個java接口,im4java只是封裝ImageMagick的命令,所以不需要依賴dll,記錄完linux的實現方式之后,在回來說xiaim4java。
linux安裝:下載ImageMagick源碼包解壓
tar zvxf ImageMagick-6.4.0-0.tar.gz cd ImageMagick-6.4.0-0 ./configure --prefix=/opt360/ImageMagick-6.4.0 --with-quantum-depth=8 --enable-share
configure參數說明:
–enable-shared 編譯成共享庫
–disable-static 不編譯成靜態庫
–disable-openmp 禁用多線程,使用多線程性能并沒有提高,但CPU占用達到了100%,所以禁用了。
–with-quantum-depth=8 使用8位色深。我的1200萬像素數碼相機,照出的圖片就是8位色深。
–with-windows-font-dir=目錄 ,指明字體文件的目錄(后面將人工復制中文字體文件到這個目錄)
關于Q8,Q16,Q32的說明:(建議使用8,現在數碼相機照的相片,每一種顏色就是8位深,3種顏色就是24位,所以選8)
支持的參數有3種,分別是 8, 16, or 32。默認值是16。
Q8表示: 8-bits per pixel quantum
Q16表示:16-bits per pixel quantum
Q32表示:32-bits per pixel quantum
安裝命令:
make make install
計算方式:
使用16-bit per pixel quantums在處理圖片時比8-bit慢15%至50%,并須要更多的內存。
處理一張1024x768像素的圖片8-bit要使用3.6M內存,16-bit要使用7.2M內存。計算方法是: (5 * Quantum Depth * Rows * Columns) / 8
驗證支持的圖片格式:identify -list format
安裝jmagick:
修改文件執行權限:chmod -R 777 filename
tar zvxf jmagick-6.4.0-src.tar.gz cd jmagick-6.4.0-src ./configure --prefix=/opt360/jmagick-6.4.0 --with-java-home=/home/jdk/jdk1.6.0_12 -with-magick-home=/opt360/ImageMagick-6.4.0 make all make install
記住jmagick-6.4.0.jar是使用前面你指定的jdk1.6編譯出來的,所以不能在jdk為1.5的環境下使用jmagick-6.4.0.jar
下面java代碼跟windows是一樣的。