亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qrcodedecoder.java

?? QRcode二維碼生成源代碼,一個做條形碼的代碼
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
/*
 * 嶌惉擔丗 2004/09/12
 *
 * TODO 偙偺惗惉偝傟偨僼傽僀儖偺僥儞僾儗乕僩傪曄峏偡傞偵偼師傪嶲徠丅
 * 僂傿儞僪僂 亜 愝掕 亜 Java 亜 僐乕僪丒僗僞僀儖 亜 僐乕僪丒僥儞僾儗乕僩
 */
package jp.sourceforge.qrcode.codec;

import java.util.Vector;

import jp.sourceforge.qrcode.codec.data.QRCodeSymbol;
import jp.sourceforge.qrcode.codec.ecc.BCH15_5;
import jp.sourceforge.qrcode.codec.ecc.ReedSolomon;
import jp.sourceforge.qrcode.codec.exception.AlignmentPatternEdgeNotFoundException;
import jp.sourceforge.qrcode.codec.exception.DecodingFailedException;
import jp.sourceforge.qrcode.codec.exception.FinderPatternNotFoundException;
import jp.sourceforge.qrcode.codec.exception.IllegalDataBlockException;
import jp.sourceforge.qrcode.codec.exception.SymbolNotFoundException;
import jp.sourceforge.qrcode.codec.exception.VersionInformationException;
import jp.sourceforge.qrcode.codec.reader.QRCodeDataBlockReader;
import jp.sourceforge.qrcode.codec.reader.QRCodeImageReader;
import jp.sourceforge.qrcode.codec.util.DebugCanvas;

/**
 * @author Owner
 *
 * TODO 偙偺惗惉偝傟偨宆僐儊儞僩偺僥儞僾儗乕僩傪曄峏偡傞偵偼師傪嶲徠丅
 * 僂傿儞僪僂 亜 愝掕 亜 Java 亜 僐乕僪丒僗僞僀儖 亜 僐乕僪丒僥儞僾儗乕僩
 */
public class QRCodeDecoder {
	//QRCodeImageReader reader;
	int internalScale;
	QRCodeSymbol symbol;
	DebugCanvas canvas;
	//僨僐乕僟杮懱
	public QRCodeDecoder() {
		internalScale = 2;
		canvas = DebugCanvas.getCanvas();
	}
	
	public String decode(int[][] image) throws DecodingFailedException{
		canvas.println("Decoding started.");
		try {
			symbol = getQRCodeSymbol(image);
		} catch (SymbolNotFoundException e) {
			e.printStackTrace();
			throw new DecodingFailedException();
		}
		canvas.println("Created QRCode symbol.");
		//int ratio = canvas.getWidth() / symbol.getWidth();
		//canvas.drawMatrix(symbol , ratio);
		canvas.println("Reading symbol.");
		boolean[] formatInformation = getFormatInformation(symbol);
		symbol.setFormatInformation(formatInformation);
		canvas.println("Version: " + symbol.getVersionReference());
		String maskPattern = Integer.toString(symbol.getMaskPatternReferer() ,2);
		int length = maskPattern.length();
		for (int i = 0; i < 3 - length; i++)
			maskPattern = "0" + maskPattern;
		
		canvas.println("Mask pattern: " + maskPattern);
		canvas.println("Unmasking.");
		unmask(symbol);
		//canvas.drawMatrix(symbol, 4);
		int[] blocks = getBlocks(symbol);
		canvas.println("Correcting data errors.");
		int[] dataBlocks = getCorrectedDataBlocks(blocks);
		String decodedString = "";
		try {
			decodedString = getDecodedString(dataBlocks, symbol.getVersion());
		} catch (IllegalDataBlockException e) {
			e.printStackTrace();
			throw new DecodingFailedException();
		}
//		return new QRCodeContent(decodedString);
		canvas.println("Decoding finished.");
		return decodedString;
	}
	
