java實(shí)現(xiàn)圖片上插入文字并保存
更新時間:2019年06月13日 08:38:03 作者:Rm-r
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片上插入文字并保存,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這兩天通過在網(wǎng)上查閱資料,了解了在圖片上插入文字并保存的功能,下面記錄一下。
工具類: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); // 添加字體的屬性設(shè)置 private Graphics2D g = null; private int fontsize = 0; /** * 導(dǎo)入本地圖片到緩沖區(qū) */ public BufferedImage loadImageLocal(String imgName) { try { return ImageIO.read(new File(imgName)); } catch (IOException e) { System.out.println(e.getMessage()); } return null; } /** * 導(dǎo)入網(wǎng)絡(luò)圖片到緩沖區(qū) */ 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()); } } } /** * 設(shè)定文字的字體等 */ public void setFont(Font font) { this.font = font; } /** * 修改圖片,返回修改后的圖片緩沖區(qū)(只輸出一行文本) */ 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));//設(shè)置字體顏色 g.setColor(color);//設(shè)置字體顏色 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; } /** * 修改圖片,返回修改后的圖片緩沖區(qū)(只輸出一行文本) * * 時間: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);//設(shè)置字體顏色 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 = "崗位職責(zé):"+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, "人數(shù):"+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; // 公司標(biāo)題 72號字體==96px tt.setFont(new Font("造字工房力黑(非商用)常規(guī)體", 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); //公司簡介,限定字?jǐn)?shù) tt.setFont(new Font("黑體",Font.PLAIN, 30)); String str = "功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存" +"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存" +"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存" +"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"+"功能:可以實(shí)現(xiàn)在圖片模板上寫內(nèi)容并保存"; System.out.println(str.length()); //計(jì)算字符串長度 int strleth=str.length(); //計(jì)算循環(huán)次數(shù) 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è)的技術(shù)能力。吃苦耐勞,具有專業(yè)的技術(shù)能力。吃苦耐勞,具有專業(yè)的技術(shù)能力。吃苦耐勞,具有專業(yè)的技術(shù)能力。吃苦耐勞,具有專業(yè)的技術(shù)能力。" + "吃苦耐勞,具有專業(yè)的技術(shù)能力。"; 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 = "崗位職責(zé):"+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, "人數(shù):"+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)); // } // 聯(lián)系方式和抵地址 String name = "張先生"; String tel = "12334343443"; String company = "鹽都區(qū)高新區(qū)振興路匯鑫大廈"; 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]); } } }
實(shí)現(xiàn)效果:模板圖片為:1920 x 1080 px。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計(jì)模式中橋接模式應(yīng)用詳解
橋接,顧名思義,就是用來連接兩個部分,使得兩個部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下2022-11-11Java struts2 package元素配置及實(shí)例解析
這篇文章主要介紹了Java struts2 package元素配置及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11Java數(shù)據(jù)結(jié)構(gòu)優(yōu)先隊(duì)列實(shí)練
通常都把隊(duì)列比喻成排隊(duì)買東西,大家都很守秩序,先排隊(duì)的人就先買東西。但是優(yōu)先隊(duì)列有所不同,它不遵循先進(jìn)先出的規(guī)則,而是根據(jù)隊(duì)列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java優(yōu)先隊(duì)列的真題,感興趣的朋友一起看看吧2022-07-07Java+Swing實(shí)現(xiàn)五子棋游戲的示例代碼
本文將通過Java語言實(shí)現(xiàn)經(jīng)典游戲—五子棋游戲,文中采用了Swing制作游戲界面,具有開始游戲,悔棋,認(rèn)輸,退出等功能。感興趣的可以跟隨小編一起動手試一試2022-02-02JavaGUI界面實(shí)現(xiàn)頁面跳轉(zhuǎn)方法
這篇文章主要給大家介紹了關(guān)于JavaGUI界面實(shí)現(xiàn)頁面跳轉(zhuǎn)的相關(guān)資料, GUI是指圖形用戶界面,指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面,需要的朋友可以參考下2023-07-07