1. 程式人生 > >java實現在圖片上插入文字並儲存。

java實現在圖片上插入文字並儲存。

這兩天通過在網上查閱資料,瞭解了在圖片上插入文字並儲存的功能,下面記錄一下。

工具類:PrintImage。

package com.learning.www.utils;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.font.GlyphVector;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
 
public class PrintImage {
 
    private Font       font     = new Font("黑體", Font.PLAIN, 25); // 新增字型的屬性設定
 
    private Graphics2D g        = null;
 
    private int        fontsize = 0;
 
    /**
     * 匯入本地圖片到緩衝區
     */
    public BufferedImage loadImageLocal(String imgName) {
        try {
            return ImageIO.read(new File(imgName));
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
 
    /**
     * 匯入網路圖片到緩衝區
     */
    public BufferedImage loadImageUrl(String imgName) {
        try {
            URL url = new URL(imgName);
            return ImageIO.read(url);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
 
    /**
     * 生成新圖片到本地
     */
    public void writeImageLocal(String newImage, BufferedImage img) {
        if (newImage != null && img != null) {
            try {
                File outputfile = new File(newImage);
                ImageIO.write(img, "jpg", outputfile);
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }
 
    /**
     * 設定文字的字型等
     */
    public void setFont(Font font) {
        
        this.font = font;
    }
 
    /**
     * 修改圖片,返回修改後的圖片緩衝區(只輸出一行文字)
     */
    public BufferedImage modifyImage(BufferedImage img, Object content, int x, int y,Color color) {
        try {
            int w = img.getWidth();
            int h = img.getHeight();
            g = img.createGraphics();
            g.setBackground(Color.BLUE);
            
            
            //g.setColor(new Color(120, 120, 110));//設定字型顏色
            g.setColor(color);//設定字型顏色
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            g.setStroke(new BasicStroke(3));
            if (this.font != null)
                g.setFont(this.font);
            if (content != null) {
                g.translate(w / 2, h / 2);
                //g.rotate(8 * Math.PI / 180);
                g.drawString(content.toString(), x, y);
            }
            g.dispose();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
 
        return img;
    }
 
    
    /**
     * 修改圖片,返回修改後的圖片緩衝區(只輸出一行文字)
     *
     * 時間:2007-10-8
     *
     * @param img
     * @return
     */
    public BufferedImage modifyImageYe(BufferedImage img) {
 
        try {
            int w = img.getWidth();
            int h = img.getHeight();
            g = img.createGraphics();
            g.setBackground(Color.WHITE);
            g.setColor(Color.blue);//設定字型顏色
            if (this.font != null)
                g.setFont(this.font);
            g.drawString("www.hi.baidu.com?xia_mingjian", w - 85, h - 5);
            g.dispose();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
 
        return img;
    }
 
    public BufferedImage modifyImagetogeter(BufferedImage b, BufferedImage d) {
 
        try {
            int w = b.getWidth();
            int h = b.getHeight();
            g = d.createGraphics();
            g.drawImage(b, 100, 10, w, h, null);
            g.dispose();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
 
        return d;
    }
    /***
     * 插入描邊的字型
     * @param img
     * @param content
     * @param w
     * @param h
     * @return
     */
    public BufferedImage modifyShapImg(BufferedImage img, String content, int w, int h) {
//        int w = img.getWidth();
//        int h = img.getHeight();
        g = img.createGraphics();
    	
        //Font f = new Font("Courier New", Font.BOLD, 140);
        GlyphVector v = font.createGlyphVector(g.getFontMetrics(font).getFontRenderContext(), content);
        Shape shape = v.getOutline();
        if (content != null) {
            g.translate(w, h);
            //g.rotate(8 * Math.PI / 180);
            //g.drawString(content.toString(), x, y);
        }
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        g.setColor(new Color(0,90,160));
        g.fill(shape);
        g.setColor(new Color(248,248,255));
        g.setStroke(new BasicStroke(2));
        g.draw(shape);
        
    	return img;
    }
 
}

插入多條的格式相同的文字:

package com.learning.www.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.image.BufferedImage;

public class PrintJobToImg {

	public static void printJobToImg(PrintImage tt,BufferedImage d,String job1,String need1,String amount1,String salary1,int y) {
		
		  
	      if(null != job1 && !job1.equals("")) {
	    	need1 = "崗位職責:"+need1;
	    	int strleth = need1.length()+5;
	    	int num = strleth/40;
	    	int subindex = 0;
	    	int j = 40;
	    	//y = -350;
	    	String[] s1 = new String[num+1];
	    	tt.setFont(new Font("黑體",Font.BOLD, 28));
	    	tt.modifyImage(d, "職位:"+job1, -50, y, new Color(0,191,255));
	    	tt.modifyImage(d, "人數:"+amount1, -30+(30*(3+job1.length())), y, new Color(210,105,30));
	    	tt.modifyImage(d, "月薪:"+salary1, -10+(30*(6+job1.length()+amount1.length())), y, new Color(178,34,34));
	    	y = y+25;
	    	tt.setFont(new Font("黑體",Font.PLAIN, 24));
		      if(num < 1 )	{
		    	  System.out.println(num);
		    	  tt.modifyImage(d, need1, -50, y+25,new Color(0,0,0));
		      }else {
			      for(int i = 0;i<num;i++) {
			    	  s1[i] = need1.substring(subindex, j);
			    	  tt.modifyImage(d, s1[i], -50, y,new Color(0,0,0));
			    	  subindex=j;
			    	  j+=40;
			    	  y+=25;
			      }
			      if(strleth%40 != 0) {
			    	  //System.out.println("不等於0");
			    	  s1[num] = need1.substring(num * 40);
			    	  tt.modifyImage(d, s1[num], -50, y,new Color(0,0,0));
			      }
		      }
	    	//tt.modifyImage(d, "崗位要求:"+need1, -50, y+25, new Color(0,0,0));
	      }
		
		
		
		
	}
	
}

啟動類:

package com.learning.www;

import java.awt.Color;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

import com.learning.www.utils.PrintImage;
import com.learning.www.utils.PrintJobToImg;

@SpringBootApplication
@EnableAutoConfiguration
@EnableCaching
@MapperScan("com.learning.www.mapper")
public class LearningApplication {

	public static void main(String[] args) {
		SpringApplication.run(LearningApplication.class, args);
	      PrintImage tt = new PrintImage();
	      BufferedImage d = tt.loadImageLocal("D:\\test\\muban.jpg");
	      String title = "撒大大是多少有限公司";
	      int x = title.length() * 96;
	      // 公司標題 72號字型==96px
	      tt.setFont(new Font("造字工房力黑(非商用)常規體", Font.BOLD, 76));
	      //tt.modifyImage(d, title, (1920-x)/2-960, -420, new Color(65,105,225));
	      //tt.modifyShapImg(d, title, (1920-x)/2-960, -420);
	      tt.modifyShapImg(d, title, (1920-x)/2, 130);
	      
	      //公司簡介,限定字數
	      tt.setFont(new Font("黑體",Font.PLAIN, 30));
	      String str = "功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"
	      +"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"
	      +"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"
	      +"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存"+"功能:可以實現在圖片模板上寫內容並儲存";
	      System.out.println(str.length());
	      //計算字串長度
	      int strleth=str.length();
	      //計算迴圈次數
	      int num = strleth/20;
	      //字串擷取第一位
	      int subindex = 0;
	      //字串擷取第二位
    	  int j = 20;
    	  //距離y軸的位置
    	  int y = -350;
	      String[] s = new String[num+1];
	      if(num < 1 )	{
	    	  System.out.println(num);
	    	  tt.modifyImage(d, str, -830, y,new Color(0,0,0));
	      }else {
		      for(int i = 0;i<num;i++) {
		    	  s[i] = str.substring(subindex, j);
		    	  tt.modifyImage(d, s[i], -830, y,new Color(0,0,0));
		    	  subindex=j;
		    	  j+=20;
		    	  y+=35;
		      }
		      if(strleth%20 != 0) {
		    	  //System.out.println("不等於0");
		    	  s[num] = str.substring(num * 20);
		    	  tt.modifyImage(d, s[num], -830, y,new Color(0,0,0));
		      }
	      }
	      // 公司崗位6個
	      String job1 = "普工";
	      String amount1 = "3人";
	      String salary1 = "4000元/月";
	      String need1 = "吃苦耐勞,具有專業的技術能力。吃苦耐勞,具有專業的技術能力。吃苦耐勞,具有專業的技術能力。吃苦耐勞,具有專業的技術能力。吃苦耐勞,具有專業的技術能力。"
	      		+ "吃苦耐勞,具有專業的技術能力。";
	      y = -350;
	      PrintJobToImg.printJobToImg(tt, d, job1, need1, amount1, salary1, y);
	      PrintJobToImg.printJobToImg(tt, d, job1, need1, amount1, salary1, y+110);
	      PrintJobToImg.printJobToImg(tt, d, job1, need1, amount1, salary1, y+220);
	      PrintJobToImg.printJobToImg(tt, d, job1, need1, amount1, salary1, y+330);
	      PrintJobToImg.printJobToImg(tt, d, job1, need1, amount1, salary1, y+440);
	      PrintJobToImg.printJobToImg(tt, d, job1, need1, amount1, salary1, y+550);
//	      tt.setFont(new Font("黑體",Font.PLAIN, 24));
//	      if(null != job1 && !job1.equals("")) {
//	    	need1 = "崗位職責:"+need1;
//	    	strleth = need1.length()+5;
//	    	num = strleth/40;
//	    	subindex = 0;
//	    	j = 40;
//	    	y = -350;
//	    	String[] s1 = new String[num+1];
//	    	tt.modifyImage(d, "職位:"+job1, -50, y, new Color(0,191,255));
//	    	tt.modifyImage(d, "人數:"+amount1, -30+(30*(3+job1.length())), y, new Color(210,105,30));
//	    	tt.modifyImage(d, "月薪:"+salary1, -10+(30*(6+job1.length()+amount1.length())), y, new Color(178,34,34));
//	    	y = y+25;
//		      if(num < 1 )	{
//		    	  System.out.println(num);
//		    	  tt.modifyImage(d, need1, -50, y+25,new Color(0,0,0));
//		      }else {
//			      for(int i = 0;i<num;i++) {
//			    	  s1[i] = need1.substring(subindex, j);
//			    	  tt.modifyImage(d, s1[i], -50, y,new Color(0,0,0));
//			    	  subindex=j;
//			    	  j+=40;
//			    	  y+=25;
//			      }
//			      if(strleth%40 != 0) {
//			    	  //System.out.println("不等於0");
//			    	  s1[num] = need1.substring(num * 40);
//			    	  tt.modifyImage(d, s1[num], -50, y,new Color(0,0,0));
//			      }
//		      }
//	    	//tt.modifyImage(d, "崗位要求:"+need1, -50, y+25, new Color(0,0,0));
//	      }
	      
	      // 聯絡方式和抵地址
	      String name = "張先生";
	      String tel = "12334343443";
	      String company = "鹽都區高新區振興路匯鑫大廈";
	      tt.setFont(new Font("黑體",Font.BOLD, 40));
	      tt.modifyImage(d, name, -650, 360,new Color(0,0,0));
	      tt.modifyImage(d, tel, -450, 360,new Color(0,0,0));
	      tt.modifyImage(d, company, -650, 440,new Color(0,0,0));
	      
	      
	      //tt.modifyImage(d, str, -830, -100);
	      tt.writeImageLocal("D:\\test\\cc.jpg", d);
	      System.out.println("success");
	      System.out.println(s[0]);
	      System.out.println(s[0].length());
	      
          GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
          String[] fontList = ge.getAvailableFontFamilyNames();
          for(int i=0;i<fontList.length;i++)
          {
               System.out.println("字型:"+fontList[i]);
          }

	}
}

實現效果:模板圖片為:1920 x 1080 px。