javaqrcodelogo
A. 怎麼使用 java 在二維碼中間 加入 logo
徽標的意思 LOGO是與其它網站鏈接以及讓其它網站鏈接的標志和門戶 在於各個網站之間可以聯接。要讓其他人走入你的網站,必須提供一個讓其進入的門戶。而LOGO圖形化的形式,特別是動態的LOGO,比文字形式的鏈接更能吸引人的注意。在如今爭奪眼球的時代,這一點尤其重要LOGO即是網站的名片而LOGO的製作方法也和製作普通的圖片及動畫沒什麼兩樣,不同的只是規定了它的大小而已
B. java生成二維碼如何去除白邊
新代碼:(注意點查看圖片截圖的標注)
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
hints.put(EncodeHintType.MARGIN, 0);
BitMatrix bitMatrix = new QRCodeWriter().encode("生成二維碼的內容",
BarcodeFormat.QR_CODE, 256, 256,hints);
//1.1去白邊
int[] rec = bitMatrix.getEnclosingRectangle();
int resWidth = rec[2] + 1;
int resHeight = rec[3] + 1;
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
resMatrix.clear();
for (int i = 0; i < resWidth; i++) {
for (int j = 0; j < resHeight; j++) {
if (bitMatrix.get(i + rec[0], j + rec[1])) {
resMatrix.set(i, j);
}
}
}
//2
int width = resMatrix.getWidth();
int height = resMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, resMatrix.get(x, y) == true ?
Color.BLACK.getRGB():Color.WHITE.getRGB());
}
}
//3
ImageIO.write(image,"png", new File("生成二維碼保存的路徑"));
2
這時候生成的二維碼圖片就沒有四周的白邊了。
C. java中生成中間帶logo的二維碼
下載 QRCode ,設置 CLASSPATH、編譯源碼,可以運行的。。。。。。。。。。
2維碼就是有容錯,所以,中間「挖」空一小片不影響識別 。。。。。
D. QRCode(java)生成帶logo的二維碼,能否在中間空出固定大小的位置給logo讓解析不出錯
二維碼中間部分是校驗碼,在那裡加上一個圖標是沒有影響的。
這就是為什麼很多二維碼有圖標而不會出錯的原因。
E. java怎麼生成帶logo二維碼
1、下載生成二維碼所需要的jar包qrcode.jar;
2、直接上生成二維碼的java代碼
//需要導入的包
importjava.awt.Color;
importjava.awt.Graphics2D;
importjava.awt.Image;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjavax.imageio.ImageIO;
importcom.swetake.util.Qrcode;
/**
*生成二維碼(QRCode)圖片
*@paramcontent二維碼圖片的內容
*@paramimgPath生成二維碼圖片完整的路徑
*@paramccbpath二維碼圖片中間的logo路徑
*/
publicstaticintcreateQRCode(Stringcontent,StringimgPath,StringccbPath){
try{
QrcodeqrcodeHandler=newQrcode();
qrcodeHandler.setQrcodeErrorCorrect('M');
qrcodeHandler.setQrcodeEncodeMode('B');
qrcodeHandler.setQrcodeVersion(7);
//System.out.println(content);
byte[]contentBytes=content.getBytes("gb2312");
//構造一個BufferedImage對象設置寬、高
BufferedImagebufImg=newBufferedImage(140,140,BufferedImage.TYPE_INT_RGB);
Graphics2Dgs=bufImg.createGraphics();
gs.setBackground(Color.WHITE);
gs.clearRect(0,0,140,140);
//設定圖像顏色>BLACK
gs.setColor(Color.BLACK);
//設置偏移量不設置可能導致解析出錯
intpixoff=2;
//輸出內容>二維碼
if(contentBytes.length>0&&contentBytes.length<120){
boolean[][]codeOut=qrcodeHandler.calQrcode(contentBytes);
for(inti=0;i<codeOut.length;i++){
for(intj=0;j<codeOut.length;j++){
if(codeOut[j][i]){
gs.fillRect(j*3+pixoff,i*3+pixoff,3,3);
}
}
}
}else{
System.err.println("QRCodecontentbyteslength="
+contentBytes.length+"notin[0,120].");
return-1;
}
Imageimg=ImageIO.read(newFile(ccbPath));//實例化一個Image對象。
gs.drawImage(img,55,55,30,30,null);
gs.dispose();
bufImg.flush();
//生成二維碼QRCode圖片
FileimgFile=newFile(imgPath);
ImageIO.write(bufImg,"png",imgFile);
}catch(Exceptione){
e.printStackTrace();
return-100;
}
return0;
}
來自網友孤獨青鳥的博客
F. java生成中間帶logo圖片二維碼,logo圖片模糊。請問各位大俠,有啥解決辦法
圖片太模糊的話應該是失真了,引用圖片的時候設置下img標簽的height和width屬性與圖片的尺寸一致應該就行了,你可以試試看。
G. 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;
}
}