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


    需求 : 

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

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

        3,二维码有固定背景图  

             4 , 往生成图片上写入 字体和编号(动态 ) 

    设计技术 :

       1,微信接口token ,nginx 缓存 

       2,二维码 图片定义 写字 

    maven 

    <dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-jpeg</artifactId>
    <version>3.0-rc5</version>
    </dependency>

    还有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 ,如果是需要返回前台信息的,就直接记录地址,前台显示就可以了 

    需要源码的可以加qq1852230493

  • 相关阅读:
    django-orm基础字段及选项1
    django-模型层
    django-应用及分布式路由
    django-static配置静态文件
    django-url反向解析
    django-url路径书写规范
    django-模板继承 block、endblock、 extend
    详解HTML中的表单元素
    详解HTML中的表格标签
    jQuery和AJAX基础
  • 原文地址:https://www.cnblogs.com/jinxinblogs/p/7131663.html
Copyright © 2020-2023  润新知