1. 程式人生 > >java後端生成二維碼圖片用來下載

java後端生成二維碼圖片用來下載

應公司需求,要求生成二維碼圖片,並且將二維碼放進一張底層圖片上,並賦予文字。

    1.首先我們要想辦法生成二維碼,二維碼是黑白雙色,中間不用新增商戶logo,這裡我們採用的google的jar包生成二維碼

匯入maven依賴:

<dependency>
   <groupId>com.google.zxing</groupId>
   <artifactId>core</artifactId>
   <version>3.3.3</version>
</dependency>

用到的是自己寫的工具類:

package 
com.example.demo;/** * Created by 談政揚 on 2018/6/15. */ import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import org.slf4j.Logger
; import org.slf4j.LoggerFactory; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * @author 談政揚 * @create 2018-06-15 15:55 * @desc **/ public class Qrcode { /** * 黑色 */ private static final int
BLACK = 0xFF000000; /** * 白色 */ private static final int WHITE = 0xFFFFFFFF; /** * 二維碼的*/ private static final int WIDTH = 360; /** * 二維碼的*/ private static final int HEIGHT = 360; /** * 二維碼傳圖片為正方形 * * @param matrix * @return */ public static BufferedImage toBufferedImage(BitMatrix matrix) { int width = matrix.getWidth(); int height = matrix.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,WHITE); } } for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE); } } return image; } /** * 生成二維碼,生成的是二維碼圖片 * @author 談政揚 * @date 2018/6/13 11:31 * @param [content] * @return java.awt.image.BufferedImage */ @SuppressWarnings("unchecked") public static BufferedImage createQrCode(String content) throws Exception { MultiFormatWriter multiFormatWriter = new MultiFormatWriter(); @SuppressWarnings("rawtypes") Map hints = new HashMap(); // 設定UTF-8, 防止中文亂碼 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 設定二維碼四周白色區域的大小 hints.put(EncodeHintType.MARGIN, 1); // 設定二維碼的容錯性 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 畫二維碼 BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints); BufferedImage image = toBufferedImage(bitMatrix); return image; } /** * 把二維碼圖片新增到背景圖 * * @param barCodeImage * @param logoPic */ public static BufferedImage addLogo_QRCode(BufferedImage erweima, InputStream bgp)throws Exception { //讀取二維碼圖片,並構建繪圖物件360*360 //保持二維碼是正方形的 int widtherweima = erweima.getWidth(); int heighterweima = erweima.getHeight(); /** * 讀取背景圖片600*900 */ BufferedImage bgpi = ImageIO.read(bgp); int widthbgpi = bgpi.getWidth(); int heightbgpi = bgpi.getHeight(); // 計算圖片放置位置 int x = 120; int y = 236; //構建背景的圖片 Graphics2D bgpiGraphics = bgpi.createGraphics(); bgpiGraphics.drawImage(erweima, x, y, widtherweima, heighterweima, null); bgpiGraphics.dispose(); return bgpi; } /**     * 將文字寫入背景圖片中, 生成的圖片以流的行式返回 * * @param qrcFile 路徑 * @param qrCodeContent 二維碼內容 * @param pressText 增加的文字 * @throws Exception */ public static BufferedImage generateQrCode(BufferedImage image, String qrCodeContent, String pressText) throws Exception { Graphics g = image.getGraphics(); ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); //設定字型,下面商戶名稱 Font font=new Font("宋體", Font.PLAIN, 40); g.setFont(font); g.setColor(Color.white); FontMetrics metrics = g.getFontMetrics(font); // 文字在圖片中的座標 這裡設定在中間 int startX = (600 - metrics.stringWidth(pressText)) / 2; int startY=650; g.drawString(pressText, startX, startY); g.dispose(); return image; } }

在介面中呼叫方法啟動:

@GetMapping(value = "/QrcodeDown/{mchId}")
public void QrcodeDown(@PathVariable("mchId")String mchId, HttpServletResponse response){
    Map resultMap = new HashMap<String,Object>(5);
    try {
        //二維碼內容,這裡的路徑根據自己的業務需求填寫
String qrCodeContent="http://www.baidu.com"+"&mch="+mchId;
//商戶名稱
// Map<String, Object> map1 = paymentService.selectmchInfoByMchId(mchId);
        //String name = map1.get("name").toString();
String name ="**科技";
//springboot讀取檔案為流物件
InputStream stream = getClass().getClassLoader().getResourceAsStream("img/original.jpg");
//生成二維碼
BufferedImage erweima = Qrcode.createQrCode(qrCodeContent);
//將二維碼放在背景圖上
BufferedImage image = Qrcode.addLogo_QRCode(erweima, stream);
//給圖片新增文字並且輸出
BufferedImage bufferedImage = Qrcode.generateQrCode(image, qrCodeContent, name);
name=name+".jpg";
response.setHeader("content-disposition", "attachment;filename=" + new String(name.getBytes("utf-8") , "ISO_8859_1"));
response.setContentType("application/octet-stream");
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(bufferedImage,"jpg",sos);
sos.close();
}catch (Exception e){
        e.printStackTrace();
resultMap.put("msg","伺服器異常");
}

}

在最後提醒大家一句:

    因為公司主要用springboot框架進行開發,在讀取背景圖片時不能以檔案行式讀取,只能以流的行式讀取。不然在linux下部署專案時不能讀取到檔案,會一直報file is not found錯。我在這裡就耽誤了很多時間,一直認為是自己的路徑沒找到,沒成想是不能以檔案行式讀取,最好以輸入流的行式讀取。最後還有一個問題就是,在linux系統下並沒有宋體的字型庫,所以還得去下載宋體字型庫,不然新增的文字顯示時是亂碼。

    效果圖:


相關推薦

java生成圖片下載

應公司需求,要求生成二維碼圖片,並且將二維碼放進一張底層圖片上,並賦予文字。    1.首先我們要想辦法生成二維碼,二維碼是黑白雙色,中間不用新增商戶logo,這裡我們採用的google的jar包生成二維碼匯入maven依賴:<dependency> <

java 使用qrcode生成圖片或者base64字符串

使用 ear 數字 graphics lean IT eve encoder red 通過傳入字符串,生成二維碼圖片或者base64格式字符串 1 public static String barcode2Base64(String msg) throws Except

JAVA生成圖片的方法

保存 預留空間 註意 效果 catch 修正 ddl sta pre   JAVA中生成二維碼的方法並不復雜,使用google的zxing包就可以實現。下面的方法包含了生成二維碼、在中間附加logo、添加文字功能。 一、下載zxing的架包,並導入項目中,如下:

java 生成圖片

import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.Writ

Java實現生成圖片功能

import cn.api.commons.commons.util.MatrixToImageWriter; import java.io.File; import java.io.FileOutputStream; import java.io.InputStr

JAVA生成,圖片合成,圖片新增文字

首先引入zxing用於生成二維碼 <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>c

springboot2之系統架構基礎 生成圖片及輸出web及列印

step1 導包 <!-- 二維碼 --> <dependency> <groupId>com.google.zxing</groupId> <artifactI

python生成圖片

生成二維碼 image() blog 掃描 尺寸 nts color 簡單 world! 依賴Pillow庫。 import qrcode # 簡單用法 img = qrcode.make(‘Hello World!‘) img.save(‘qr_code.png‘)

iOS開發-生成圖片【附中間帶有小圖標】(QRCode)

獲取 options reat 很多 mapr 過濾 生成二維碼 image bit 生成二維碼圖片也是項目中常用到的,二維碼的掃描Git上有很多好用的,這裏主要說下二維碼的生成 1.普通二維碼 1.1 方法 /** 生成二維碼 QRStering:字符串 image

.net服務生成

int get tps tty pan level matrix span odi mvc4 net4.0 1、引用附件的DLL文件 2、兩個函數即可 #region 生成二維碼 public ActionResult getQrCode()

Java 騷操作--生成

comm ron 速度 top 傳統 第一個 ack data- esp 好久沒發布博客了,今天發了一個Java工具類,突然發現草稿箱竟然還有以前的存貨,一次性發了!!! 目錄 1.二維碼概念 2.二維碼發展歷史 3.二維碼分類 4.二維碼優缺點 5

java學習-zxing生成矩陣的簡單例子

map obj 基於 The output 圖片 .get imageio sts 這個例子需要使用google的開源項目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下載jar文件 也可使用maven添加依賴 <de

Java使用QRCode生成

目錄 一、工程描述 1.二維碼生成可以使用zxing和QRCode,本次使用Java+QRCode生成二維碼 二、工程程式碼 package com.codecoord; import com.swetake.util.Qrcode; import

php中生成圖片

PHP如何生成二維碼圖片 在我們開發過程中,往往我們會遇到將某個商品或者將某個活動生成一個二維碼,當用戶掃描二維碼時候,使用者可以直接跳轉到商品詳細頁面或者活動詳情頁面。那我們如何生成一個二維碼圖片呢,來,看這裡哦!!! 1.封裝 程式碼篇: function

python-生成圖片

from tkinter import * import qrcode def jiemian_info(): ws = jiemian.winfo_screenwidth() hs = jiemian.winfo_screenheight() x = (ws

Node.js在指定的圖片模板上生成圖片並附帶底部文字說明

  在Node.js中,我們可以通過qr-image包直接在後臺生成二維碼圖片,使用方法很簡單: var qr = require('qr-image'); exports.createQRImage = function(res, str){ var img = qr.image(str

Android超方便 整合 Zxing實現掃一掃,閃光燈,生成圖片,解析(條碼)等功能

之前我寫過一篇部落格是關於如何將zxing整合到Android Studio中,以及簡單的實現掃一掃功能。 詳情請看:Android Studio整合Zxing掃一掃 但是,上面那篇部落格只有有一個掃一掃功能,而且在低解析度手機上會出現變形的問題。掃描速度也

java大批量生成

java生成二維碼程式碼,並且插入logo,因為要大批量生成,所以加入了執行緒池以及佇列,並且儘可能的減少了程式碼內部的計算,在提高程式碼效率時發現幾點注意事項 1.內部logo圖儘量使用恰好大小的,否則需要壓縮圖片會增加許多不必要的計算。 2.二維碼的寬高很大的影響生成速

解決ZXING生成圖片白框太大的問題

最近專案裡需要生成一些二維碼,使用之後發現一些問題,生成之後的圖片,白色邊框區域太大了,導致二維碼內容區域太小。 百度了一下,有人說設定EncodeHintType.MARGIN屬性即可,這個屬性值為1-4,實際測試發現並沒有什麼卵用。(順便說一下,一些比較老的版本中,這個

java使用Qrcode生成(內嵌logo)

1、前言 整理一個使用qrcode.jar生成二維碼的測試方法,以備後面學習使用。 2、使用準備 Qrcode.jar 3、demo /* 生成二維碼 */ @RequestMapping(value="/creatQ