服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 浅谈java如何生成分享海报工具类

浅谈java如何生成分享海报工具类

2021-09-02 15:20田三水 Java教程

这篇文章主要介绍了浅谈java如何生成分享海报工具类,想了解分享海报知识的同学不要错过哦

# 前言 例如:生成分享海报,比如注册扫二维码登录.分享商品海报等!本博文是基于springboot工程得!


一、使用步骤

1.导入pom依赖和上传图片到工程

代码如下(示例):在自己得通用工具类模块中导入坐标!(这需要根据自己得工程来)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--谷歌图片压缩-->
       <dependency>
           <groupid>net.coobird</groupid>
           <artifactid>thumbnailator</artifactid>
       </dependency>
       <!--谷歌图片压缩-->
       <dependency>
           <groupid>com.google.guava</groupid>
           <artifactid>guava</artifactid>
       </dependency>
       <!--生成二维码-->
       <dependency>
           <groupid>cn.hutool</groupid>
           <artifactid>hutool-extra</artifactid>
           <version>5.4.3</version>
       </dependency>
       <dependency>
           <groupid>com.google.zxing</groupid>
           <artifactid>core</artifactid>
           <version>3.3.3</version>
       </dependency>
       <!--生成二维码-->

代码如下(示例):
这里是要生成海报的模板和二维码的logo

浅谈java如何生成分享海报工具类

2.创建生成接口

代码如下(示例):
@loginuser:是自定义注解获取jwt的用户id(根据自己的需求和工程来)
@nologin:是项目种的白名单,不需要携带token的注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
   * 生成用户的邀请二维码
   *
   * @param userid 用户id
   */
  @getmapping("qrcode")
  @nologin
  public object qrcode(@loginuser integer userid) {
      //判断用户id是否为空
      if (userid == null) {
          return responseutil.fail("请选择用户");
      }
      //获取生成海报的图片路径
      string filepath = wxuserservice.qrcode(userid);
      return responseutil.ok(filepath);
  }

3.创建service层

代码如下(示例):
这是一个接口!需要自己实现该接口!实现接口代码在下面!

?
1
2
3
4
5
6
7
/**
  * 根据用户的邀请码生成分享海报
  *
  * @param userid
  * @return
  */
 string qrcode(integer userid);

代码如下(示例):
上面接口的实现类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
   * 根据用户的邀请码生成分享海报
   *
   * @param userid
   * @return
   */
  @override
  public string qrcode(integer userid) {
      try {
          // 根据用户id查询验证码
          userinfo userinfo = userservice.selectbyid(userid);
          //判断是否库是否存在海报地址
          if (!stringutils.isempty(userinfo.getposter())) {
              return userinfo.getposter();
          }
          //要生成海报的模板(一般在springboot工程的 resources下 我的工程路径:templates/poster/xjcq.png  可以改成自己工程需要的路径)
          file hbpath = resourceutils.getfile("classpath:templates/poster/xjcq.png");
          //要生成二维码的logo(一般在springboot工程的 resources下 我的工程路径:templates/poster/xjcqlogo.png 可以改成自己工程需要的路径)
          file logopath = resourceutils.getfile("classpath:templates/poster/xjcqlogo.png");
          // 获取上传后的路径
          string filepath = imageutil.drawstring(qrcodeinvitescheme + userinfo.getinvitecode(), userinfo.getinvitecode(), userinfo.getinvitecode(), hbpath, logopath);
          //file转multipartfile(因为我们的oss是转multipartfile)
          file file = new file(filepath);
          inputstream inputstream = new fileinputstream(file);
          multipartfile multipartfile = new mockmultipartfile(file.getname(), file.getname(),
                  contenttype.application_octet_stream.tostring(), inputstream);
          //上转至阿里云
          string s = storageutil.uploadossfile(multipartfile);
          //更改数据库
          userinfo updateuserinfo = new userinfo();
          updateuserinfo.setid(userinfo.getid());
          updateuserinfo.setposter(s);
          userservice.updatebyid(updateuserinfo);
          return updateuserinfo.getposter();
      } catch (filenotfoundexception e) {
          log.error("文件找不到:{}", e);
      } catch (ioexception e) {
          log.error("io异常:{}", e);
      }
      return null;
  }

4.生成海报的工具类

代码如下(示例):
wordpath类的代码,可以参考一下java获取yml配置文件内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.legend.core.config;
 
 
import lombok.data;
import org.springframework.beans.factory.annotation.value;
import org.springframework.stereotype.component;
 
/**
 * 获取全局配置path
 * @author admin
 */
@component
@data
public class wordpath {
     //生成电子合同的路径
     @value("${word.path}")
     private string wordpath;
     //生成海报的路径
     @value("${poster.path}")
     private string posterpath;
}

浅谈java如何生成分享海报工具类

