構想:
在現有的圖片裡,列如樣版票圖,再加入亂數碼,以區別每個票圖的唯一性。
想法:
取得亂數碼,打開樣版票圖,取得畫筆(Graphics2D),把亂數碼設定到TextLayout圖層上,
計算放置TextLayout圖層的x及y坐標,把圖層draw到樣版圖上,輸出到以亂數碼為名稱之圖檔。
以下是範例程式:
程式大樣分成二大部份,一是圖形的加註文字,二是取得亂數編號的方式。
import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.font.TextLayout; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; public class CombineRndImg { public void run(String FilePath,String FileName) throws Exception { String text = getRnd(8); BufferedImage im = ImageIO.read(new java.io.File(FilePath+FileName)); Graphics2D g = im.createGraphics(); //去除鋸齒等... g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setFont(new Font("Dialog", Font.PLAIN, 20)); TextLayout tl = new TextLayout(text, g.getFont(), g.getFontRenderContext()); Rectangle2D bounds = tl.getBounds(); //計算文字要放置的位置 double x = (im.getWidth()-bounds.getWidth()) - bounds.getX()-50; double y = (im.getHeight()-bounds.getHeight()) - bounds.getY()-80; //從綠色到紅色的漸層 g.setPaint(new GradientPaint(0, 0, Color.GREEN, 30, 20, Color.RED, true)); //寫入文字 tl.draw(g, (float)x, (float)y); g.dispose(); //輸出檔案 java.io.FileOutputStream newimage = new java.io.FileOutputStream( new java.io.File(FilePath+text+".jpg")); //輸出到文件流 // System.out.println("newimage:"+newimage); ImageIO.write(im, "JPEG", newimage); if(newimage!=null) { newimage.close(); newimage = null ; } } //取得亂數 public String getRnd(int length) { java.util.Random rnd = new java.util.Random(); return getCode(rnd,length); } //取得亂數碼 public String getCode(java.util.Random r,int num) { int rnd = 0; String authcode = ""; for(int i = 0 ; i < num;i++) { if(getNumChar(r)) { rnd = r.nextInt(9); authcode = authcode + rnd; } else { rnd = r.nextInt(52); if(rnd<26) { authcode = authcode +((char)(rnd +65)); } else { authcode = authcode +((char)(rnd -26+ 97)); } } } return authcode; } //八成數字二成英文 //取得數字或字母 public boolean getNumChar(java.util.Random r) { if(r.nextInt(100)>20) return true; else return false; } public static void main(String args[])throws Exception { CombineRndImg cri = new CombineRndImg(); cri.run("d:/temp/","movie.jpg"); } }