java生成帶logo的二維碼
A. java生成的二維碼中間logo怎麼改成文字
package com.luo.wctweb.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.lz.lsf.util.Base64;
/** * @Description: (二維碼) * @author:luoguohui * @date:2015-10-29 下午05:27:13 */
public class ZXingCode {
private static final int QRCOLOR = 0xFF000000; //默認是黑色
private static final int BGWHITE = 0xFFFFFFFF; //背景顏色
public static void main(String[] args) throws WriterException
{
try
{
getLogoQRCode("https://www..com/", null, "跳轉到網路的二維碼");
}
catch (Exception e)
{
e.printStackTrace();
}
}
/** * 生成帶logo的二維碼圖片 * * @param qrPic * @param logoPic */
public static String getLogoQRCode(String qrUrl,HttpServletRequest request,String proctName)
{
// String filePath = request.getSession().getServletContext().getRealPath("/") + "resources/images/logoImages/llhlogo.png";
//filePath是二維碼logo的路徑,但是實際中我們是放在項目的某個路徑下面的,所以路徑用上面的,把下面的注釋就好
String filePath = "C:/Users/luoguohui/Desktop/.jpg"; //TODO
String content = qrUrl;
try
{
ZXingCode zp = new ZXingCode();
BufferedImage bim = zp.getQR_CODEBufferedImage(content, BarcodeFormat.QR_CODE, 400, 400, zp.getDecodeHintType());
return zp.addLogo_QRCode(bim, new File(filePath), new LogoConfig(), proctName);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/** * 給二維碼圖片添加Logo * * @param qrPic * @param logoPic */
public String addLogo_QRCode(BufferedImage bim, File logoPic, LogoConfig logoConfig, String proctName)
{
try
{
/** * 讀取二維碼圖片,並構建繪圖對象 */
BufferedImage image = bim;
Graphics2D g = image.createGraphics();
/** * 讀取Logo圖片 */
BufferedImage logo = ImageIO.read(logoPic);
/** * 設置logo的大小,本人設置為二維碼圖片的20%,因為過大會蓋掉二維碼 */
int widthLogo = logo.getWidth(null)>image.getWidth()*3/10?(image.getWidth()*3/10):logo.getWidth(null),
heightLogo = logo.getHeight(null)>image.getHeight()*3/10?(image.getHeight()*3/10):logo.getWidth(null);
/** * logo放在中心 */
int x = (image.getWidth() - widthLogo) / 2;
int y = (image.getHeight() - heightLogo) / 2;
/** * logo放在右下角 * int x = (image.getWidth() - widthLogo); * int y = (image.getHeight() - heightLogo); */
//開始繪制圖片
g.drawImage(logo, x, y, widthLogo, heightLogo, null);
// g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
// g.setStroke(new BasicStroke(logoConfig.getBorder()));
// g.setColor(logoConfig.getBorderColor());
// g.drawRect(x, y, widthLogo, heightLogo);
g.dispose();
//把商品名稱添加上去,商品名稱不要太長哦,這里最多支持兩行。太長就會自動截取啦
if (proctName != null && !proctName.equals("")) {
//新的圖片,把帶logo的二維碼下面加上文字
BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D outg = outImage.createGraphics();
//畫二維碼到新的面板
outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
//畫文字到新的面板
outg.setColor(Color.BLACK);
outg.setFont(new Font("宋體",Font.BOLD,30)); //字體、字型、字型大小
int strWidth = outg.getFontMetrics().stringWidth(proctName);
if (strWidth > 399) {
// //長度過長就截取前面部分
// outg.drawString(proctName, 0, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 5 ); //畫文字
//長度過長就換行
String proctName1 = proctName.substring(0, proctName.length()/2);
String proctName2 = proctName.substring(proctName.length()/2, proctName.length());
int strWidth1 = outg.getFontMetrics().stringWidth(proctName1);
int strWidth2 = outg.getFontMetrics().stringWidth(proctName2);
outg.drawString(proctName1, 200 - strWidth1/2, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 12 );
BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D outg2 = outImage2.createGraphics();
outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);
outg2.setColor(Color.BLACK);
outg2.setFont(new Font("宋體",Font.BOLD,30)); //字體、字型、字型大小
outg2.drawString(proctName2, 200 - strWidth2/2, outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight())/2 + 5 );
outg2.dispose();
outImage2.flush();
outImage = outImage2;
}else {
outg.drawString(proctName, 200 - strWidth/2 , image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 12 ); //畫文字
}
outg.dispose();
outImage.flush();
image = outImage;
}
logo.flush();
image.flush();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.flush();
ImageIO.write(image, "png", baos);
//二維碼生成的路徑,但是實際項目中,我們是把這生成的二維碼顯示到界面上的,因此下面的折行代碼可以注釋掉
//可以看到這個方法最終返回的是這個二維碼的imageBase64字元串
//前端用 <img src="data:image/png;base64,${imageBase64QRCode}"/> 其中${imageBase64QRCode}對應二維碼的imageBase64字元串
ImageIO.write(image, "png", new File("C:/Users/luoguohui/Desktop/TDC-" + new Date().getTime() + "test.png")); //TODO
String imageBase64QRCode = Base64.byteArrayToBase64(baos.toByteArray());
baos.close();
return imageBase64QRCode;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
/** * 構建初始化二維碼 * * @param bm * @return */
public BufferedImage fileToBufferedImage(BitMatrix bm)
{
BufferedImage image = null;
try
{
int w = bm.getWidth(), h = bm.getHeight();
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
image.setRGB(x, y, bm.get(x, y) ? 0xFF000000 : 0xFFCCDDEE);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
return image;
}
/** * 生成二維碼bufferedImage圖片 * * @param content * 編碼內容 * @param barcodeFormat * 編碼類型 * @param width * 圖片寬度 * @param height * 圖片高度 * @param hints * 設置參數 * @return */
public BufferedImage getQR_CODEBufferedImage(String content, BarcodeFormat barcodeFormat, int width, int height, Map<EncodeHintType, ?> hints)
{
MultiFormatWriter multiFormatWriter = null;
BitMatrix bm = null;
BufferedImage image = null;
try
{
multiFormatWriter = new MultiFormatWriter();
// 參數順序分別為:編碼內容,編碼類型,生成圖片寬度,生成圖片高度,設置參數
bm = multiFormatWriter.encode(content, barcodeFormat, width, height, hints);
int w = bm.getWidth();
int h = bm.getHeight();
image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
// 開始利用二維碼數據創建Bitmap圖片,分別設為黑(0xFFFFFFFF)白(0xFF000000)兩色
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
}
}
}
catch (WriterException e)
{
e.printStackTrace();
}
return image;
}
/** * 設置二維碼的格式參數 * * @return */
public Map<EncodeHintType, Object> getDecodeHintType()
{
// 用於設置QR二維碼參數
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
// 設置QR二維碼的糾錯級別(H為最高級別)具體級別信息
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 設置編碼方式
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.MARGIN, 0);
hints.put(EncodeHintType.MAX_SIZE, 350);
hints.put(EncodeHintType.MIN_SIZE, 100);
return hints;
}
}
class LogoConfig
{
// logo默認邊框顏色
public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
// logo默認邊框寬度
public static final int DEFAULT_BORDER = 2;
// logo大小默認為照片的1/5
public static final int DEFAULT_LOGOPART = 5;
private final int border = DEFAULT_BORDER;
private final Color borderColor;
private final int logoPart;
/** * Creates a default config with on color {@link #BLACK} and off color * {@link #WHITE}, generating normal black-on-white barcodes. */
public LogoConfig()
{
this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
}
public LogoConfig(Color borderColor, int logoPart)
{
this.borderColor = borderColor;
this.logoPart = logoPart;
}
public Color getBorderColor()
{
return borderColor;
}
public int getBorder()
{
return border;
}
public int getLogoPart()
{
return logoPart;
}
}
B. 生成二維碼 並且在二維碼上面加logo 求助
蘋果手機可以直接使用二維碼工房Pro生成帶logo的二維碼名片,這個應用生成二維碼的功能很強大,支持文本、網址、名片等格式,輸入想要生成的內容,一鍵即可創建二維碼,支持嵌入Logo,還有彩碼、各種精美模板、融合二維碼等美化功能。不是蘋果手機的話,直接關注它的公眾號也行。
C. 如何生成帶logo的參數二維碼生成器
經過測試好用的一個生成二維碼圖片的方法:
/**
* 生成二維碼(QRCode)圖片
* @param content 二維碼圖片的內容
* @param imgPath 生成二維碼圖片完整的路徑
* @param ccbpath 二維碼圖片中間的logo路徑
*/
public static int createQRCode(String content, String imgPath,String ccbPath) {
try {
Qrcode qrcodeHandler = new Qrcode();
qrcodeHandler.setQrcodeErrorCorrect('M');
qrcodeHandler.setQrcodeEncodeMode('B');
qrcodeHandler.setQrcodeVersion(7);
// System.out.println(content);
byte[] contentBytes = content.getBytes("gb2312");
BufferedImage bufImg = new BufferedImage(140, 140,
BufferedImage.TYPE_INT_RGB);
Graphics2D gs = bufImg.createGraphics();
gs.setBackground(Color.WHITE);
gs.clearRect(0, 0, 140, 140);
2
// 設定圖像顏色 > BLACK
gs.setColor(Color.BLACK);
// 設置偏移量 不設置可能導致解析出錯
int pixoff = 2;
// 輸出內容 > 二維碼
if (contentBytes.length > 0 && contentBytes.length < 120) {
boolean[][] www.gzlij.com codeOut =
qrcodeHandler.calQrcode(contentBytes);
for (int i = 0; i < codeOut.length; i++) {
for (int j = 0; j < codeOut.length; j++) {
if (codeOut[j][i]) {
gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
}
}
}
} else {
System.err.println("QRCode content bytes length = "
+ contentBytes.length + " not in [ 0,120 ]. ");
return -1;
}
Image img = ImageIO.read(new File(ccbPath));
//實例化一個Image對象。
gs.drawImage(img, 55, 55, null);
gs.dispose();
bufImg.flush();
3
//實例化一個Image對象。
gs.drawImage(img, 55, 55, null);
gs.dispose();
bufImg.flush();
// 生成二維碼QRCode圖片
File imgFile = new File(imgPath);
ImageIO.write(bufImg, "png", imgFile);
} catch (Exception e)
{
e.printStackTrace();
return -100;
}
return 0;
}
D. java用什麼方式生成二維碼帶logo,zxing
在生成的圖片的中間的區域,直接貼一張小圖片,,,,,不能太大
E. java中生成中間帶logo的二維碼
下載 QRCode ,設置 CLASSPATH、編譯源碼,可以運行的。。。。。。。。。。
2維碼就是有容錯,所以,中間「挖」空一小片不影響識別 。。。。。
F. 求一個 二維碼生成器帶logo的
http://sz.ganji.com/fuwu_dian/392699/ 這里有一個,你看一下回 能不能用答
G. QRCode(java)生成帶logo的二維碼,能否在中間空出固定大小的位置給logo讓解析不出錯
二維碼中間部分是校驗碼,在那裡加上一個圖標是沒有影響的。
這就是為什麼很多二維碼有圖標而不會出錯的原因。
H. 如何生成帶中間LOGO的二維碼
先生成一個二維碼,然後再PS一個LOGO在中間就可以了
I. 如何生成帶logo圖片的二維碼用二維碼生成器嗎還是ps
親測可用,望親給好評哦,還有,祝你家小店越做越大
J. 帶有logo的二維碼怎麼製作
很簡單的,網上找到二維碼生成
然後有個添加LOGO的
添加上就可以了
直接網路二維碼生成就能找到很多的