springboot生成二維碼到海報模板上

springboot生成二維碼到海報模板上

QRCodeController

package com.ruoyi.web.controller.app;import com.google.zxing.WriterException;
import com.ruoyi.app.domain.Opportunity;
import com.ruoyi.app.tool.QRCodeGenerator;
import com.ruoyi.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/app/qrcCode")
@Api(tags = "推廣海報接口")
public class QRCodeController {@Autowiredprivate QRCodeGenerator qrCodeGenerator;@ApiOperation(value = "獲取推廣海報", notes = "獲取推廣海報")@GetMapping("/qrImage")public void generateQRCode(HttpServletResponse response, @RequestParam Map<String, String> params) throws Exception {String openid = params.get("openid");String xh = params.get("xh");if (openid == null || openid.isEmpty()) {throw new Exception("openid不能為空");}if (xh == null || xh.isEmpty()) {xh = "1";}// 改為自己的鏈接String url = "http://*******.cn/app/index/?parentId=" + openid;byte[] qrCodeBytes = qrCodeGenerator.generateQRCode(url, 290, 290, xh);response.setContentType(MediaType.IMAGE_PNG_VALUE);response.setHeader("Content-Disposition", "inline; filename=qrCode.png");response.setHeader("Cache-Control", "no-store");response.setHeader("Pragma", "no-cache");response.setContentLength(qrCodeBytes.length);try (OutputStream out = response.getOutputStream()) {out.write(qrCodeBytes);}}
}

QRCodeGenerator

package com.ruoyi.app.tool;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@Component
public class QRCodeGenerator {public byte[] generateQRCode(String url, int qrCodeWidth, int qrCodeHeight, String xh) throws WriterException, IOException {// 生成二維碼QRCodeWriter qrCodeWriter = new QRCodeWriter();Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 設置容錯級別為高BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, qrCodeWidth, qrCodeHeight, hints);BufferedImage qrCodeImage = bitMatrixToImage(bitMatrix);// 加載背景圖片ClassPathResource backgroundImageResource = new ClassPathResource("static/" + xh + ".jpg");BufferedImage backgroundImage = ImageIO.read(backgroundImageResource.getInputStream());// 創建包含背景圖片的畫布int combinedImageWidth = backgroundImage.getWidth();int combinedImageHeight = backgroundImage.getHeight();BufferedImage combinedImage = new BufferedImage(combinedImageWidth, combinedImageHeight, BufferedImage.TYPE_INT_RGB);Graphics2D combinedGraphics = combinedImage.createGraphics();combinedGraphics.drawImage(backgroundImage, 0, 0, null);// 將二維碼放在背景圖的左下角int qrCodeX = 930; // 二維碼在背景圖片中的X坐標int qrCodeY = combinedImageHeight - qrCodeHeight - 20; // 二維碼在背景圖片中的Y坐標// 添加紅色邊框int borderWidth = 2; // 邊框寬度Color borderColor = Color.decode("#B11E4C"); // 邊框顏色combinedGraphics.setColor(new Color(borderColor.getRed(), borderColor.getGreen(), borderColor.getBlue(), 0)); // 設置填充顏色為透明色combinedGraphics.fillRoundRect(qrCodeX - borderWidth, qrCodeY - borderWidth, qrCodeWidth + 2 * borderWidth, qrCodeHeight + 2 * borderWidth, 5, 5);combinedGraphics.setColor(borderColor); // 設置邊框顏色combinedGraphics.drawRoundRect(qrCodeX - borderWidth, qrCodeY - borderWidth, qrCodeWidth + 2 * borderWidth, qrCodeHeight + 2 * borderWidth, 5, 5); // 繪制邊框combinedGraphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);// 將合成的圖片轉為字節數組ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(combinedImage, "png", byteArrayOutputStream);return byteArrayOutputStream.toByteArray();}private BufferedImage bitMatrixToImage(BitMatrix bitMatrix) {int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());}}return image;}
}

海報模板存放(不帶二維碼的圖片):
在這里插入圖片描述

把地址放到白名單中,無需token可以訪問,然后就得到:
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80420.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用極狐GitLab 軟件包倉庫功能托管 maven?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 軟件包庫中的 Maven 包 (BASIC ALL) 在項目的軟件包庫中發布 Maven 產物。然后&#xff0c;在需要將它們用作依賴項時安裝它…

企業如何將釘釘付款單高效集成到金蝶云星空?

釘釘數據集成到金蝶云星空&#xff1a;修改下推的付款單③ 在企業信息化系統中&#xff0c;數據的高效流轉和準確對接是實現業務流程自動化的關鍵。本文將分享一個實際案例&#xff0c;展示如何通過輕易云數據集成平臺&#xff0c;將釘釘中的付款單數據無縫集成到金蝶云星空系…

python 實現文件批量重命名

以下是使用Python實現文件批量重命名的示例代碼。該代碼可以將指定目錄下的文件按照一定規則進行重命名,這里以將文件重命名為帶有編號的文件名為例: import osdef batch_rename(directory):if not os.path.isdir(directory):print(

Pandas學習筆記(四)

DataFrame對象 文章目錄 DataFrame對象導入本文需要的包DataFrame與Series的相似之處使用read_csv函數導入DataFrameSeries和DataFrame的共享與專有屬性Series和DataFrame的共有方法 對DataFrame進行排序按照單列進行排序按照多列進行排序按照索引進行排序對列索引進行排序 設置…

DA14585墨水屏學習(2)

一、user_svc2_wr_ind_handler函數 void user_svc2_wr_ind_handler(ke_msg_id_t const msgid,struct custs1_val_write_ind const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id) {// sprintf(buf2,"HEX %d :",param->length);arch_printf("…

樹莓派5+Ubuntu24.04 LTS串口通信 保姆級教程

【背景】 各位&#xff0c;除了樹莓派4B之外&#xff0c;我又搞了個樹莓派5, 裝的也是Ubuntu24.04 LTS服務器版。裝系統的方法跟樹莓派4B一樣&#xff0c;沒什么好說的。裝完了系統之后&#xff0c;我就想裝個wiringPi來試試串口&#xff0c;卻發現這個樹莓派5的串口和樹莓派4…

【QT】UDP通訊本地調試

qt已經寫好了udp通訊代碼&#xff0c;現在要進行測試。 1、終端輸入ipconfig查看本機網卡的ipv4地址 2、 用udpBind函數&#xff0c;綁定到此ip和自定義的端口號。 3、 打開網絡調試助手&#xff0c;自動檢測到本機的ip地址&#xff0c;輸入任意一個和程序里不一樣的端口號。 …

在 Elasticsearch 中連接兩個索引

作者&#xff1a;來自 Elastic Kofi Bartlett 解釋如何使用 terms query 和 enrich processor 來連接 Elasticsearch 中的兩個索引。 更多有關連接兩個索引的查詢&#xff0c;請參閱文章 “Elastic&#xff1a;開發者上手指南” 中的 “豐富數據及 lookup” 章節。 Elasticsea…

LabVIEW的PID參數自適應控制

在工業控制領域&#xff0c;PID 控制憑借結構簡單、穩定性好、工作可靠等優點被廣泛應用。然而&#xff0c;傳統固定參數的 PID 控制在面對復雜多變的工況時&#xff0c;控制效果往往難以達到最優。基于 LabVIEW 實現 PID 控制根據情況選擇參數&#xff08;即參數自適應調整&am…

[redis進階四]分布式系統之哨兵(2)

目錄 一 利用docker搭建環境 板書: 一)準備?作: 板書: 解讀docker配置文件: 1)安裝docker和docker-compose 2) 停?之前的redis-server 3) 使?docker獲取redis鏡像 二)編排redis主從節點 板書:?編輯 1) 編寫docker-compose.yml 2) 啟動所有容器 3) 查看運??志 …

