文档章节

java微信小程序参数二维码生成带背景图加字体(无限生成)

第九程序
 第九程序
发布于 2017/07/11 10:12
字数 822
阅读 104
收藏 0

java微信小程序参数二维码生成带背景图加字体开发教程:


需求 : 
1,因为项目需求 ,生成数以万计的二维码   

   2 ,每个二维码带不同的参数

   3,二维码有固定背景图 
   4 , 往生成图片上写入 字体和编号(动态 )

设计技术 :

 1,微信接口token ,nginx 缓存

  2,二维码 图片定义 写字

maven


com.twelvemonkeys.imageio 
imageio-jpeg 
3.0-rc5 

还有rt.jar 在你java安装文件的bin里面

获取token信息

public void GetUrl() throws ClientProtocolException,
    IOException {
        HttpGet httpGet = new HttpGet(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                        + Configure.getAppID() + "&secret="
                        + Configure.getSecret() );
        HttpClient httpClient = HttpClients.createDefault();
        HttpResponse res = httpClient.execute(httpGet);
        HttpEntity entity = res.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        JSONObject jsons = JSONObject.fromObject(result);
        String expires_in = jsons.getString("expires_in");

        //缓存
        if(Integer.parseInt(expires_in)==7200){
            //ok
            String access_token = jsons.getString("access_token");
            Jedis cache = new Jedis("127.0.0.1", 6379);
            System.out.println("access_token:"+access_token);
            Pipeline pipeline = cache.pipelined();
            pipeline.set("access_token", access_token);
            pipeline.expire("access_token", 7200);
            pipeline.sync();
        }else{
            System.out.println("出错获取token失败!");
        }

    }

  获取二维码 信息图片

    public String GetPostUrl(String access_token,String id) throws Exception {
          //String result = HttpRequest.sendPost("http://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+access_token, path);
        System.out.println(id);
        String url ="https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=";
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("path", "pages/index/index?###="+id);//你二维码中跳向的地址
         map.put("width", "430");//图片大小
         JSONObject json = JSONObject.fromObject(map);
         System.out.println(json);
        String  res= HttpClientConnectionManager.httpPostWithJSON(url
                     + access_token, json.toString(),id);
         System.out.println(res);
        return null;
    }

返回图片保存 ,根据 id