	boolean[][] processImage(int[][] image) {
		imageToGrayScale(image);
		boolean[][] bitmap = grayScaleToBitmap(image);
		//boolean[][] bitmapEx = extendBitmap(bitmap, internalScale);
		return bitmap;
	}
	
	void imageToGrayScale(int[][] image) {
		for (int y = 0; y < image[0].length; y++) {
			for (int x = 0; x < image.length; x++) {
				int r = image[x][y] >> 16 & 0xFF;
				int g = image[x][y] >> 8 & 0xFF;
				int b = image[x][y] & 0xFF;
				int m = (r * 30 + g * 59 + b * 11) / 100;
				image[x][y] = m;
			}
		}
	}
	
	boolean[][] grayScaleToBitmap_(int[][] grayScale) {
		int[][] middle = findAreaMiddle(grayScale);
		int[] minmax = findMinMax(grayScale);
		boolean[][] bitmap = new boolean[grayScale.length][grayScale[0].length];
		int halftone = (minmax[0] + minmax[1]) / 2;

		for (int y = 0; y < grayScale[0].length; y++) {
			for (int x = 0; x < grayScale.length; x++) {
				bitmap[x][y] = (grayScale[x][y] < halftone) ? true : false;
			}
		}
		
		return bitmap;
	}
	boolean[][] grayScaleToBitmap(int[][] grayScale) {
		int[][] middle = findAreaMiddle(grayScale);
		int sqrtNumArea = middle.length;
		int areaWidth = grayScale.length / sqrtNumArea;
		int areaHeight = grayScale[0].length / sqrtNumArea;
		boolean[][] bitmap = new boolean[grayScale.length][grayScale[0].length];

		for (int ay = 0; ay < sqrtNumArea; ay++) {
			for (int ax = 0; ax < sqrtNumArea; ax++) {
				for (int dy = 0; dy < areaHeight; dy++) {
					for (int dx = 0; dx < areaWidth; dx++) {
						bitmap[areaWidth * ax + dx][areaHeight * ay + dy] = (grayScale[areaWidth * ax + dx][areaHeight * ay + dy] < middle[ax][ay]) ? true : false;
					}
				}
			}
		}
		return bitmap;
	}
	
	int[] findMinMax(int[][] image) {
		int tempMin = Integer.MAX_VALUE;
		int tempMax = Integer.MIN_VALUE;
		for (int y = 0; y < image[0].length; y++) {
			for (int x = 0; x < image.length; x++) {
				if (image[x][y] < tempMin)
					tempMin = image[x][y];
				else if (image[x][y] > tempMax)
					tempMax = image[x][y];
			}
		}
		return new int[] {tempMin, tempMax};
	}
	
	int[][] findAreaMiddle(int[][] image) {
		final int numSqrtArea = 4;
		//4x4偺僄儕傾偛偲偺柧傞偝偺拞娫抣((min + max) / 2)傪弌偡
		int areaWidth = image.length / numSqrtArea;
		int areaHeight = image[0].length / numSqrtArea;
		int[][][] minmax = new int[numSqrtArea][numSqrtArea][2];
		for (int ay = 0; ay < numSqrtArea; ay++) {
			for (int ax = 0; ax < numSqrtArea; ax++) {
				minmax[ax][ay][0] = 0xFF;
				for (int dy = 0; dy < areaHeight; dy++) {
					for (int dx = 0; dx < areaWidth; dx++) {
						int target = image[areaWidth * ax + dx][areaHeight * ay + dy];
						if (target < minmax[ax][ay][0]) minmax[ax][ay][0] = target;
						if (target > minmax[ax][ay][1]) minmax[ax][ay][1] = target;
					}
				}
				//minmax[ax][ay][0] = (minmax[ax][ay][0] + minmax[ax][ay][1]) / 2;
			}
		}
		int[][] middle =  new int[numSqrtArea][numSqrtArea];
		for (int ay = 0; ay < numSqrtArea; ay++) {
			for (int ax = 0; ax < numSqrtArea; ax++) {
				middle[ax][ay] = (minmax[ax][ay][0] + minmax[ax][ay][1]) / 2;
				//System.out.print(middle[ax][ay] + ",");
			}
			//System.out.println("");
		}
		//System.out.println("");

		return middle;
	}
	
