/**
* 添加裁切图片
*
* @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;
}