spring boot 生成拼团海报

依赖


            cn.hutool
            hutool-all
            5.5.7
        

生成海报图片

/**
     * 拼团海报
     */
    @AppLog(value = "拼团海报", type = 1)
    @AuthCheck
    @GetMapping("/poster")
    @ApiOperation(value = "拼团海报",notes = "拼团海报")
    public ApiResult poster(String id) throws IOException {
        YxUser yxUser = LocalUser.getUser();
        String apiUrl = systemConfigService.getData(SystemConfigConstants.API_URL);
        if(StrUtil.isEmpty(apiUrl)){
            throw new YshopException("未配置api地址");
        }
        if(StringUtils.isBlank(id)){
            throw new YshopException("参数 id 不能为空");
        }

        String fileDir = path+"qrcode"+ File.separator;

        YxStorePinkMaster byId = yxStorePinkMasterService.getById(id);
        if(byId == null){
            throw new YshopException("拼团不存在或已结束");
        }

        YxStoreCombination byId1 = yxStoreCombinationService.getById(byId.getPinkProductId());
        if(byId1 == null){
            throw new YshopException("拼团产品不存在");
        }
        YxStorePinkMember yxStorePinkMember = null;
        List list = yxStorePinkMemberService.lambdaQuery().eq(YxStorePinkMember::getPId, byId.getId()).list();
        if(!list.isEmpty()){
            yxStorePinkMember = list.get(0);
        }

        String QRCode = StrUtil.format("pink_{}_{}_QRCode.jpg",byId.getPinkProductId(),yxUser.getUid());
        String poster = StrUtil.format("pink_{}_{}_poster.jpg",byId.getPinkProductId(),yxUser.getUid());

        String qrcodeUrl="";
        String posterUrl="";

        YxSystemAttachment info = systemAttachmentService.getInfo(QRCode);
        if (info != null){
            qrcodeUrl = apiUrl + "/api/file/" + info.getSattDir();
        }else{
            QrCodeUtil.generate(StrUtil.format("{}/transferPage?type=joinPink&masterId={}",apiUrl,byId.getId()), 180, 180,
                    FileUtil.file(fileDir+QRCode));
            qrcodeUrl = apiUrl + "/api/file/qrcode/"+QRCode;

            YxSystemAttachment attachment0 =  YxSystemAttachment.builder()
                    .name(QRCode)
                    .attSize(String.valueOf(FileUtil.size(new File(fileDir+QRCode))))
                    .attDir(fileDir+QRCode)
                    .attType("image/jpeg")
                    .sattDir("qrcode/"+QRCode)
                    .build();
            systemAttachmentService.save(attachment0);
        }

        YxSystemAttachment info1 = systemAttachmentService.getInfo(poster);
        if(info1 != null){
            posterUrl = apiUrl + "/api/file/" + info1.getSattDir();
        }else{
            /**
             * 开始创建图片
             */
            BufferedImage img = new BufferedImage(1400, 1040, BufferedImage.TYPE_INT_RGB);
            //开启画图
            Graphics g = img.getGraphics();
            InputStream stream =  getClass().getClassLoader().getResourceAsStream("background.png");
            ImageInputStream background = ImageIO.createImageInputStream(stream);
            BufferedImage back = ImageIO.read(background);
            g.drawImage(back.getScaledInstance(1400, 1040, Image.SCALE_DEFAULT), 0, 0, null); // 绘制缩小后的图
            g.dispose();
            //先将画好的海报写到本地
            File file = new File(fileDir+poster);
            try {
                ImageIO.write(img, "jpg",file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            Image image0 = ImageIO.read(new File(fileDir+poster) );

            //商品图
            Image image = ImageIO.read(new URL(byId1.getImage()));
            Image scale = ImgUtil.scale(
                    image,
                    1350,
                    580
            );

            Image image1 = ImgUtil.pressImage(
                    image0,
                    scale, //水印图片
                    0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                    -195, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                    1f
            );
            //头像
            Image image2 = ImageIO.read(new URL(yxUser.getAvatar()));
            Image scale4 = ImgUtil.scale(
                    image2,
                    160,
                    160
            );
            Image image3 = ImgUtil.pressImage(
                    image1,
                    scale4, //水印图片
                    -596, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                    220, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                    1f
            );
            //二维码
            Image image5 = ImageIO.read(new URL(qrcodeUrl));
            Image scale5 = ImgUtil.scale(
                    image5,
                    250,
                    250
            );
            Image image6 = ImgUtil.pressImage(
                    image3,
                    scale5, //水印图片
                    540, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                    350, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                    1f
            );

            //邀请语
            Image image7 = ImgUtil.pressText(image6, yxUser.getNickname() + " " + "邀请您加入拼团:", Color.BLACK, new Font("黑体", Font.BOLD, 40), -200, 180, 1F);

            //已支付人数
            image7 = ImgUtil.pressText(image7, StrUtil.format("已支付人数:{}",byId.getPaidPeopleNumber()), Color.BLACK, new Font("黑体", Font.BOLD, 40), -350, 260, 1F);
            //结束时间
            image7 = ImgUtil.pressText(image7, StrUtil.format("结束时间:{}", DateUtil.format(byId.getFinishDate(), "yyyy-MM-dd HH:mm:ss")), Color.BLACK, new Font("黑体", Font.BOLD, 40), 200, 260, 1F);

            //扫码提示
            image7 = ImgUtil.pressText(image7, "扫描二维码加入拼团", Color.BLACK, new Font("黑体", Font.BOLD, 30), 505, 505, 1F);

            if(yxStorePinkMember != null){
                //原价
                image7 = ImgUtil.pressText(image7, StrUtil.format("原价:{}",yxStorePinkMember.getBeforeDiscountAmount()), Color.BLACK, new Font("黑体", Font.BOLD, 40), -365, 340, 1F);
                //当前阶梯团优惠价
                image7 = ImgUtil.pressText(image7, StrUtil.format("当前人数优惠价:{}", yxStorePinkMember.getAfterDiscountAmount()), Color.BLACK, new Font("黑体", Font.BOLD, 40), 100, 340, 1F);
            }

            ImgUtil.write(image7,file);
            YxSystemAttachment attachment0 =  YxSystemAttachment.builder()
                    .name(poster)
                    .attSize(String.valueOf(FileUtil.size(new File(fileDir+poster))))
                    .attDir(fileDir+poster)
                    .attType("image/jpeg")
                    .sattDir("qrcode/"+poster)
                    .build();
            systemAttachmentService.save(attachment0);

            posterUrl = apiUrl + "/api/file/qrcode/"+poster;
        }
        return ApiResult.ok(posterUrl);
    } 
  

你可能感兴趣的:(spring,boot,spring,boot,java,spring)