zxing解析二維碼拋出com.google.zxing.NotFoundException的解決過(guò)程
1.二維碼所有bit都是0
分析了一下,發(fā)現(xiàn)我在生成二維碼的時(shí)候白色像素填充使用的是透明色,這樣在顯示的時(shí)候因?yàn)楸尘笆前咨?,所以看上去和用手機(jī)掃都沒(méi)有問(wèn)題,但是自己代碼識(shí)別的時(shí)候就會(huì)把透明色識(shí)別為黑色,這樣就導(dǎo)致整個(gè)二維碼圖片全是黑色像素,所以zxing拋出com.google.zxing.NotFoundException異常。
2.亂碼
// 解碼設(shè)置編碼方式為:utf-8, hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
3.優(yōu)化精度
//優(yōu)化精度 hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
4.開(kāi)啟PURE_BARCODE模式。
(這是解決我的方案,帶圖片LOGO的解碼方案)
//復(fù)雜模式,開(kāi)啟PURE_BARCODE模式 hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
/**
* 流圖片解碼
* @param input
* @return QRResult
*/
public static QRResult decode(InputStream input) {
BufferedImage image;
try {
if (null == input) {
return new QRResult("得到的文件不存在!",300);
}
image = ImageIO.read(input);
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Map<DecodeHintType,Object> hints = new LinkedHashMap<DecodeHintType,Object>();
// 解碼設(shè)置編碼方式為:utf-8,
hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
//優(yōu)化精度
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
//復(fù)雜模式,開(kāi)啟PURE_BARCODE模式
hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
Result result = new MultiFormatReader().decode(bitmap, hints);
String txt = result.getText();
return new QRResult("成功解碼!",200,txt);
} catch (Exception e) {
LoggerUtils.error(MatrixUtil.class,"解碼失敗。", e);
return new QRResult("解碼失敗,請(qǐng)確認(rèn)的你二維碼是否正確,或者圖片有多個(gè)二維碼!",500);
}
}
/**
* 返回值處理
* @author zhou-baicheng
*
*/
public static class QRResult{
public QRResult(String message,int status) {
this.message = message;
this.status = status;
this.txt = "";
}
public QRResult(String message,int status,String txt) {
this.message = message;
this.status = status;
this.txt = txt;
}
//解碼內(nèi)容
private String txt;
//返回的消息內(nèi)容
private String message;
//返回的狀態(tài)碼,200:成功,500:錯(cuò)誤
private int status ;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot與Postman實(shí)現(xiàn)REST模擬請(qǐng)求的操作
這篇文章主要介紹了SpringBoot與Postman實(shí)現(xiàn)REST模擬請(qǐng)求的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
簡(jiǎn)單了解Spring Web相關(guān)模塊運(yùn)行原理
這篇文章主要介紹了簡(jiǎn)單了解Spring Web相關(guān)模塊運(yùn)行原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Springboot項(xiàng)目的搭建教程(分離出common父依賴)
這篇文章主要介紹了Springboot項(xiàng)目的搭建教程(分離出common父依賴),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
如何在Spring?Boot中使用OAuth2認(rèn)證和授權(quán)
這篇文章主要介紹了如何在Spring?Boot中使用OAuth2認(rèn)證和授權(quán)的相關(guān)資料,OAuth2.0是一種開(kāi)放的授權(quán)協(xié)議,它允許用戶授權(quán)第三方應(yīng)用訪問(wèn)其賬戶(或資源),而無(wú)需共享其用戶賬戶憑據(jù),需要的朋友可以參考下2023-12-12
新手了解java 數(shù)組基礎(chǔ)知識(shí)
這篇文章主要介紹了Java 數(shù)組分析及簡(jiǎn)單實(shí)例的相關(guān)資料,在Java中它就是對(duì)象,一個(gè)比較特殊的對(duì)象,需要的朋友可以參考下,希望可以對(duì)你有所幫助2021-07-07
SpringBoot使用Redis實(shí)現(xiàn)消息隊(duì)列的方法小結(jié)
在應(yīng)用中把Redis當(dāng)成消息隊(duì)列來(lái)使用已經(jīng)屢見(jiàn)不鮮了,我想主要原因是當(dāng)代應(yīng)用十有八九都會(huì)用到 Redis,因此不用再引入其他消息隊(duì)列系統(tǒng),而且Redis提供了好幾種實(shí)現(xiàn)消息隊(duì)列的方法,用起來(lái)也簡(jiǎn)單,本文給大家介紹了SpringBoot使用Redis實(shí)現(xiàn)消息隊(duì)列的方法小結(jié)2024-04-04