	boolean[][] extendBitmap(boolean[][] bitmap, int scale) {
		boolean[][] bitmap2x = new boolean[bitmap.length * 2][bitmap[0].length * 2];
		for (int y = 0; y < bitmap[0].length; y++) {
			for (int x = 0; x < bitmap.length; x++) {
				if (bitmap[x][y] == true) {
					for (int sx = 0; sx < scale; sx++)
						for (int sy = 0; sy < scale; sy++)
							bitmap2x[x * scale + sx][y * scale + sy] = true;
				}
					
			}
		}
		return bitmap2x;
	}

	QRCodeSymbol getQRCodeSymbol(int[][] image) throws SymbolNotFoundException {

		//canvas.println("Creating binary matrix.");
 		//BinaryMatrix binaryImage = new BinaryMatrix(imageData);
		//canvas.println("Drawing matrix.");
 		//canvas.drawMatrix(binaryImage);
 		//canvas.println("Reading matrix");
 		canvas.println("Creating bitmap.");
		boolean[][] bitmap = processImage(image);
		QRCodeImageReader reader = new QRCodeImageReader();

		QRCodeSymbol symbol = null;
		try {
			symbol = reader.getQRCodeSymbol(bitmap, internalScale);
		} catch (FinderPatternNotFoundException e) {
			throw new SymbolNotFoundException();
		} catch (VersionInformationException e2) {
			throw new SymbolNotFoundException();
		} catch (AlignmentPatternEdgeNotFoundException e3) {
			throw new SymbolNotFoundException();
		}
		return symbol;
	}
	
	boolean[] getFormatInformation(QRCodeSymbol qRCodeMatrix) {
		boolean[] modules = new boolean[15];

		//儅僩儕僢僋僗偐傜宍幃忣曬晹暘庢傝弌偟
		for (int i = 0; i <= 5; i++)
			modules[i] = qRCodeMatrix.getElement(8, i);
		
		modules[6] = qRCodeMatrix.getElement(8, 7);
		modules[7] = qRCodeMatrix.getElement(8, 8);
		modules[8] = qRCodeMatrix.getElement(7, 8);
		
		for (int i = 9; i <= 14; i++)
			modules[i] = qRCodeMatrix.getElement(14 - i, 8);
		
		//XOR墘嶼偱儅僗僋張棟
		int maskPattern = 0x5412;
		
		for (int i = 0; i <= 14; i++) {
			boolean xorBit = false;
			if (((maskPattern >>> i) & 1) == 1)
				xorBit = true;
			else
				xorBit = false;
			
			if (modules[i] == xorBit) //價僢僩僔僼僩偟偨屻偺堦寘栚傪尒傞
				modules[i] = false;
			else
				modules[i] = true;
		}
		//int a[] = {0,1,2,4,8,3,6,12,11,5,10,7,14,15,13,9,1};
		//System.out.println("debug");
		//printBit("formatInfo", modules);
		
		//僄儔乕掶惓
		BCH15_5 corrector = new BCH15_5(modules);
		boolean[] output = corrector.correct();
		int numError = corrector.getNumCorrectedError();
		if (numError > 0)
			canvas.println(String.valueOf(numError) + " format errors corrected.");
		boolean[] formatInformation = new boolean[5];
		for (int i = 0; i < 5; i++)
			formatInformation[i] = output[10 + i];
		
		return formatInformation;
		
	}
	