spark-Schema 定義字段強類型和弱類型

在數據處理和存儲中&#xff0c;Schema&#xff08;模式&#xff09;定義了數據的結構和字段屬性&#xff0c;其中字段的強類型和弱類型是重要的概念&#xff0c;直接影響數據的驗證、存儲和處理方式。以下是詳細解釋&#xff1a; 1. 強類型&#xff08;Strongly Typed&#x…

2024睿抗編程賽國賽-題解

2024睿抗編程賽國賽題解 RC-u1 大家一起查作弊 題目重述 我們需要從給定的多行字符串中提取出所有的關鍵詞&#xff0c;并計算這些關鍵詞的可疑分數總和、總長度以及關鍵詞的數量。具體步驟如下&#xff1a; 關鍵詞定義&#xff1a;由大寫字母、小寫字母、數字組成的字符串&a…

控制LED燈設備

本章分別使用C庫和系統調用的文件操作方式控制開發板的LED燈&#xff0c;展示如何在應用層通過系統提供的設備文件控制相關硬件。 本章的示例代碼目錄為&#xff1a;base_code/linux_app/led/sys_class_leds。 9.1. LED子系統 在Linux系統中&#xff0c;絕大多數硬件設備都有…

SpringBoot學習(上) , SpringBoot項目的創建(IDEA2024版本)

