图片裁剪,合成(设置透明背景)

对图片主体裁剪

        /**
         * 对图片主体裁剪
         * @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.csdn.net/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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值