Spring Boot + hutool 创建海报图片

Spring Boot + hutool 创建海报图片

复制代码
/**
     * 分享,生成图片
     * @param id
     * @return
     */
    @GetMapping("/getShareImg")
    public void getShareImg(String id,HttpServletResponse response) throws IOException {
        CouponConsignSaleClassify byId = couponConsignSaleClassifyService.getById(id);
        if(byId == null){
            throw new GlobalException("查询 id 为空 ");
        }

        CouponConsignSaleGoods one = couponConsignSaleGoodsService.lambdaQuery().eq(CouponConsignSaleGoods::getClassifyId, id).ge(CouponConsignSaleGoods::getStock, 1)
                .orderByAsc(CouponConsignSaleGoods::getPurchasePrice).last(" limit 0,1").one();

        /*final int w = 270 * 2;
        final int h = 340 * 2;*/

        final int w = 405;
        final int h = 550;

        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);
        Graphics2D graphics2D = bi.createGraphics();
        //绘制白色背景
        graphics2D.setColor(Color.white);
        graphics2D.fillRect(0, 0, w, h);

        //释放资源
        graphics2D.dispose();

        String tempPath = System.getProperty("java.io.tmpdir");

        //System.out.println(tempPath);

        File outputfile = new File(tempPath+"poster.jpg");
        ImageIO.write(bi, "jpg", outputfile);

        //分类图片
        Image image = ImgUtil.getImage(new URL(transformStyle(byId.getImg())));

        File scaleImg = new File(tempPath+"imgScale.jpg");
        ImgUtil.scale(image,scaleImg,1.2f);
        BufferedImage read = ImageIO.read(scaleImg);
        //画图片
        ImgUtil.pressImage(outputfile,outputfile,read,0,-140,1f);

        //商品名称
        String name = byId.getName();
        ImgUtil.pressText(outputfile,outputfile,name,Color.black,new Font("黑体", Font.PLAIN, 20),-170+(name.length() * 10),0,0.8f);

        String lowestPrice=byId.getMaxPrice()==null?"":byId.getMaxPrice().toPlainString();
        if(one != null){
            lowestPrice = one.getPrice().toPlainString();
        }

        //最低价格
        String p="最低价格:"+lowestPrice;
        ImgUtil.pressText(outputfile,outputfile,p,Color.red,new Font("黑体", Font.PLAIN, 22),-200 + (p.length() * 11),35,0.8f);

        //原价
        ImgUtil.pressText(outputfile,outputfile,"原价:"+(byId.getMaxPrice()==null?"-":byId.getMaxPrice()),Color.black,new Font("黑体", Font.PLAIN, 15),50,30,0.8f);

        String url="http://qy.gsjf.cc/h5/#/pages/buy/consignBuy/consignBuy?id="+byId.getId();
        String qrFile=tempPath+"qrFile.jpg";
        File file = FileUtil.file(qrFile);

        //生成二维码
        QrCodeUtil.generate(url, 180, 180,
                file);
        BufferedImage qrFile0 = ImageIO.read(file);
        //显示二维码
        ImgUtil.pressImage(outputfile,outputfile,qrFile0,0,130,1f);

        //显示文字
        ImgUtil.pressText(outputfile,outputfile,"识别二维码查看详情",Color.black,new Font("黑体", Font.PLAIN, 16),-07,250,0.6f);

       /* ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(bi, "jpg", os);*/


        byte[] bFile = Files.readAllBytes(outputfile.toPath());

        response.setContentType("image/jpg"); //设置返回的文件类型
        OutputStream respOut = response.getOutputStream();
        respOut.write(bFile);
        respOut.flush();
        respOut.close();
    }

    /**
     * 对中文字符进行UTF-8编码
     * @param source 要转义的字符串
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String transformStyle(String source) throws UnsupportedEncodingException
    {
        char[] arr = source.toCharArray();
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < arr.length; i++)
        {
            char temp = arr[i];
            if(isChinese(temp))
            {
                sb.append(URLEncoder.encode("" + temp, "UTF-8"));
                continue;
            }
            sb.append(arr[i]);
        }
        return sb.toString();
    }
    /**
     * 判断是不是中文字符
     * @param c
     * @return
     */
    public static boolean isChinese(char c)
    {

        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);

        if(ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS

                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS

                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A

                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION

                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION

                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS)
        {

            return true;

        }

        return false;

    }

效果

相关推荐
Dovis(誓平步青云)1 天前
《Linux CPU频率为何忽高忽低:cpufreq、idle状态与性能抖动教程》
linux·运维·服务器·spring boot·后端·生成对抗网络
Lhappy嘻嘻1 天前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
To_OC1 天前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
伊玛目的门徒1 天前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
逝水无殇1 天前
C# 异常处理详解
开发语言·后端·c#
懒鸟一枚1 天前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123451 天前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑1 天前
Sentinel安装
java·后端·微服务
IT_陈寒1 天前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
碎碎念_4921 天前
SpringBoot + Vue 前后端分离从 0 到 1 完整环境配置流程
vue.js·spring boot·后端