剛好有個網友提到如何利用Servlet來產生縮圖,利用Servlet來產生而不存放成檔案,這種及時取得圖像的方法,比較不建議使用在需要大量輸出圖的狀況下,這樣子在記憶體的使用上會很重。
而為什麼使用ImageMagick來做縮圖呢?其實Java本身也可來製做縮圖,可是因為本身浮點運算的問題,效果並沒有很好,雖然麻煩了點,還是外掛dll來使用ImagicMagick會來的好。
JMagick ImageMagick等介紹及下載請參考:
JMagick-Java open source free影像壓縮
範例的結果:
利用imageToBlob這個函數來產生byte array做為輸出OutputStream
ps.記得把檔案先放在c糟,請自行下載範例圖
package yslifes.yku; import magick.ImageInfo; import magick.MagickException; import magick.MagickImage; public class JMagickScale { public static byte[] getCompressByte(String RealPathName, int CompressWidth, int CompressHeight) { byte[] data = new byte[1]; if (System.getProperty("jmagick.systemclassloader") == null) { System.setProperty("jmagick.systemclassloader", "no"); } try { // 來源路徑 java.io.File source = new java.io.File(RealPathName); if (!source.exists())// 不存在的話則做縮圖 { System.out.println("檔案不存在!!!"); return data; } // System.out.println(URLPath+to.getName()); // 否則則縮圖 System.out.println("開始縮圖"); ImageInfo info = new ImageInfo(source.getAbsolutePath()); MagickImage image = new MagickImage(info); // resize image MagickImage scaleImg = image.scaleImage(CompressWidth, CompressHeight); data = scaleImg.imageToBlob(info); System.out.println("縮圖成功!!" + CompressWidth + " " + CompressHeight); return data; } catch (MagickException e) { System.out.println("縮圖失敗:" + CompressWidth + " " + CompressHeight); } return data; } }
Servlet的部份只是把參數做處理,而呼叫JMagickScale來做壓縮
package yslifes.yku; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class for Servlet: Image * */ public class Image extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { /* * (non-Java-doc) * * @see javax.servlet.http.HttpServlet#HttpServlet() */ public Image() { super(); } /* * (non-Java-doc) * * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, * HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /* * (non-Java-doc) * * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, * HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String FileName = request.getParameter("f"); java.io.OutputStream ops = response.getOutputStream(); if (FileName == null || FileName.trim().length() == 0) { ops.write(new byte[1]); } else { ops.write(yslifes.yku.JMagickScale.getCompressByte( "c:/" + FileName, 500, 60)); } } }
原始碼下載:
如果傳如的值檔案不存在時會有下面結果:
很感謝您的協助,若有問題再向您請教,非常謝謝您。