public static String httpPostWithJSON(String url, String json,String id)
                throws Exception {
            String result = null;
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");

            StringEntity se = new StringEntity(json);
            se.setContentType("application/json");
            se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
                            "UTF-8"));
            httpPost.setEntity(se);
            // httpClient.execute(httpPost);
            HttpResponse response = httpClient.execute(httpPost);
            if (response != null) {
                HttpEntity resEntity = response.getEntity();
                if (resEntity != null) {
                        InputStream instreams = resEntity.getContent(); 
                        String uploadSysUrl = "D://erweima/";
                        File saveFile = new File(uploadSysUrl+id+".png");
                           // 判断这个文件(saveFile)是否存在
                           if (!saveFile.getParentFile().exists()) {
                               // 如果不存在就创建这个文件夹
                               saveFile.getParentFile().mkdirs();
                           }
                    saveToImgByInputStream(instreams, uploadSysUrl, id+".png");
                }
            }
            httpPost.abort();
            return result;
        } 

        /* @param instreams 二进制流
    * @param imgPath 图片的保存路径
    * @param imgName 图片的名称
    * @return
    *      1:保存正常
    *      0:保存失败
    */
   public static int saveToImgByInputStream(InputStream instreams,String imgPath,String imgName){

       int stateInt = 1;
       if(instreams != null){
           try {
               File file=new File(imgPath+imgName);//可以是任何图片格式.jpg,.png等
               FileOutputStream fos=new FileOutputStream(file);

               byte[] b = new byte[1024];
               int nRead = 0;
               while ((nRead = instreams.read(b)) != -1) {
                   fos.write(b, 0, nRead);
               }
               fos.flush();
               fos.close();                
           } catch (Exception e) {
               stateInt = 0;
               e.printStackTrace();
           } finally {
               try {
                instreams.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           }
       }
       return stateInt;
   }

然后是图片重合和增加字体

public void changeImage(String imageurl,String i ){
        try { 
//            InputStream imagein = new FileInputStream(
//                    "D:/systemAvatarNew1.png");
//            InputStream imagein2 = new FileInputStream(
//                    "D:/qqfile/1852230493/FileRecv/4-02.png");
            InputStream imagein = new FileInputStream(
                    "D:/systemAvatarNew1.png");
            InputStream imagein2 = new FileInputStream(
                    imageurl);

            BufferedImage image = ImageIO.read(imagein);
            BufferedImage image2 = ImageIO.read(imagein2); 
            //image2.getWidth() - 160, image2.getHeight() - 155,
            Graphics g = image.getGraphics();
            g.drawImage(image2, 300, 230, 410,422,null);
//            g.drawImage(image2, image.getWidth() - image2.getWidth() - 195,
//                    image.getHeight() - image2.getHeight() - 190,
//                     340,349,null);
            OutputStream outImage = new FileOutputStream(
                    imageurl);
            JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(outImage);
            enc.encode(image);


            BufferedImage bimg=ImageIO.read(new FileInputStream(imageurl));  
            //得到Graphics2D 对象  
            Graphics2D g2d=(Graphics2D)bimg.getGraphics();  
            //设置颜色和画笔粗细  
            g2d.setColor(Color.black);  
            g2d.setStroke(new BasicStroke(5));  
            //String pathString = "D://qqfile/1852230493/FileRecv/SourceHanSansCN-/SourceHanSansCN-Heavy.otf";
//            Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, new File(pathString));

            g2d.setFont(new Font("微软雅黑", Font.PLAIN, 36));  
            //g2d.setFont(Loadfont.loadFont(pathString, 45));  
            //绘制图案或文字  
            g2d.drawString("编号: "+i, 320, 700);  
          //  g2d.drawString(i, 450, 700);    

            ImageIO.write(bimg, "JPG",new FileOutputStream(imageurl));


            File fromFile = new File(imageurl);  
            File toFile = new File(imageurl);  
            Image1 Image1 =new Image1();
            Image1.resizePng(fromFile, toFile, 1000, 1000, false);



            imagein.close();
            imagein2.close();
            outImage.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

接下来再 main方法里面跑一下 就ok ,如果是需要返回前台信息的,就直接记录地址,前台显示就可以了

© 著作权归作者所有

共有 人打赏支持
第九程序
粉丝 84
博文 142
码字总数 172691
作品 0
厦门
程序员
调用腾讯优图开放平台进行人脸识别-Java调用API实现

人脸检测V3在线体验:http://123.207.12.111/xai/rest/face/index 第一步:鉴权服务技术方案 Java代码实现如下 需要的HMACSHA1代码及随机数代码...

小帅帅丶
2017/08/18
0
10
【值得收藏】微信小程序开发干货合集,快上车!

小程序的成功,让广大程序员早已不再纠结该不该学习小程序开发 ,但会纠结如何学习小程序开发,为帮助大家更好的学习小程序开发,特地整理一批相关学习资源,供大家交流学习! 近期优秀文章 ...

慕课网
08/10
0
0
微信小程序端 html2wxml 转换接口 - html2wxml4j

项目介绍 微信小程序端 html2wxml 转换接口 Java版 基于JFinal+Jsoup 实现功能 目前仅实现解析Html并转换成JSON,将生成的JSON通过接口访问返回给微信小程序端, 微信小程序端使用html2wxml...

山东-小木
08/06
0
0
java实现微信小程序登录态维护

    相信不少喜欢开发的朋友都已经知道微信小程序是个什么物种了,楼主也是从小程序内测期间就开始关注,并且也写过几个已经上线的微信小程序。但是基本上都是写的纯前端,最近楼主从后端...

流浪的家猫
2017/09/30
0
0
Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)

前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析。 一、问题引出 先看...

pony1223
07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

play framework 如何支持多数据源

有段时间没有写博客了,但今天又写一篇了,主要是因为这事有一丝自己的思考和动手实践,所以就记录下来了。 现有的问题: play 1.2.4 两台数据库服务器,但是play1.2.4 并不支持同时连接两台...

tuerqidi
15分钟前
0
0
Mysql only_full_group_by解析

查看当前数据库模式: select @@sql_mode; 原因: mysql 5.7中的sql_mode的值中包含'ONLY_FULL_GROUP_BY'; 处理:执行以下SQL set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,N......

年轻的中年大叔
17分钟前
0
0
防止表单重复提交

1:前端方式(治标不治本) $("#admin-role-save").click(function(){//admin-role-save为submit的idvar ts=$(this);var ts_old_val=ts.val();ts.val("提交中....");ts.att...

uug
17分钟前
0
0
保持屏幕常亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 在act的created方法中调用即可,一般是播放视频的时候......

Carbenson
17分钟前
0
0
智能合约实施指南

与区块链技术一样,智能合约在商业领域也非常有价值。 为了让我们的读者彻底了解智能合约是什么以及它们如何影响现代商业的交易方式,我们准备了本指南。 集中商业模式正在给去中心化的模式让...

geek12345
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部