springboot 实现图片合并

背景:商城要做活动,要生成商户的活动二维码,现在有了活动的底图模板,商户上传自己的二维码就可以生成活动图。可以上传压缩包,也可以上传单个图。

转换工具类

public class ImageUtils {

    private Logger logger = LoggerFactory.getLogger(ImageUtils.class);

    private static Map<String, String>  exitFile = new HashMap<>();

/**
     * 处理 图片二维码,写入流
     *
     * @param file
     * @param zos
     * @throws Exception
     */
    public void mergeImg(MultipartFile file, ZipOutputStream zos) throws Exception {
        String name = file.getOriginalFilename();
        String format = name.substring(name.lastIndexOf(".") + 1);

        // 如果文件已存在就更改名字,不然putNextEntry 会报错
        while (exitFile.containsKey(name)) {
            String fileName = name.substring(0, name.lastIndexOf("."));
            name = fileName + "-1." + format;
        }

        zos.putNextEntry(new ZipEntry(name));
        exitFile.put(name, name);
        InputStream temIs =     this.getClass().getResourceAsStream("/template/template1.jpg");

        BufferedImage code = ImageIO.read(file.getInputStream());
        int width = code.getWidth();
        int heigth = code.getHeight();

        BufferedImage b = ImageIO.read(temIs);
        Graphics2D g = b.createGraphics();
        g.drawImage(code, 500, 1100, width, heigth, null);
        g.dispose();

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(b, format, os);
        zos.write(os.toByteArray());

        temIs.close();
    }

/**
     * 处理压缩包内的图片,写入流
     *
     * @param file
     * @param zos
     */
    public void mergeZip(MultipartFile file, ZipOutputStream zos) {
        try {
            File zip = FileUtils.transferToFile(file);
            ZipFile zf = new ZipFile(zip, Charset.forName("GBK"));
            Enumeration<? extends ZipEntry> iter = zf.entries();
            while (iter.hasMoreElements()) {
                ZipEntry entry = iter.nextElement();

                String name = entry.getName();
                String format = name.substring(name.lastIndexOf(".") + 1);
                // 如果文件已存在就更改名字,不然putNextEntry 会报错
                while (exitFile.containsKey(name)) {
                    String fileName = name.substring(0, name.lastIndexOf("."));
                    name = fileName + "-1." + format;
                }

                zos.putNextEntry(new ZipEntry(name));
                exitFile.put(name, name);

                InputStream ins = zf.getInputStream(entry);
                BufferedImage codeBi = ImageIO.read(ins);
                int cw = codeBi.getWidth();
                int ch = codeBi.getHeight();

                InputStream temIs = this.getClass().getResourceAsStream("/template/template1.jpg");
                BufferedImage b = ImageIO.read(temIs);
                Graphics2D g = b.createGraphics();
                g.drawImage(codeBi, 500, 1100, cw, ch, null);
                g.dispose();

                ByteArrayOutputStream os = new ByteArrayOutputStream();
                ImageIO.write(b, format, os);
                zos.write(os.toByteArray());

                os.close();
                temIs.close();
                ins.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void flushExitFileMap() {
        exitFile.clear();
    }
}
MultipartFile 转 FIle 

    public static File transferToFile(MultipartFile multipartFile) {
//        选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            String[] filename = originalFilename.split("\\.");
            file = File.createTempFile(filename[0], filename[1]);
            multipartFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

service 调用

public void qrcode(MultipartFile[] files, HttpServletResponse response) {
        try {
            if (files != null && files.length > 0) {
                ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
                ImageUtils utils = new ImageUtils();
                utils.flushExitFileMap();
                for (MultipartFile file : files) {
                    String name = file.getOriginalFilename();
                    String format = name.substring(name.lastIndexOf(".") + 1);
                    if ("jpg".equalsIgnoreCase(format) || "png".equalsIgnoreCase(format) || "jpeg".equalsIgnoreCase(format)) {
                        utils.mergeImg(file, zos);
                    } else if ("zip".equalsIgnoreCase(format)) {
                        utils.mergeZip(file, zos);
                    }
                }
                zos.closeEntry();
                zos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

controller 

@PostMapping(value = "/qrcode")
public void qrcode(@RequestParam("files") MultipartFile[] files, HttpServletResponse response) throws UnsupportedEncodingException {
        String fileName = URLEncoder.encode("商户活动码牌.zip", "UTF-8");
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        imageService.qrcode(files, response);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值