知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
【Java】利用Java對(duì)網(wǎng)址進(jìn)行二維碼的編碼與解碼操作
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):55
二維碼之所以可以或許封裝圖片、文件等主如果把圖片、文件等URL編碼成二維碼,用戶一掃手機(jī)主動(dòng)拜訪。
上一次在《【jQuery】應(yīng)用jquery-qrcode插件把網(wǎng)址轉(zhuǎn)化成二維碼棘手機(jī)掃一掃即可拜訪》(點(diǎn)擊打開鏈接)應(yīng)用jquery-qrcode插件合營(yíng)jquery可以或許把網(wǎng)址編碼成字符串,在網(wǎng)址上顯示編碼后的二維碼,移動(dòng)設(shè)備可以或許直接掃一掃。
此次將在Java中實(shí)現(xiàn)對(duì)二維碼的編碼與解碼輸出稻磁逄上,無(wú)需在網(wǎng)頁(yè)中進(jìn)行,并且還可以解碼,然則步調(diào)比較復(fù)雜罷了。
Java自身當(dāng)然沒有二維碼的編碼與解碼的功能,須要下載兩個(gè)插件,也就是額外的jar包,一個(gè)用來(lái)編碼的,把字符串、網(wǎng)址、URL等轉(zhuǎn)化成二維碼的com.swetake.util.Qrcode,可以大年夜它的官網(wǎng)下載(點(diǎn)擊打開鏈接),我也為大年夜家上傳了一份(點(diǎn)擊打開鏈接),另一個(gè)用來(lái)解碼,把二維碼轉(zhuǎn)化成本來(lái)的字符串、網(wǎng)址、URL等的jp.sourceforge.qrcode.data.QRCodeImage,這個(gè)也可以大年夜它的官網(wǎng)中下載(點(diǎn)擊打開鏈接),我也為大年夜家上傳了一份(點(diǎn)擊打開鏈接)
編碼的com.swetake.util.Qrcode下載之后是一個(gè)qrcode_java0.50beta10.tar.gz,最新版的Winrar可以解壓,解壓之后把瑯綾擎lib目次下的qrcode.jar掏出來(lái),改個(gè)名字叫qrcodeencoding.jar,解碼的jp.sourceforge.qrcode.data.QRCodeImage下載之后的是一個(gè)redir.zip,解壓之后同樣把瑯綾擎lib目次下的qrcode.jar掏出來(lái),改個(gè)名字叫qrcodedecoding.jar。本來(lái)這些第三方j(luò)ar包,無(wú)需修改可以扔到Java工程中應(yīng)用。然則,這兩家日本公司,實(shí)袈溱是太有緣了,開辟的二維碼包撞衫了。是以,要改好名字才能放到一路。改成其他名字也行,反正就不克不及同時(shí)叫qrcode,我的編碼叫qrcode.jar,譯碼叫qrcodedecoding.jar,主如果一開端不知道兩個(gè)jar的名字雷同,又惹人了編碼的com.swetake.util.Qrcode,才沒改編碼包的名字。
在Eclipse中新建一個(gè)java工程,叫什么隨便,我的叫qrcode,之后最背工動(dòng)打開eclipse的工程目次,找到這個(gè)文件夾,在瑯綾擎新建一個(gè)lib,把qrcodeencoding.jar與qrcodedecoding.jar放進(jìn)去,然后在Eclipse中刷新一下這個(gè)工程,右鍵點(diǎn)最下面的一項(xiàng)屬性,在Java Build Path中的Libraries選擇Add Jars..如不雅沒有拷到工程目次下則選擇Add External Jars.添加這兩個(gè)包:
[img]http://img.blog.csdn.net/20150105094438156
之后先在src下的package下新建一個(gè)QRcode.java,也就是一個(gè)class。于是,全部工程目次構(gòu)造如下所示,此時(shí)應(yīng)當(dāng)沒有test.png,test.png是后來(lái)生成的二維碼文件:
[img]http://img.blog.csdn.net/20150105094729349
預(yù)備工作寫好之后就可以或許正式寫代碼。
直接貼上全代碼,則一行一行給大年夜家分析,是怎么做的。
package qrcode; import java.awt.*; import java.awt.image.*; import java.io.*; import javax.imageio.*; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.data.QRCodeImage; import com.swetake.util.Qrcode; public class QRcode { public static void makeQRcode(String content, String imgPath) { Qrcode qrcode = new Qrcode(); qrcode.setQrcodeErrorCorrect('M'); qrcode.setQrcodeEncodeMode('B'); qrcode.setQrcodeVersion(7); BufferedImage bufImg = new BufferedImage(325, 325, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); gs.setBackground(Color.WHITE); gs.clearRect(0, 0, 325, 325); gs.setColor(Color.BLACK); try { byte[] contentBytes = content.getBytes("utf-8"); if (0 < contentBytes.length && contentBytes.length < 120) { boolean[][] codeOut = qrcode.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 * 7 + 5, i * 7 + 5, 7, 7); } } } } gs.dispose(); bufImg.flush(); File imgFile = new File(imgPath); //生成為png ImageIO.write(bufImg, "png", imgFile); System.out.println("生成成功!"); } catch (Exception e) { System.out.println("掉足了!"); } } public static String decodeQRCode(String imgPath) throws IOException { File imageFile = new File(imgPath); BufferedImage bufImg = null; String decodedData = http://www.sjsjw.com/100/000215MYM020865/null; bufImg = ImageIO.read(imageFile); QRCodeDecoder decoder = new QRCodeDecoder(); decodedData = new String(decoder.decode(new J2SEImage(bufImg))); System.out.println("解析成功!"); return decodedData; } public static void main(String args[]) throws IOException { String content = "http://www.a.com"; File directory = new File(""); String imgPath = directory.getCanonicalPath() + "http://test.png"; makeQRcode(content, imgPath); System.out.println(decodeQRCode(imgPath)); } } class J2SEImage implements QRCodeImage { BufferedImage bufImg; public J2SEImage(BufferedImage bufImg) { this.bufImg = bufImg; } public int getWidth() { return bufImg.getWidth(); } public int getHeight() { return bufImg.getHeight(); } public int getPixel(int x, int y) { return bufImg.getRGB(x, y); } }
1、起首在頭部惹人:
import java.awt.*; import java.awt.image.*; import java.io.*; import com.swetake.util.Qrcode;
2、然后寫makeQRcode這個(gè)類,代碼如下:
//因?yàn)檫@個(gè)類中同時(shí)有主函數(shù),所以要加上static屬性 /* * @content 要編碼的內(nèi)容 * @imgPath 二維碼生成的路徑 */ //據(jù)說(shuō)膳綾擎這種解釋類參數(shù)注釋辦法,相符名企標(biāo)準(zhǔn),╮(╯▽╰)╭你TMD看懂就行了 public static void makeQRcode(String content, String imgPath) { //以下很多是指定動(dòng)作,不為什么,這個(gè)類就要如許寫, //可以改的部分我會(huì)注釋 Qrcode qrcode = new Qrcode(); //這里是容錯(cuò)率,有L,M,Q三種,L為最小,一般如不雅你還要在二維碼膳綾擎加圖片,就用Q //留意這里必須應(yīng)用單引號(hào),因?yàn)檫@里是char或者int類型,而不是String類型 qrcode.setQrcodeErrorCorrect('M'); qrcode.setQrcodeEncodeMode('B'); qrcode.setQrcodeVersion(7); //新建一個(gè)325x325px的圖像,這個(gè)大年夜小不是說(shuō)改就改的,有講究的,與下面gs.fillRect語(yǔ)句相接洽關(guān)系 BufferedImage bufImg = new BufferedImage(325, 325, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); //圖像的配風(fēng)景是白色 gs.setBackground(Color.WHITE); //這里的325x325必須與膳綾擎BufferedImage bufImg = new BufferedImage(325, 325, BufferedImage.TYPE_INT_RGB);對(duì)應(yīng) //膳綾擎是325x325你這里必須是若干 gs.clearRect(0, 0, 325, 325); //二維碼的色彩是黑色 gs.setColor(Color.BLACK); //它丫不拋出,不讓編譯經(jīng)由過(guò)程╮(╯▽╰)╭ try { //編碼方法為utf-8,如今還寫gb2312與gbk那就是作逝世,都什么年代了,編碼也全球化了! byte[] contentBytes = content.getBytes("utf-8"); //可以編碼的字符串長(zhǎng)度0-120字節(jié),二維碼的固定長(zhǎng)度來(lái)的,別改 if (0 < contentBytes.length && contentBytes.length < 120) { boolean[][] codeOut = qrcode.calQrcode(contentBytes); for (int i = 0; i < codeOut.length; i++) { for (int j = 0; j < codeOut.length; j++) { if (codeOut[j][i]) { //這里是每一個(gè)點(diǎn)為7x7 //這個(gè)7同一改,如不雅你要每一個(gè)點(diǎn)為6x6,那么這句必須寫成gs.fillRect(j * 6 + 5, i * 6 + 5, 6, 6); //那個(gè)5是邊沿的留白,就是這個(gè)二維碼外面還有一些白色的邊框,如不雅這個(gè)數(shù)是0,緊貼圖片邊沿?fù)?jù)說(shuō)會(huì)掉足 //設(shè)置為0我沒試過(guò),只是為了好看留5px的空白 //每個(gè)點(diǎn)為7x7,還有5px的留白,得出圖片大年夜小為7*45+5*2=325 //如不雅你每個(gè)點(diǎn)是6*6,留白3px,那么圖片大年夜小就是6*45+3*2=276。 //也就是膳綾擎的BufferedImage bufImg = new BufferedImage(325, 325, BufferedImage.TYPE_INT_RGB);與gs.clearRect(0, 0, 325, 325);本身改好 //這公式中的45與2是固定的,二維碼就是如許,不為什么。 gs.fillRect(j * 7 + 5, i * 7 + 5, 7, 7); } } } } gs.dispose(); bufImg.flush(); File imgFile = new File(imgPath); //生成為png ImageIO.write(bufImg, "png", imgFile); System.out.println("生成成功!"); } catch (Exception e) { System.out.println("掉足了!"); } }
3、然后下面的主函數(shù)寫入要編碼的字符串,比如http://www.a.com這個(gè)網(wǎng)址,與保存的圖片目次,比如當(dāng)前工程目次,就能完成二維碼的編碼工作:
public static void main(String args[]) throws IOException { //要編碼的字符串 String content = "http://www.a.com"; //掏出當(dāng)前的工程目次,并指明保存文件名為test.png File directory = new File(""); String imgPath = directory.getCanonicalPath() + "\\test.png"; //履行makeQRcode編碼的辦法 makeQRcode(content, imgPath); }
主函數(shù)須要拋出異常是因?yàn)橛玫搅薋ile中的取工程目次函數(shù),它JAVA害怕取不到工程目次會(huì)掉足
4、下面進(jìn)行二維碼的解碼工作,起首在文件頭惹人
import javax.imageio.*; import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.data.QRCodeImage;
5、先在文件的最下方完成QRCodeImage這個(gè)接口的封裝,說(shuō)白就是要把圖片轉(zhuǎn)化成QRCodeImage,它這個(gè)jar包才能對(duì)其成功解碼,所以要對(duì)這個(gè)接口進(jìn)行封裝,弗成以強(qiáng)迫類型轉(zhuǎn)換。
class J2SEImage implements QRCodeImage { BufferedImage bufImg; public J2SEImage(BufferedImage bufImg) { this.bufImg = bufImg; } public int getWidth() { return bufImg.getWidth(); } public int getHeight() { return bufImg.getHeight(); } public int getPixel(int x, int y) { return bufImg.getRGB(x, y); } }這接口封裝起來(lái)很簡(jiǎn)單嘛!就是要取走圖片、長(zhǎng)寬,各個(gè)像素的色彩。
6、把QRCodeImage這個(gè)接口的封裝成J2SEImage之后,寫一個(gè)decodeQRCode這個(gè)類,代碼如下:
<span style="white-space:pre"> </span>public static String decodeQRCode(String imgPath) throws IOException { /* * @imageFile 被解碼的文件 * @BufferedImage 此乃所謂的圖片緩沖流 * @decodedData 存放解碼的內(nèi)容 */ File imageFile = new File(imgPath); BufferedImage bufImg = null; String decodedData = http://www.sjsjw.com/100/000215MYM020865/null; bufImg = ImageIO.read(imageFile); QRCodeDecoder decoder = new QRCodeDecoder(); //封裝后直接用decode辦法就能完成二維碼的解碼 decodedData = new String(decoder.decode(new J2SEImage(bufImg))); System.out.println("解析成功!"); //最后返回解碼的內(nèi)容就OK return decodedData; }
做完在于主函數(shù)中參加一條System.out.println(decodeQRCode(imgPath));,就可以或許在控制臺(tái)輸出解碼的內(nèi)容,運(yùn)行一下,可以在工程目次下生成了一個(gè)http://www.a.com網(wǎng)址被編碼成的二維碼圖片test.png,這個(gè)test.png就不傳上來(lái),如今的人就是TMD劍,沒事拿手機(jī)對(duì)二維碼亂掃,好奇心殺逝世貓,我放個(gè)扣費(fèi)網(wǎng)址你就呵呵了,同時(shí)控制臺(tái)輸出:
[img]http://img.blog.csdn.net/20150105102247646
相關(guān)案例查看更多
相關(guān)閱讀
- web開發(fā)技術(shù)
- vue開發(fā)小程序
- 商標(biāo)
- 報(bào)廢車拆解管理系統(tǒng)
- 智慧農(nóng)貿(mào)市場(chǎng)
- 云南小程序開發(fā)公司推薦
- 網(wǎng)站建設(shè)列表網(wǎng)
- 云南網(wǎng)站建設(shè)費(fèi)用
- 二叉樹
- 網(wǎng)站建設(shè)招商
- 云南小程序公司
- 開發(fā)微信小程序
- 微信分銷系統(tǒng)
- 汽車拆解管理系統(tǒng)
- 英文網(wǎng)站建設(shè)公司
- 正規(guī)網(wǎng)站建設(shè)公司
- 云南網(wǎng)絡(luò)推廣
- 網(wǎng)絡(luò)營(yíng)銷
- 云南網(wǎng)站建設(shè)案例
- 昆明網(wǎng)站設(shè)計(jì)
- 云南小程序開發(fā)制作公司
- 云南小程序開發(fā)費(fèi)用
- 云南小程序被騙蔣軍
- 云南企業(yè)網(wǎng)站
- 昆明小程序設(shè)計(jì)
- 云南網(wǎng)站建設(shè)報(bào)價(jià)
- 云南做軟件
- 小程序開發(fā)公司
- 汽車報(bào)廢拆解管理系統(tǒng)
- 退款