目錄 1. SpringBoot介紹 SpringBoot特點 2. SpringBoot入門 2.1 創建SpringBoot項目 Spring Initialize 第一步: 選擇創建項目 第二步: 選擇起步依賴 第三步: 查看啟動類 2.2 springboot父項目 2.3 測試案例 2.3.1 數據庫 2.3.2 生成代碼 1. SpringBoot介紹 Spring B…

在 Ubuntu 中配置 Samba 實現「特定用戶可寫,其他用戶只讀」的共享目錄

需求目標 所有認證用戶可訪問 Samba 共享目錄 /path/to/home&#xff1b;**僅特定用戶&#xff08;如 developer&#xff09;**擁有寫權限&#xff1b;其他用戶僅允許讀取&#xff1b;禁止匿名訪問。 配置步驟 1. 設置文件系統權限 將目錄 /home3/guest 的所有權設為 develo…

ENSP-OSPF綜合實驗

AR4中通過ospf獲取的其他區域路由信息&#xff0c;并且通過路由匯總后簡化路由信息 實現全網通&#xff0c;以及單向重發布&#xff0c;以及通過缺省雙向訪問&#xff0c; 通過stub簡化過濾四類五類lsa&#xff0c;簡化ospf路由信息 通過nssa簡化ospf信息 區域匯總簡化R4路由信…

linux(centos)聯網情況下部署

nginx部署 1.linux(centos)聯網情況下部署 1.下載nginx所需依賴 # 安裝開發工具組&#xff08;若未安裝&#xff09; sudo yum groupinstall "Development Tools"# 安裝 OpenSSL 開發包 sudo yum install openssl-devel# 安裝 PCRE 開發包 sudo yum install pcre-…

LeetCode 1550.存在連續三個奇數的數組:遍歷

【LetMeFly】1550.存在連續三個奇數的數組&#xff1a;遍歷 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/three-consecutive-odds/ 給你一個整數數組 arr&#xff0c;請你判斷數組中是否存在連續三個元素都是奇數的情況&#xff1a;如果存在&#xff0c;請返回 tr…

Android Framework學習四:init進程實現

文章目錄 init流程簡介init源碼執行順序執行順序 init進程的具體工作事項掛載文件系統設置 SELinuxSecondStageMaininit.rc啟動zygote和serviceManager進程的重要性serviceManager工作原理 Framework學習之系列文章 init流程簡介 下面圖片主要圍繞 Android 系統中init進程的運…

HTTP/3展望、我應該遷移到HTTP/2嗎

1. HTTP/3展望 HTTP/3 基于 QUIC 協議&#xff0c;完全解決了“隊頭阻塞”問題&#xff0c;弱網環境下的表現會優于 HTTP/2&#xff1b;QUIC 是一個新的傳輸層協議&#xff0c;建立在 UDP 之上&#xff0c;實現了可靠傳輸&#xff1b;QUIC 內含了 TLS1.3&#xff0c;只能加密通…