	void unmask(QRCodeSymbol symbol) {
		int maskPatternReferer = symbol.getMaskPatternReferer();
		
		//儅僗僋僷僞乕儞惗惉
		boolean[][] maskPattern = generateMaskPattern(symbol);

		int size = symbol.getWidth();
		
		for (int y = 0; y < size; y++) {
			for (int x = 0; x < size; x++) {
				if (maskPattern[x][y] == true) {
					symbol.reverseElement(x, y);
				}
			}
		}
	}
	
	boolean[][] generateMaskPattern(QRCodeSymbol symbol) {
		int maskPatternReferer = symbol.getMaskPatternReferer();
		
		//儅僗僋僷僞乕儞惗惉
		int width = symbol.getWidth();
		int height = symbol.getHeight();
		boolean[][] maskPattern = new boolean[width][height];
		for (int y = 0; y < height; y++) {
			for (int x = 0; x < width; x++) {
				if (symbol.isInFunctionPattern(x, y))
					continue;
				switch (maskPatternReferer) {
				case 0: // 000
					if ((x + y) % 2 == 0)
						maskPattern[x][y] = true;
					break;
				case 1: // 001
					if (y % 2 == 0)
						maskPattern[x][y] = true;
					break;
				case 2: // 010

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品久久久久久久99蜜桃| 亚洲乱码国产乱码精品精98午夜 | 亚洲一区二区美女| 美女在线视频一区| 99久久99精品久久久久久| 欧美刺激午夜性久久久久久久| 亚洲欧洲性图库| 精品一二三四在线| 欧美日韩精品福利| 日韩美女久久久| 国产成人免费视频网站高清观看视频| 欧美精品久久99| 亚洲免费观看高清| 成人动漫一区二区在线| 久久人人97超碰com| 蜜臀a∨国产成人精品| 欧美日韩在线播放三区| 亚洲九九爱视频| 不卡av在线网| 国产精品乱人伦中文| 韩国毛片一区二区三区| 欧美草草影院在线视频| 亚洲国产精品久久一线不卡| 国产精品一区二区三区网站| 精品国产制服丝袜高跟| 蜜桃视频一区二区| 日韩欧美一区二区不卡| 日韩电影在线观看一区| 777奇米成人网| 日韩高清不卡在线| 91精品国产入口| 日本视频一区二区| 欧美一级一级性生活免费录像| 香蕉加勒比综合久久| 7777精品久久久大香线蕉| 亚洲国产精品久久久久秋霞影院 | 亚洲综合视频在线观看| 一本一道久久a久久精品| 亚洲综合色噜噜狠狠| 色综合一区二区三区| 玉米视频成人免费看| 在线精品视频小说1| 亚洲一级二级在线| 欧美日韩成人高清| 久久综合综合久久综合| 国产丝袜美腿一区二区三区| 成人性色生活片| 中文字幕日本乱码精品影院| 色综合一区二区三区| 亚洲成精国产精品女| 日韩欧美色综合网站| 国产毛片精品一区| 亚洲三级理论片| 欧美精品成人一区二区三区四区| 日韩avvvv在线播放| 精品久久久久久无| 色综合久久九月婷婷色综合| 亚洲电影你懂得| 精品国内二区三区| 色成年激情久久综合| 青青草成人在线观看| 国产欧美一区二区精品久导航| 99久久免费视频.com| 午夜伦理一区二区| 欧美国产精品中文字幕| 欧美日韩一区国产| 国产乱子伦视频一区二区三区| 最新成人av在线| 欧美一区二区三区四区视频| 国内外成人在线| 亚洲免费观看高清完整版在线| 欧美一区二区三区啪啪| 成人免费视频免费观看| 丝袜诱惑制服诱惑色一区在线观看| 精品蜜桃在线看| 欧美揉bbbbb揉bbbbb| 国产综合久久久久久鬼色| 亚洲美女淫视频| 久久久久久一二三区| 欧美三级日韩三级| 国产ts人妖一区二区| 视频在线观看91| 伊人色综合久久天天| 中文字幕巨乱亚洲| 日韩精品在线一区二区| 欧美午夜宅男影院| 国产成人免费在线| 精品亚洲国内自在自线福利| 亚洲一二三四在线| 日韩伦理电影网| 中文字幕av在线一区二区三区| 欧美一区二区视频观看视频| 91成人国产精品| 色综合天天综合在线视频| 精品在线播放免费| 午夜精品福利在线| 亚洲精品视频免费观看| 欧美国产精品劲爆| 国产偷国产偷精品高清尤物 | 91福利视频网站| 99麻豆久久久国产精品免费优播| 激情文学综合丁香| 久久疯狂做爰流白浆xx| 亚洲国产精品视频| 亚洲午夜精品网| 亚洲欧美另类图片小说| 国产精品短视频| 国产精品区一区二区三区| 久久久久亚洲蜜桃| 久久精品亚洲一区二区三区浴池| 精品国产乱码91久久久久久网站| 91精品国产欧美一区二区| 欧美日韩一区二区在线视频| 欧美日韩高清在线| 欧美挠脚心视频网站| 欧美性大战久久久久久久蜜臀| 日本韩国视频一区二区| 一道本成人在线| 欧美午夜视频网站| 7777精品伊人久久久大香线蕉完整版| 欧美三区在线观看| 欧美一区二区三区小说| 欧美xxxxxxxx| 久久精品亚洲一区二区三区浴池| 久久精品一区二区三区不卡 | 国产日本一区二区| 国产精品女同一区二区三区| 中文字幕亚洲成人| 亚洲美女淫视频| 五月婷婷久久综合| 麻豆精品久久久| 国产高清久久久久| 色综合天天综合色综合av| 91成人看片片| 精品久久久久久久久久久久久久久 | 国产成人精品影院| av不卡在线播放| 欧美视频一区二区三区四区| 在线成人免费观看| 久久综合久久久久88| 国产精品美日韩| 午夜精品久久久久久久久| 蜜桃传媒麻豆第一区在线观看| 国产在线不卡一卡二卡三卡四卡| jlzzjlzz欧美大全| 在线播放欧美女士性生活| 2023国产一二三区日本精品2022| 久久久久国产精品厨房| 亚洲精品乱码久久久久久日本蜜臀| 亚洲国产视频直播| 国产成人精品亚洲日本在线桃色| 91美女视频网站| 91精品国产黑色紧身裤美女| 久久久久久久久蜜桃| 有码一区二区三区| 久久99精品国产麻豆婷婷| 91免费国产在线| 精品国产免费人成电影在线观看四季 | 免费欧美日韩国产三级电影| 成人性视频免费网站| 91精品国产欧美一区二区| 亚洲欧洲精品天堂一级| 日本成人超碰在线观看| 99免费精品视频| 精品粉嫩超白一线天av| 一区二区三区蜜桃| 国产精品综合在线视频| 欧美日韩一区二区欧美激情| 欧美激情一区二区三区在线| 天天综合色天天| 色婷婷综合久久久中文字幕| www国产精品av| 亚洲午夜羞羞片| 成人免费毛片app| 日韩女同互慰一区二区| 亚洲高清在线视频| 成人av电影观看| 精品国产91亚洲一区二区三区婷婷| 亚洲成av人影院| 一本色道久久综合亚洲精品按摩| 久久精品男人的天堂| 捆绑调教一区二区三区| 欧美欧美欧美欧美首页| 亚洲精品成人悠悠色影视| 成人黄色综合网站| 国产无遮挡一区二区三区毛片日本| 蜜桃视频第一区免费观看| 欧美日韩在线综合| 一区二区三区在线视频免费| 91在线视频观看| 国产精品青草久久| 99久久久国产精品| 国产精品亲子乱子伦xxxx裸| 国产精品一区二区免费不卡| 精品国产成人在线影院 | 一区二区三区加勒比av| 色综合一区二区三区| 亚洲日穴在线视频| 在线观看日韩电影| 午夜国产精品影院在线观看|