小程序生成商品分享二維碼海報解決方案和實現方式JAVA


使用技術:  Graphics , 七牛雲 , 微信sdk(github上非常出名的wxjava,地址https://github.com/Wechat-Group/WxJava/)
直接上干貨代碼,每一步都有詳細注釋, TODO 的地址修改為自己的信息,一個合格的程序員懂得靈活運用代碼. 如果想實現畫入文字並且更具 \n 自動換行,可根據代碼自行優化(已經實現自動換行).

   @Test
    public void share() throws Exception {
        //創建圖片
        BufferedImage img = new BufferedImage(750, 1334, BufferedImage.TYPE_INT_RGB);
        //開啟畫圖
        Graphics g = img.getGraphics();
        //背景 -- 讀取互聯網圖片
        BufferedImage back  = ImageIO.read(new URL("填寫海報的背景圖片鏈接"));
        g.drawImage(back.getScaledInstance(750, 1334, Image.SCALE_DEFAULT), 0, 0, null); // 繪制縮小后的圖
        //商品  banner圖
        //讀取互聯網圖片
        BufferedImage priductUrl = ImageIO.read(new URL("填寫自己的banner圖,線上鏈接")); //TODO
        g.drawImage(priductUrl.getScaledInstance(690,516,Image.SCALE_DEFAULT),29,61,null);
        //文案標題
        g.setFont(new Font("微軟雅黑", Font.BOLD, 34));
        g.setColor(new Color(29,29,29));
        //繪制文字
        g.drawString("填寫文案標題", 31, 638);//TODO
        //文案
        g.setFont(new Font("微軟雅黑", Font.PLAIN, 30));
        g.setColor(new Color(47,47,47));
        int fontlen = getWatermarkLength("填寫文內容", g);//TODO
        //文字長度相對於圖片寬度應該有多少行
        int line = fontlen / (back.getWidth() - 90);
        //高度
        int y = back.getHeight() - (line + 1) * 30 - 500;
        //文字疊加,自動換行疊加
        int tempX = 32;
        int tempY = y;
        //單字符長度
        int tempCharLen = 0;
        //單行字符總長度臨時計算
        int tempLineLen = 0;
        StringBuffer sb =new StringBuffer();
        for(int i=0; i < "填寫文內容".length(); i++) {//TODO
            char tempChar = "填寫文內容".charAt(i);//TODO
            tempCharLen = getCharLen(tempChar, g);
            tempLineLen += tempCharLen;
            if(tempLineLen >= (back.getWidth()-90)) {
                //長度已經滿一行,進行文字疊加
                g.drawString(sb.toString(), tempX, tempY + 50);
                //清空內容,重新追加
                sb.delete(0, sb.length());
                //每行文字間距50
                tempY += 50;
                tempLineLen =0;
            }
            //追加字符
            sb.append(tempChar);
        }
        //最后疊加余下的文字
        g.drawString(sb.toString(), tempX, tempY + 50);
 
        //價格背景
        //讀取互聯網圖片
        BufferedImage bground  = ImageIO.read(new URL("填寫自己的價格背景圖,七牛圖片鏈接"));//TODO
        // 繪制縮小后的圖
        g.drawImage(bground.getScaledInstance(160, 40, Image.SCALE_DEFAULT), 30, 1053, null);
 
        //限時促銷價
        g.setFont(new Font("微軟雅黑", Font.PLAIN, 24));
        g.setColor(new Color(255,255,255));
        g.drawString("限時促銷價", 50, 1080);
 
        //價格
        g.setFont(new Font("微軟雅黑", Font.PLAIN, 50));
        g.setColor(new Color(249,64,64));
        g.drawString("¥" + "填寫商品的價格", 29, 1162);//TODO
 
        //原價
        g.setFont(new Font("微軟雅黑", Font.PLAIN, 36));
        g.setColor(new Color(171,171,171));
        String price = "¥" + "填寫商品的原價";//TODO
        g.drawString(price, 260, 1160);
        g.drawLine(250,1148,260+150,1148);
 
        //商品名稱
        g.setFont(new Font("微軟雅黑", Font.PLAIN, 32));
        g.setColor(new Color(29,29,29));
        g.drawString("填寫商品名稱", 30, 1229);//TODO
 
        //生成二維碼返回鏈接
        String url = "";//TODO
        //讀取互聯網圖片
        BufferedImage qrCode  = ImageIO.read(new URL(url));
        // 繪制縮小后的圖
        g.drawImage(qrCode.getScaledInstance(174, 174, Image.SCALE_DEFAULT), 536, 1057, null);
 
        //二維碼字體
        g.setFont(new Font("微軟雅黑", Font.PLAIN, 25));
        g.setColor(new Color(171,171,171));
        //繪制文字
        g.drawString("掃描或長按小程序碼", 515, 1260);
 
        g.dispose();
        //保存到本地 生成文件名字
        String iconKey = UUID.randomUUID().toString() +".png"; //TODO
        //先將畫好的海報寫到本地
        String picUrl = "填寫自己電腦的路徑" + iconKey; // TODO
        File file = new File(picUrl);
        ImageIO.write(img, "jpg",file);
        //再將file上傳至七牛返回鏈接存入數據庫
        //end
        // TODO
        }
 
    /**
     * 獲取水印文字總長度
     *@paramwaterMarkContent水印的文字
     *@paramg
     *@return水印文字總長度
     */
    public int getWatermarkLength(String waterMarkContent, Graphics g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(),0, waterMarkContent.length());
    }
    public int getCharLen(char c, Graphics g) {
        return g.getFontMetrics(g.getFont()).charWidth(c);
    }
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM