Java 对指定位置进行图片切割

2019-04-15 16:48发布

protected void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {

String Pic = (String) request.getParameter("p");
int PointX = Integer.parseInt(request.getParameter("x"));
int PointY = Integer.parseInt(request.getParameter("y"));
int CutWidth = Integer.parseInt(request.getParameter("w"));
int CutHeight = Integer.parseInt(request.getParameter("h"));

// 图片宽度
int PicWidth = Integer.parseInt(request.getParameter("pw"));

// 图片高度
int PicHeight = Integer.parseInt(request.getParameter("ph"));

response.setContentType("image/jpeg");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
HttpSession session = request.getSession();

String picPath = Pic;

String path = request.getRealPath(picPath);

ServletOutputStream responseOutputStream = response.getOutputStream();

cut(path, responseOutputStream, CutWidth, CutHeight, PointX, PointY,
PicWidth, PicHeight);

// 以下关闭输入流!
responseOutputStream.flush();

responseOutputStream.close();
}


/**
* 图片切割
* @param srcImageFile 图片地址
* @param responseOutputStream servlet输出流
* @param w 切割宽度
* @param h 切割高度
* @param x1 开始x结点(left)
* @param y1 开始y结点(top)
* @param sw 图片宽度
* @param sh 图片高度
*/
public void cut(String srcImageFile,ServletOutputStream responseOutputStream, int w, int h, int x1,
int y1, int sw, int sh) {
try {

// http://localhost:8080/ImpCra/createServlet?p=Sunset.jpg&x=117&y=201&w=61&h=50&pw=300&ph=400

Image img;

ImageFilter cropFilter;
// 读取源图像
BufferedImage bi = ImageIO.read(new File(srcImageFile));

if (sw >= w && sh >= h) {

Image image = bi.getScaledInstance(sw, sh, Image.SCALE_DEFAULT);

// 剪切起始坐标点
int x = x1;
int y = y1;

int destWidth = w; // 切片宽度
int destHeight = h; // 切片高度

// 图片比例
double pw = sw;
double ph = sh;

double m = (double) sw / pw;
double n = (double) sh / ph;

int wth = (int) (destWidth * m);
int hth = (int) (destHeight * n);
int xx = (int) (x * m);
int yy = (int) (y * n);

// 四个参数分别为图像起点坐标和宽高
// 即: CropImageFilter(int x,int y,int width,int height)

cropFilter = new CropImageFilter(xx, yy, wth, hth);
img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(), cropFilter));

BufferedImage tag = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(img, 0, 0, null); // 绘制缩小后的图
g.dispose();

// 输出为文件
ImageIO.write(tag, "JPEG", responseOutputStream);

}

} catch (Exception e) {
e.printStackTrace();
}
}






JavaScript 图片切割效果(带拖放、缩放效果)