主頁 > 後端開發 > 記錄一下 Java 合成圖片 類似與小程式海報二維碼,合成程序很慢

記錄一下 Java 合成圖片 類似與小程式海報二維碼,合成程序很慢

2022-05-28 22:26:01 後端開發

記錄一下 Java 合成圖片 類似與小程式海報二維碼,合成程序很慢

import cn.hutool.core.img.ImgUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import me.zhengjie.utils.FileUtil;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

/**
 * 合成圖片
 * 記錄一下合成圖片
 */
public class ImgUtils {
    String templatePath = "D:\\download\\bgcq.png"; // 背景圖
    String seedPath = "D:\\download\\16534475114971.jpg"; // 二維碼圖

    public static void main(String[] args) {
        ImgUtils imgUtil = new ImgUtils();
        imgUtil.SyntheticImages();
    }


    public void SyntheticImages() {

        //背景
        File templateFlie = new File(templatePath);
        BufferedImage bg = null;//讀取背景圖片
        // 透明顏色
        Color c = new Color(0f, 0f, 0f, .0f);
        try {
            bg = ImageIO.read(templateFlie);
        } catch (IOException e) {
            e.printStackTrace();
        }
        int height = bg.getHeight();//背景圖片的高
        int width = bg.getWidth();  //背景圖片的寬

        BufferedImage qcCode = null;  // 讀取二維碼圖片
        try {
            qcCode = ImageIO.read(new File(seedPath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);//創建畫布 TYPE_INT_ARGB 可以設定顏色透明度
        Graphics2D g = img.createGraphics();//生成畫筆 開啟畫圖
        // 設定背景色
        g.setBackground(c);
        // 繪制背景圖片
        g.drawImage(bg.getScaledInstance(width, height, Image.SCALE_DEFAULT), 0, 0, null); // 繪制縮小后的圖

        //繪制二維碼圖片  定位到背景圖的右下角
        g.drawImage(qcCode.getScaledInstance(516, 516, Image.SCALE_DEFAULT), 45, 138, null); // 繪制縮小后的圖

        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 抗鋸齒
        Font font = new Font("蘋方-簡", Font.BOLD, 24);// 添加字體的屬性設定 字體要注意如果系統沒有該字體,執行完可能不是預期
        g.setFont(font);
        g.setColor(Color.white);
        g.drawString("加入團隊", 60, 55);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        Font font2 = new Font("蘋方-簡", Font.PLAIN, 18);// 添加字體的屬性設定
        g.setFont(font2);
        g.setColor(Color.white);
        g.drawString("微信掃碼加入xx團隊,無需審核直接加入", 60, 95);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        Font font3 = new Font("蘋方-簡", Font.BOLD, 32);// 添加字體的屬性設定
        g.setFont(font3);
        g.setColor(Color.black);
        g.drawString("xxx經濟技術開發區安全生產監督管", 35, 743);
        g.drawString("理局志愿服務隊", 35, 778);

        //關掉畫筆
        g.dispose();

        try {
            ImageIO.write(img, "png", new File("D:\\download\\x13.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("合成圖片成功,路徑:" + "D:\\download");
    }

    /**
     * 使用hutool 工具類
     */
    public void SyntheticImages2() {
        // 生成的二維碼
//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//        QrCodeUtil.generate("https://hutool.cn/", 516, 516, ImgUtil.IMAGE_TYPE_JPG, outputStream);

        // 要輸出的圖片
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        // 將圖片合成在一起
        ImgUtil.pressImage(
                FileUtil.getInputStream(templatePath), // 主圖片
                out, // 輸出圖片
                ImgUtil.read(new File(seedPath)).getScaledInstance(516, 516, Image.SCALE_DEFAULT), //水印圖片
                0, //x坐標修正值, 默認在中間,偏移量相對于中間偏移
                0, //y坐標修正值, 默認在中間,偏移量相對于中間偏移
                1.0f
        );

        ByteArrayOutputStream out2 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out.toByteArray()), //
                out2, //
                "加入團隊", Color.WHITE, //文字
                new Font("蘋方-簡", Font.BOLD, 24), //字體
                -190, //x坐標修正值, 默認在中間,偏移量相對于中間偏移
                -361, //y坐標修正值, 默認在中間,偏移量相對于中間偏移
                1.0f//透明度:alpha 必須是范圍 [0.0, 1.0] 之內(包含邊界值)的一個浮點數字
        );

        ByteArrayOutputStream out3 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out2.toByteArray()), //
                out3, //
                "微信掃碼加入xxx團隊,無需審核直接加入", Color.WHITE, //文字
                new Font("蘋方-簡", Font.PLAIN, 18), //字體
                -68, //x坐標修正值, 默認在中間,偏移量相對于中間偏移
                -321, //y坐標修正值, 默認在中間,偏移量相對于中間偏移
                1.0f//透明度:alpha 必須是范圍 [0.0, 1.0] 之內(包含邊界值)的一個浮點數字
        );


        ByteArrayOutputStream out4 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out3.toByteArray()), //
                out4, //
                "xxx經濟技術開發區安全生產監督管", Color.black, //文字
                new Font("蘋方-簡", Font.BOLD, 32), //字體
                -5, //x坐標修正值, 默認在中間,偏移量相對于中間偏移
                323, //y坐標修正值, 默認在中間,偏移量相對于中間偏移
                1.0f//透明度:alpha 必須是范圍 [0.0, 1.0] 之內(包含邊界值)的一個浮點數字
        );