代码如下(示例):
wordpath: 这个是我把要生成画报地址的路径配置到了yml中了,因为测试的使用用的是winodows,上了生产就用linux服务器了。所以配置到了yml中了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.legend.core.util;
 
import cn.hutool.extra.qrcode.qrcodeutil;
import cn.hutool.extra.qrcode.qrconfig;
import com.google.zxing.qrcode.decoder.errorcorrectionlevel;
import com.legend.core.config.wordpath;
import lombok.extern.slf4j.slf4j;
import org.apache.commons.io.ioutils;
import org.springframework.core.io.defaultresourceloader;
import org.springframework.core.io.resourceloader;
import org.springframework.stereotype.service;
 
import javax.annotation.resource;
import javax.imageio.imageio;
import javax.imageio.stream.imageoutputstream;
import java.awt.*;
import java.awt.image.bufferedimage;
import java.io.*;
 
/**
 * 生成分享好友
 *
 * @author 生成分享好友
 */
@service
@slf4j
public class imageutil {
    //我把生成海报地址的路径配置到了springboot的yml配置文件中了
    @resource
    private wordpath wordpath;
 
    /**
     * 生成海报
     *
     * @param content  二维码内容
     * @param written  文字内容
     * @param filepath 保存文件 例:1.png    (d:/1.png)
     * @param hbpath   海报图片地址 例:1.png   (d:/1.png)
     * @param logopath 二维码logo
     * @return
     * @author uncle
     * @description 在一张背景图上添加二维码
     * @date 2020-09-28 23:59
     */
    public string drawstring(string content, string written, string filepath, file hbpath, file logopath) {
        try {
            bufferedimage image = addwater(content, hbpath, logopath);
            graphics2d gd = image.creategraphics();
            // 3、设置对线段的锯齿状边缘处理
            gd.setrenderinghint(renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear);
            // 5、设置水印文字颜色
            gd.setcolor(color.darkgray);
            // 6、设置水印文字font
            gd.setfont(new font("苹方", font.plain, 32));
            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
            gd.drawstring(written, 440, 1122);
            gd.dispose();
 
            bytearrayoutputstream bs = new bytearrayoutputstream();
            imageoutputstream imout = imageio.createimageoutputstream(bs);
            imageio.write(image, "png", imout);
            inputstream inputstream = new bytearrayinputstream(bs.tobytearray());
 
            // 获取yml海报的配置
            string file = wordpath.getposterpath() + filepath + ".png";
            if (!new file(wordpath.getposterpath()).exists()) {
                new file(wordpath.getposterpath()).mkdirs();
            }
            outputstream outstream = new fileoutputstream(file);
            ioutils.copy(inputstream, outstream);
            inputstream.close();
            outstream.close();
            // 返回文件地址
            return file;
        } catch (exception e) {
            log.error("海报生成失败:", e);
        }
        return null;
    }
 
 
    /***
     * 在一张背景图上添加二维码
     */
    public bufferedimage addwater(string content, file hbpath, file logopath) throws exception {
        // 读取原图片信息
        //得到文件
        //file file = new file(hbpath);
        //文件转化为图片
        image srcimg = imageio.read(hbpath);
        //获取图片的宽
        int srcimgwidth = srcimg.getwidth(null);
        //获取图片的高
        int srcimgheight = srcimg.getheight(null);
        // 加水印
        bufferedimage bufimg = new bufferedimage(srcimgwidth, srcimgheight, bufferedimage.type_int_rgb);
        graphics2d g = bufimg.creategraphics();
        g.drawimage(srcimg, 0, 0, srcimgwidth, srcimgheight, null);
        //使用工具类生成二维码
        image image = createqrcode(content, 230, 230, logopath);
        //将小图片绘到大图片上,500,300 .表示你的小图片在大图片上的位置。
        g.drawimage(image, 25, 1070, null);
        //设置颜色。
        g.setcolor(color.white);
        g.dispose();
        return bufimg;
    }
 
    private bufferedimage createqrcode(string content, int width, int height, file logopath) throws ioexception {
        qrconfig config = new qrconfig(width, height);
        if (logopath != null) {
            image image = imageio.read(new fileinputstream(logopath));
            config.setimg(image);
        }
        config.seterrorcorrection(errorcorrectionlevel.h);
        return qrcodeutil.generate(
                content,
                config);
    }
 
    public inputstream resourceloader(string filefullpath) throws ioexception {
        resourceloader resourceloader = new defaultresourceloader();
        return resourceloader.getresource(filefullpath).getinputstream();
    }
 
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了如何生成分享海报。例如:以上就是今天要讲的内容,本文仅仅简单介绍了如何生成分享海报。

以上就是java 生成分享海报工具类的详细内容,更多关于java 生成分享海报工具类的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/m0_48219908/article/details/115481535

延伸 · 阅读

精彩推荐
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16