使用技術: 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); }