        ByteArrayOutputStream out5 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out4.toByteArray()), //
                out5, //
                "理局志愿服務隊", Color.black, //文字
                new Font("蘋方-簡", Font.BOLD, 32), //字體
                -165, //x坐標修正值, 默認在中間,偏移量相對于中間偏移
                363, //y坐標修正值, 默認在中間,偏移量相對于中間偏移
                1.0f//透明度:alpha 必須是范圍 [0.0, 1.0] 之內(包含邊界值)的一個浮點數字
        );

        FileUtil.writeBytes(out5.toByteArray(), FileUtil.file("D:\\download\\x10.jpg"));

    }
}

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/482115.html

標籤:Java

上一篇:C++ string 字串類詳解

下一篇:返回列表

標籤雲
其他(140654) Python(33733) JavaScript(21528) Java(15670) C(13935) 區塊鏈(8222) AI(7469) C#(6736) 爪哇(6352) 基礎類(6313) MySQL(6189) html(5786) 熊猫(5318) sql(5295) PHP(5204) 腳本語言(PerlPython)(5129) 非技術區(4971) Linux(4858) 数组(4840) R(4645) Android(4340) 反应(4324) 数据框(3726) css(3695) 节点.js(3412) C語言(3288) C++語言(3117) json(2821) Java相關(2746) 列表(2730) 疑難問題(2699) 安卓(2621) 扑(2615) 打字稿(2542) VBA(2514) 單片機工控(2479) 细绳(2191) ASP.NET(2132) iOS(2116) MongoDB(2009) Web開發(1951) 字典(1940) 正则表达式(1915) 麻木的(1909) 循环(1903) 擅长(1833) 镖(1830) 迅速(1808) 網絡通信(1793) 蟒蛇-3.x(1774) 數據庫相關(1767) VB基礎類(1755) .NETCore(1741) Unity3D(1694) 功能(1683) C++(1669) 開發(1646) .NET技术(1643) 系統維護與使用區(1617) 弹簧靴(1609)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 記錄一下 Java 合成圖片 類似與小程式海報二維碼,合成程序很慢

    記錄一下 Java 合成圖片 類似與小程式海報二維碼,合成程序很慢 import cn.hutool.core.img.ImgUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import me.zhengjie.utils.FileUtil; impo ......

    uj5u.com 2022-05-28 22:26:01 more
  • C++ string 字串類詳解

    C++ string 字串類詳解:深入淺出地介紹了各種【string的使用方法】,其中包含了所有【string常用函式】。 ......

    uj5u.com 2022-05-28 22:20:14 more
  • 樹論筆記

    樹 建議閱讀順序(有些沒有嚴格的順序關系): 線段樹 \(\rightarrow\) 輕重鏈剖分(長短鏈剖分) \(\rightarrow\) \(LCA\&LA\) \(\rightarrow\) 全域平衡二叉樹 \(\rightarrow\) 動態樹 資料結構 線段樹 https://www.c ......

    uj5u.com 2022-05-28 22:20:10 more
  • 深入C++02:深入學習C++還必須掌握的基礎

    📕深入學習C++還必須掌握的基礎 掌握形參帶默認的函式 1.給默認值方向:從右向左給默認值; 2.呼叫效率:如果傳默認值或者立即數(不需要從容器或記憶體取取的數字)的話都是直接將數字直接push進堆疊;沒有mov匯編指令的操作;(面試回答要往匯編上描述) 3.默認值給的地方:定義和宣告處均可以給默認值 ......

    uj5u.com 2022-05-28 22:19:44 more
  • 堆結構是一種陣列物件,是一棵完全二叉樹。 性質 若當前節點編號為i,父結點則為i/2,左孩子為2i,右孩子為2i+1。 堆的結點數$\le$陣列長度len 下圖為一個大根堆:每個結點均小于其父結點,樹根是堆中最大的結點,小根堆反之。 添加 往堆中添加一個元素。 重復n次添加操作,即可建立一個小根堆。 ......

    uj5u.com 2022-05-28 22:19:17 more
  • C++的SGI版本的STL二級空間配置器實作(基于記憶體池的實作方式)

    C++STL中的空間配置器只有一種,是同過底層的malloc和free實作的,空間配置器中有四種方法: SGI STL中有兩種空間配置器,一級allocator是與stl一致的malloc和free的方式,二級allocator是通過記憶體池的方式實作的。 SGI STL中的vector容器的模板中用 ......

    uj5u.com 2022-05-28 22:13:24 more
  • st表

    位運算 與& 或| 異或^ 左移<< 右移>> \(x<<y=x·2^{y}\) \(x>>y=\frac{x}{2^{y}}\) \(2a+1=(a<<1)|1\) \(a\)%\(2=a\)&\(1\) st表 當st表合并的復雜度為$O(1)$時,st表構建的復雜度為$O(nlogn)$,查詢 ......

    uj5u.com 2022-05-28 22:02:47 more
  • SMFL 教程&個人筆記(2)

    本文大部分來自官方教程的Google翻譯 但是加了一點點個人的理解和其他相關知識 轉載請注明 原文鏈接 :https://www.cnblogs.com/Multya/p/16317401.html 官方教程: https://www.sfml-dev.org/tutorials/2.5/ 播放聲音 ......

    uj5u.com 2022-05-28 22:02:17 more
  • 數論

    組合數學 排列與組合 抽屜原理(鴿巢原理) 把n+1個蘋果放入n個抽屜里,則至少有一個抽屜放了兩個或兩個以上的蘋果; 從另一個角度來說,把n-1個蘋果放入n個抽屜,則至少有一個抽屜是空的。 如果每個抽屜代表一個集合,每一個蘋果就可以代表一個元素。 假如有n+1個元素放入n個集合,其中必定有一個集合里 ......

    uj5u.com 2022-05-28 22:01:35 more
  • 單鏈表的創建

    單鏈表的創建 1.單鏈表的定義 typedef struct listNode//定義鏈表結構體 { int data; struct listNode* next; int length; }listNode , *LinkList; void init(LinkList& l)//初始化鏈表 { ......

    uj5u.com 2022-05-28 21:59:50 more