頭像上傳、圖片裁剪是典型業務場景。本文採用 jQuery Jcrop 實現前端選區拖拽與實時預覽,後端利用 javax.imageio 完成無損裁剪並返回預覽圖,提供完整 JSP/Servlet/Java 三層代碼,可直接集成至項目。
jquery.Jcrop.css/js、jquery.min.js。onChange/onSelect 回調,同步更新隱藏域 x, y, w, h。marginLeft/Top 實現即時縮圖。success.jsp,攜帶原圖路徑與四座標參數。$('#cutImage').Jcrop({
onChange: showCoords, onSelect: showCoords,
aspectRatio: xsize / ysize
}, function() { jcrop_api = this; });
public static void CutImage(String srcPath, String destPath,
int x, int y, int w, int h) {
FileInputStream fis = new FileInputStream(srcPath);
ImageInputStream iis = ImageIO.createImageInputStream(fis);
Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = it.next();
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceRegion(new Rectangle(x, y, w, h)); // 關鍵:設置源區域
BufferedImage bi = reader.read(0, param);
ImageIO.write(bi, "jpg", new File(destPath));
// finally 關閉流
}
String imgPath = request.getParameter("imgPath");
int x = Integer.parseInt(request.getParameter("x"));
int y = Integer.parseInt(request.getParameter("y"));
int w = Integer.parseInt(request.getParameter("w"));
int h = Integer.parseInt(request.getParameter("h"));
Upload.CutImage(realPath + imgPath, realPath + "/images/" + newFileName, x, y, w, h);
out.print("<img src='images/" + newFileName + "'/>");
ImageIO.getImageReadersBySuffix 動態適配 PNG/GIF/BMP。完整代碼結構清晰,前後端分離度高,可快速遷移至 Spring MVC、Spring Boot 等框架。