对图片主体裁剪
/**
* 对图片主体裁剪
* @param originFile 待处理图片
* @param outFile 输出图片
* @param x 输出图片的x坐标
* @param y 输出图片的y坐标
* @param width 输出图片的宽
* @param height 输出图片的高
* @return
* @throws Exception
*/
public static ImgHandleResult cut(String originFile, String outFile, int x, int y, int width, int height) throws Exception {
String sourceFileFormat = originFile.substring(originFile.lastIndexOf(".") + 1).toLowerCase();
FileInputStream fileInputStream = null;
ImageInputStream imageInputStream = null;
// 读取原始图片
fileInputStream = new FileInputStream(originFile);
// ImageReader解码指定格式
ImageReader imageReader = ImageIO.getImageReadersByFormatName(sourceFileFormat).next();
// 获取图片流
imageInputStream = ImageIO.createImageInputStream(fileInputStream);
// 将imageInputStream标记为true(只向前搜索)意味着包含在输入源中的图像将只按顺序读取
imageReader.setInput(imageInputStream, true);
//指定如何在输入时从 Java Image I/O框架的上下文中的流转换一幅图像或一组图像
ImageReadParam imageReadParam = imageReader.getDefaultReadParam();
// 定义空间中的一个区域
Rectangle rectangle = new Rectangle(x, y, width, height);
// 提供一个 BufferedImage,将其用作解码像素数据的目标。
imageReadParam.setSourceRegion(rectangle);
// 读取索引imageIndex指定的对象
BufferedImage bufferedImage = imageReader.read(0, imageReadParam);
// 保存新图片
ImageIO.write(bufferedImage, sourceFileFormat, new File(outFile));
File file = new File(outFile);
// 保存新图片
ImageIO.write(bufferedImage, sourceFileFormat, file);
imageInputStream.close();
fileInputStream.close();
new File(originFile).delete();
ImgHandleResult imgHandleResult = new ImgHandleResult();
imgHandleResult.setImageSize(BigDecimalUtils.toMb(new BigDecimal(file.length())));
imgHandleResult.setImageWidth(width);
imgHandleResult.setImageHeight(height);
imgHandleResult.setImageSrc(outFile);
return imgHandleResult;
}
图片居中合成
/**
* 图片居中合成
* @param originFile 待处理图片
* @param outFile 输出图片
* @param width 原图的宽
* @param height 原图的高
* @return
* @throws Exception
*/
@SneakyThrows
public static ImgHandleResult imageSynthesis(String originFile, String outFile , int width, int height) {
FileInputStream inputStream = new FileInputStream(originFile);
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
int j = 0;
while ((j = inputStream.read()) != -1) {
fileOutputStream.write(j);
}
File file = new File(originFile);
Image src = javax.imageio.ImageIO.read(file);
BufferedImage thumbImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
//添加蒙版
Graphics2D g = thumbImage.createGraphics();
//设置透明背景
thumbImage = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g.dispose();
g = thumbImage.createGraphics();
//设置透明背景结束
//将图片和蒙版合成
BufferedImage bufferedImage = ImageIO.read(file);
g.drawImage(src.getScaledInstance(bufferedImage.getWidth(), bufferedImage.getHeight(), Image.SCALE_SMOOTH), (width-src.getWidth(null))/2, (height-src.getHeight(null))/2, null);
//将合成后的图片下载到本地
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outFile));
String formatName = outFile.substring(outFile.lastIndexOf(".") + 1);
ImageIO.write(thumbImage, /*"GIF"*/ formatName /* format desired */, new File(outFile) /* target */);
out.close();
file.delete();
ImgHandleResult imgHandleResult = new ImgHandleResult();
imgHandleResult.setImageSrc(outFile);
imgHandleResult.setImageWidth(width);
imgHandleResult.setImageHeight(height);
return imgHandleResult;
}
处理图片固定返回类
/**
* 图片处理后的结果
* @author micktiger
*
*/
@Data
public class ImgHandleResult {
//原图
private String imageSrcOriginal;
//处理后的图片宽高
private String imageSrc;
private int imageWidth;
private int imageHeight;
private BigDecimal imageSize;
//压缩
private String thumbSrc;
private BigDecimal thumbSize;
private int thumbWidth;
private int thumbHeight;
//处理的其他图片
private List<ImgHandleResult> imgHandleResultList = new ArrayList<>();
}
参考链接:设置透明图
https://blog.youkuaiyun.com/gingerredjade/article/details/53193014?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_paycolumn_v3&utm_relevant_index=12