欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

【Java】利用Java對(duì)網(wǎng)址進(jìn)行二維碼的編碼與解碼操作 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(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í)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 技術(shù)分享 >

【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)案例查看更多