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;

    }

效果

相关推荐
思考着亮12 分钟前
5.数据库ORM_连接池_自动事务_增删改查高级语法与字典解包
后端
一嘴一个橘子21 分钟前
springmvc 全局异常处理【补充】
java
叫我:松哥24 分钟前
基于flask仿小米商城管理系统,使用flask开的一个商场网站
数据库·后端·python·flask
Wang's Blog32 分钟前
Vibe Coding一人即团队系列35: 基于Claude Code的Spring Boot项目初始化实践
java·spring boot·后端
Dovis(誓平步青云)1 小时前
拍视频前先把镜头想清楚:做一个分镜取景辅助器
android·java·服务器·javascript·人工智能
AI人工智能+电脑小能手1 小时前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
2601_962065251 小时前
从零创建一个 Django 项目
后端·python·django
吴声子夜歌1 小时前
Java——开发中通用的方法和准则(二)
java·开发语言·php
袁震1 小时前
HarmonyOS 应用包体积优化与上架自检实战:从 76.2MB 到 3.6MB
java·华为·性能优化·harmonyos
zcmodeltech2 小时前
反应装置模型控制系统设计与实现:多设备协同联动方案
java·网络·数据库·stm32·嵌入式硬件·能源·制造