java实现图片裁剪功能

/**
	 * 添加裁切图片
	 * 
	 * @param request
	 * @throws TSDBException
	 */
	public static byte[] addCropPhoto(HttpServletRequest request, boolean deleFile) throws Exception {

		byte[] bytes = null;
		String photoFileName = request.getParameter("photoFileName");
		if (!Tools.isEmpty(photoFileName)) {
			String fileType = request.getParameter("fileType");
			String uploaded = request.getParameter("uploaded");
			String dirName = request.getParameter("dirName");
			double x = Double.parseDouble(request.getParameter("x"));
			double y = Double.parseDouble(request.getParameter("y"));
			double w = Double.parseDouble(request.getParameter("w"));
			double h = Double.parseDouble(request.getParameter("h"));
			String path = ConfigPath.getRootPath("picPath");
			if ("Y".equals(uploaded)) {// 已上传
				File file = new File(path + dirName + photoFileName);
				File srcImageFileGood = null;
				if (file.exists()) {
					FileInputStream is = null;
					ImageInputStream iis = null;
					String format = photoFileName.substring(photoFileName.lastIndexOf(".") + 1, photoFileName.length());
					try {
						if (deleFile) {
							if ("jpg".equals(format.toLowerCase())) {
								srcImageFileGood = new File(path + dirName + "___" + photoFileName);
								if (srcImageFileGood.exists()) {
									srcImageFileGood.delete();
								}
								srcImageFileGood.createNewFile();

								JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(file));
								BufferedImage image = decoder.decodeAsBufferedImage();
								ImageIO.write(image, "JPEG", srcImageFileGood);
								// 读取图片文件
								is = new FileInputStream(srcImageFileGood);
							} else {
								// 读取图片文件
								is = new FileInputStream(file);
							}
						} else {
							// 读取图片文件
							is = new FileInputStream(file);
						}
						/*
						 * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader
						 * 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 .(例如 "jpeg" 或
						 * "tiff")等 。
						 */
						Iterator it = ImageIO.getImageReadersByFormatName(format);
						ImageReader reader = (ImageReader) it.next();
						// 获取图片流
						iis = ImageIO.createImageInputStream(is);
						/*
						 * <p>iis:读取源。true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
						 * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader
						 * 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
						 */
						reader.setInput(iis, true);
						/*
						 * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
						 * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其 ImageReader 实现的
						 * getDefaultReadParam 方法中返回 ImageReadParam 的实例。
						 */
						ImageReadParam param = reader.getDefaultReadParam();
						/*
						 * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
						 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
						 */
						Rectangle rect = new Rectangle(Integer.parseInt(new java.text.DecimalFormat("0").format(x)),
								Integer.parseInt(new java.text.DecimalFormat("0").format(y)), Integer.parseInt(new java.text.DecimalFormat(
										"0").format(w)), Integer.parseInt(new java.text.DecimalFormat("0").format(h)));

						// 提供一个 BufferedImage,将其用作解码像素数据的目标。
						param.setSourceRegion(rect);
						/*
						 * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
						 * 它作为一个完整的 BufferedImage 返回。
						 */
						ByteArrayOutputStream imageStream = new ByteArrayOutputStream();
						BufferedImage bi = reader.read(0, param);

						// BufferedImage bx = (BufferedImage) ImageIO.read(is);
						// BufferedImage bi_cropper =
						// bx.getSubimage(Integer.parseInt(new
						// java.text.DecimalFormat("0").format(x)), Integer
						// .parseInt(new
						// java.text.DecimalFormat("0").format(y)),
						// Integer.parseInt(new java.text.DecimalFormat("0")
						// .format(w)), Integer.parseInt(new
						// java.text.DecimalFormat("0").format(h)));
						// 保存新图片
						// ImageIO.write(bi, " jpg ", new File(subpath));
						boolean resultWrite = ImageIO.write(bi, format, imageStream);
						bytes = imageStream.toByteArray();
					} finally {
						if (iis != null)
							iis.close();
						if (is != null)
							is.close();
					}
					if (deleFile) {
						if (srcImageFileGood != null)
							srcImageFileGood.delete();
						file.delete();
					}
				}

			}
					}
		return bytes;
	}

 

/**
	 * 根据byte数组,生成文件
	 */
	public static boolean writeFile(byte[] bfile, String filePath, String fileName) {
		boolean result = false;
		BufferedOutputStream bos = null;
		FileOutputStream fos = null;
		File file = null;
		try {
			File dir = new File(filePath);
			if (!dir.exists()) {// 判断文件目录是否存在
				dir.mkdirs();
			}
			file = new File(filePath + "/" + fileName);
			fos = new FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			bos.write(bfile);
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
		return result;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值