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

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

?? finderpattern.java

?? QRcode二維碼生成源代碼,一個做條形碼的代碼
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
package jp.sourceforge.qrcode.codec.reader.pattern;


import jp.sourceforge.qrcode.codec.reader.*;
import jp.sourceforge.qrcode.codec.exception.FinderPatternNotFoundException;
import jp.sourceforge.qrcode.codec.exception.InvalidVersionInformationException;
import jp.sourceforge.qrcode.codec.exception.UnsupportedVersionException;
import jp.sourceforge.qrcode.codec.exception.VersionInformationException;
import jp.sourceforge.qrcode.codec.geom.*;

import java.util.*;
import jp.sourceforge.qrcode.codec.util.*;

public class FinderPattern {
	public static final int UL = 0;
	public static final int UR = 1;
	public static final int DL = 2;
	static final int[] VersionInfoBit = {
			0x07C94,0x085BC,0x09A99,0x0A4D3,0x0BBF6,0x0C762,0x0D847,
			0x0E60D,0x0F928,0x10B78,0x1145D,0x12A17,0x13532,0x149A6,
			0x15683,0x168C9,0x177EC,0x18EC4,0x191E1,0x1AFAB,0x1B08E,
			0x1CC1A,0x1D33F,0x1ED75,0x1F250,0x209D5,0x216F0,0x228BA,
			0x2379F,0x24B0B,0x2542E,0x26A64,0x27541,0x28C69
	};
	
	static DebugCanvas canvas = DebugCanvas.getCanvas();
	Point[] center;
	int version;
	int[] sincos;
	int[] width;
	int moduleSize;
	
	public static FinderPattern findFinderPattern(boolean[][] image)
			throws FinderPatternNotFoundException,
			VersionInformationException {
		Line[] lineAcross = findLineAcross(image);
		Line[] lineCross = findLineCross(lineAcross);
		Point[] center = null;
		try {
			center = getCenter(lineCross);
		} catch (FinderPatternNotFoundException e) {
			throw e;
			//e.printStackTrace();
		}
//		if (center == null)
//			return new FinderPattern (center, 0, new int[2], new int[3], 0);
		int[] sincos = getAngle(center);
		center = sort(center, sincos);
		int[] width = getWidth(image, center, sincos);
		int[] moduleSize = {(width[UR] << QRCodeImageReader.DECIMAL_POINT) / 7,(width[DL] << QRCodeImageReader.DECIMAL_POINT) / 7};
		int version = calcRoughVersion(center, width);
		if (version > 6) {
			try {
				version = calcExactVersion(center, sincos, moduleSize, image);
			} catch (VersionInformationException e) {
				throw e;
			}
		}
		return new FinderPattern (center, version, sincos, width, moduleSize[0]);
	}
	
	FinderPattern (Point[] center, int version, int[] sincos, int[] width, int moduleSize) {
		this.center = center;
		this.version = version;
		this.sincos = sincos;
		this.width = width;
		this.moduleSize = moduleSize;
	}
	
	public Point[] getCenter() {
		return center;
	}
	
	public Point getCenter(int position) {
		if (position >= UL && position <= DL)
			return center[position];	
		else
			return null;
	}
	
	public int getWidth(int position) {
		return width[position];
	}
	
	public int[] getAngle() {
		return sincos;
	}
	
	public int getVersion() {
		return version;
	}
	
	public int getModuleSize() {
		return moduleSize;
	}
	public int getSqrtNumModules() {
		return 17 + 4 * version;
	}
	
	/*
	 * 埵抲梫慺専弌僷僞乕儞傪専弌偡傞偨傔偵丄(埫:柧:埫:柧:埫)=(1:1:3:1:1)偺
	 * 僷僞乕儞偵堦抳偡傞嬫娫傪慄暘偲偟偰拪弌偡傞丅
	 * 拲堄丗埵抲梫慺僷僞乕儞傪墶愗傜側偄晹暘偑拪弌偝傟傞偙偲傕偁傞
	 */
	static Line[] findLineAcross(boolean[][] image) {
		final int READ_HORIZONTAL = 0;
		final int READ_VERTICAL = 1;

		int imageWidth = image.length;
		int imageHeight = image[0].length;

		//int currentX = 0, currentY = 0;
		Point current = new Point();
		Vector lineAcross = new Vector();
		
		//捈嬤偺丄摨偠怓偱楢懕偟偨梫慺偺挿偝
		int[] lengthBuffer = new int[5];
		int  bufferPointer = 0;
		
		int direction = READ_HORIZONTAL; //暯峴曽岦偐傜撉傒巒傔傞
		boolean lastElement = QRCodeImageReader.POINT_LIGHT;
	
		while(true) {
			//梫慺僠僃僢僋
			boolean currentElement = image[current.getX()][current.getY()];
			if (currentElement == lastElement) { //慜夞偺梫慺偲摨偠
				lengthBuffer[bufferPointer]++;
			}
			else { //慜夞偺梫慺偲堘偆
				if (currentElement == QRCodeImageReader.POINT_LIGHT) {
					if (checkPattern(lengthBuffer, bufferPointer)) { //僷僞乕儞傪専弌偟偨傜
						int x1, y1, x2, y2;
						if (direction == READ_HORIZONTAL) {
							//僷僞乕儞岓曗偺椉抂偺x嵗昗傪媮傔傞
							//嵍抂偼尰嵼偺梫慺偺x嵗昗偲僶僢僼傽偺挿偝偺榓偐傜嶼弌
							x1 = current.getX(); 
							for (int j = 0; j < 5; j++) {
								x1 -= lengthBuffer[j];
							}
							x2 = current.getX() - 1; //塃抂偼捈慜偺梫慺偺x嵗昗
							y1 = y2 = current.getY();
						}
						else {
							x1 = x2 = current.getX();
							//僷僞乕儞岓曗偺椉抂偺y嵗昗傪媮傔傞
							//嵍抂偼尰嵼偺梫慺偺y嵗昗偲僶僢僼傽偺挿偝偺榓偐傜嶼弌
							y1 = current.getY(); 
							for (int j = 0; j < 5; j++) {
								y1 -= lengthBuffer[j];
							}
							y2 = current.getY() - 1; //塃抂偼捈慜偺梫慺偺y嵗昗
						}
						lineAcross.addElement(new Line(x1, y1, x2, y2));
					}
				}
				bufferPointer = (bufferPointer + 1) % 5; 
				lengthBuffer[bufferPointer] = 1;
				lastElement = !lastElement;
			}
			
			//師傪撉傓 or 撉傒庢傝曽岦揮姺 or 儖乕僾廔椆 敾掕
			if (direction == READ_HORIZONTAL) { //X幉曽岦撉傒崬傒拞
				if (current.getX() < imageWidth - 1) {
					current.translate(1, 0);
				}
				else if (current.getY() < imageHeight - 1) {
					current.set(0, current.getY() + 1);
					lengthBuffer =  new int[5];
				}
				else {
					current.set(0, 0); //撉傒崬傒揰傪儕僙僢僩偟
					lengthBuffer =  new int[5];
					direction = READ_VERTICAL; //師偼Y幉曽岦偵撉傒巒傔傞
				}
			}
			else { //Y幉曽岦撉傒崬傒拞
				if (current.getY() < imageHeight - 1)
					current.translate(0, 1);
				else if (current.getX() < imageWidth - 1) {
					current.set(current.getX() + 1, 0);
					lengthBuffer = new int[5];
				}
				else {
					break;
				}
			}
		}
		
		Line[] foundLines = new Line[lineAcross.size()];

		for (int i = 0; i < foundLines.length; i++)
			foundLines[i] = (Line) lineAcross.elementAt(i);
		
		canvas.drawLines(foundLines,Color.LIGHTGREEN);
		return foundLines;
	}
	
	static boolean checkPattern(int[] buffer, int pointer) {
		final int[] modelRatio = {1, 1, 3, 1, 1};	

		int baselength = 0;
		for (int i = 0; i < 5; i++) {
			baselength += buffer[i];
		}
		baselength <<= QRCodeImageReader.DECIMAL_POINT; //娵傔岆嵎傪尭傜偡偨傔偵4098攞偡傞
		baselength /= 7;
		int i;
		for  (i = 0; i < 5; i++) {
			int leastlength = baselength * modelRatio[i] - baselength / 2;
			int mostlength = baselength * modelRatio[i] + baselength / 2;
			
			//FIXME 帋尡揑偵忦審傪娒偔偡傞
			leastlength -= baselength / 8;
			mostlength += baselength / 8;
			
			int targetlength = buffer[(pointer + i + 1) % 5] << QRCodeImageReader.DECIMAL_POINT;
			if (targetlength < leastlength || targetlength > mostlength) {
				return false;
			}
		}
		return true;
	}

	
	//埵抲梫慺専弌僷僞乕儞偺拞怱傪捠傝丄屳偄偵岎嵎偟偰偄傞偲巚傢傟傞慄暘傪摼傞
	static Line[] findLineCross(Line[] lineAcross) {
		Vector crossLines = new Vector();
		Vector lineNeighbor = new Vector();
		Vector lineCandidate = new Vector();
		Line compareLine;
		for (int i = 0; i < lineAcross.length; i++)
			lineCandidate.addElement(lineAcross[i]);
		
		for (int i = 0; i < lineCandidate.size() - 1; i++) {
			lineNeighbor.removeAllElements();
			lineNeighbor.addElement(lineCandidate.elementAt(i));
			for (int j = i + 1; j < lineCandidate.size(); j++) {
				if (Line.isNeighbor((Line)lineNeighbor.lastElement(), (Line)lineCandidate.elementAt(j))) {
					lineNeighbor.addElement(lineCandidate.elementAt(j));
					compareLine = (Line)lineNeighbor.lastElement();
					if (lineNeighbor.size() * 5 > compareLine.getLength() &&
							j == lineCandidate.size() - 1) {
						crossLines.addElement(lineNeighbor.elementAt(lineNeighbor.size() / 2));
						for (int k = 0; k < lineNeighbor.size(); k++)
							lineCandidate.removeElement(lineNeighbor.elementAt(k));
					}
				}
				//偙傟埲忋挷傋偰傕椬傝崌偆Line偑尒偮偐傞壜擻惈偑側偄応崌偼斾妑懪偪愗傝
				else if (cantNeighbor((Line)lineNeighbor.lastElement(), (Line)lineCandidate.elementAt(j)) ||
					(j == lineCandidate.size() - 1)) {
					compareLine = (Line)lineNeighbor.lastElement();
					//椬傝崌偭偨慄暘摨巑偺暆偑偦傟傪峔惉偡傞慄暘偺挿偝偺
					//1/6埲忋偩偭偨傜丄埵抲梫慺専弌僷僞乕儞傪墶愗偭偰偄傞偲敾抐偡傞					
					if (lineNeighbor.size() * 6 > compareLine.getLength()) {
						crossLines.addElement(lineNeighbor.elementAt(lineNeighbor.size() / 2));
						for (int k = 0; k < lineNeighbor.size(); k++) {
							lineCandidate.removeElement(lineNeighbor.elementAt(k));
						}
					}
					break;
				}
			}
		}	

		Line[] foundLines = new Line[crossLines.size()];
		for (int i = 0; i < foundLines.length; i++) {
			foundLines[i] = (Line) crossLines.elementAt(i);
		}
		return foundLines;
	}
	
	static boolean cantNeighbor(Line line1, Line line2) {
		if (Line.isCross(line1, line2))
			return true;

		if (line1.isHorizontal()) {
			if (Math.abs(line1.getP1().getY() - line2.getP1().getY()) > 1)
				return true;
			else
				return false;
		} 
		else {
			if (Math.abs(line1.getP1().getX() - line2.getP1().getX()) > 1)
				return true;
			else
				return false;
			
		}
	}
	
	//僔儞儃儖偺孹幬妏搙傪媮傔傞
	static int[] getAngle(Point[] centers) {

		Line[] additionalLine = new Line[3];

		for (int i = 0; i < additionalLine.length; i++) {
			additionalLine[i] = new Line(centers[i],
					centers[(i + 1) % additionalLine.length]);
		}
		Line longestLine = Line.getLongest(additionalLine);
		Point originPoint = new Point();
		for (int i = 0; i < centers.length; i++) {
			if ((centers[i].getX() != longestLine.getP1().getX() ||
					centers[i].getY() != longestLine.getP1().getY()) &
					(centers[i].getX() != longestLine.getP2().getX() ||
					centers[i].getY() != longestLine.getP2().getY())) {
				originPoint = centers[i];
				break;
			}
		}
		Point remotePoint = new Point();


		//嵍忋偺僷僞乕儞拞怱揰傪尨揰偲偟偰丄懠偺2僷僞乕儞偺拞怱揰偑偳偙偵偁傞偐
		//偍傛傃丄妏搙寁應偺懳徾偲側傞揰偼偦傟傜偺偆偪偳偪傜偐
		if (originPoint.getY() <= longestLine.getP1().getY() & //戞1傑偨偼戞2徾尷
				originPoint.getY() <= longestLine.getP2().getY())
			if (longestLine.getP1().getX() < longestLine.getP2().getX())
				remotePoint = longestLine.getP2();
			else
				remotePoint = longestLine.getP1();
		else if (originPoint.getX() >= longestLine.getP1().getX() & //戞2傑偨偼戞3徾尷
				originPoint.getX() >= longestLine.getP2().getX())
			if (longestLine.getP1().getY() < longestLine.getP2().getY())
				remotePoint = longestLine.getP2();
			else
				remotePoint = longestLine.getP1();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区二区三区在线| 欧美日韩一区久久| 91蜜桃在线观看| 91精品国产高清一区二区三区蜜臀 | 国产传媒久久文化传媒| 欧美午夜精品一区二区蜜桃 | 国产成人精品一区二区三区四区 | 欧美一区二区三区免费在线看| 国产欧美日韩视频在线观看| 日韩电影在线一区| 色哟哟在线观看一区二区三区| 2022国产精品视频| 亚洲3atv精品一区二区三区| 色综合欧美在线| 国产精品视频第一区| 国内精品写真在线观看| 欧美日韩国产综合久久| 亚洲欧洲精品一区二区三区不卡| 精品一区二区精品| 日韩欧美一二三四区| 日产精品久久久久久久性色| 色婷婷久久久亚洲一区二区三区| 久久奇米777| 国产美女在线观看一区| 欧美成人乱码一区二区三区| 日韩电影免费一区| 欧美男女性生活在线直播观看| 亚洲女同一区二区| 91啪亚洲精品| 亚洲午夜免费福利视频| 91久久香蕉国产日韩欧美9色| 中文字幕制服丝袜成人av| 成人自拍视频在线| 中文字幕在线观看一区| 成人久久视频在线观看| 亚洲欧洲av在线| 91欧美激情一区二区三区成人| 自拍偷拍亚洲综合| 欧美天堂亚洲电影院在线播放| 亚洲一二三专区| 欧美军同video69gay| 日本欧美在线看| 久久网站最新地址| 国产99久久久久久免费看农村| 日本一区二区免费在线观看视频| 国产成人av一区二区| 亚洲欧洲三级电影| 欧美性感一区二区三区| 欧美aaaaa成人免费观看视频| 欧美一区二区三区四区在线观看 | 亚洲chinese男男1069| 欧美区一区二区三区| 久久99久久精品| 国产精品传媒在线| 色婷婷av一区二区三区软件 | 午夜视频一区在线观看| 精品久久久久久久人人人人传媒 | 日韩有码一区二区三区| www国产亚洲精品久久麻豆| 成人免费高清视频| 亚洲日本电影在线| 在线成人高清不卡| 国产馆精品极品| 日韩理论片一区二区| 欧美二区乱c少妇| 国产在线国偷精品免费看| 亚洲欧洲成人精品av97| 日韩女优制服丝袜电影| 99视频一区二区三区| 免费欧美在线视频| 亚洲欧洲三级电影| 日韩精品一区二区三区四区| av电影在线观看一区| 免费一级片91| 亚洲欧美自拍偷拍色图| 精品久久久久久无| 91久久国产最好的精华液| 捆绑变态av一区二区三区| 亚洲天堂网中文字| 久久蜜桃一区二区| 欧美精品在线一区二区三区| 国产成人av电影在线| 日韩精品1区2区3区| 亚洲女同ⅹxx女同tv| 久久久不卡网国产精品二区| 欧美色图在线观看| 成人黄色软件下载| 国精产品一区一区三区mba桃花| 亚洲一区二区在线视频| 国产欧美精品日韩区二区麻豆天美| 欧美日韩精品免费观看视频| fc2成人免费人成在线观看播放| 日韩不卡一区二区| 亚洲影视在线播放| 国产精品免费人成网站| 国产亚洲精品7777| 日韩三级精品电影久久久| 91久久一区二区| 99久久精品国产麻豆演员表| 国产精品一区免费视频| 美脚の诱脚舐め脚责91| 亚瑟在线精品视频| 亚洲gay无套男同| 亚洲无人区一区| 一区二区视频在线| 亚洲日本乱码在线观看| 成人欧美一区二区三区| 国产精品成人一区二区三区夜夜夜| 久久综合九色综合久久久精品综合| 91精品国产麻豆国产自产在线| 欧美日本免费一区二区三区| 欧美日韩免费不卡视频一区二区三区| 色综合视频一区二区三区高清| 99精品国产视频| 97久久精品人人做人人爽50路| 成人97人人超碰人人99| 成人av手机在线观看| 成人激情小说网站| 91蜜桃网址入口| 色婷婷一区二区| 欧美日韩一卡二卡| 正在播放亚洲一区| 日韩欧美国产三级电影视频| 91精品国产综合久久精品| 日韩欧美一区在线观看| 久久综合99re88久久爱| 国产精品污网站| 亚洲精品五月天| 亚洲成av人片| 久久av中文字幕片| 国产98色在线|日韩| 色综合久久久久久久| 欧洲日韩一区二区三区| 91精品国产91久久综合桃花| 日韩一级片网站| 国产亚洲一本大道中文在线| 中文字幕一区二区三区不卡在线| 洋洋成人永久网站入口| 久色婷婷小香蕉久久| 成人网在线免费视频| 91成人网在线| 日韩一区二区视频| 国产精品天美传媒沈樵| 一区二区高清在线| 麻豆久久一区二区| 成人v精品蜜桃久久一区| 欧美性猛片xxxx免费看久爱| 日韩免费看的电影| 中文字幕制服丝袜成人av| 调教+趴+乳夹+国产+精品| 国产综合色精品一区二区三区| 99riav久久精品riav| 91精品国产色综合久久ai换脸| 久久先锋影音av鲁色资源| 亚洲欧美另类久久久精品| 久久99精品久久久久久国产越南| 91在线云播放| 欧美va亚洲va在线观看蝴蝶网| 国产精品卡一卡二卡三| 久久精品99国产精品| 色一情一乱一乱一91av| 精品国产一区二区三区久久久蜜月| 国产精品无圣光一区二区| 免费人成在线不卡| 欧美综合视频在线观看| 久久久久久久久久久黄色| 婷婷国产v国产偷v亚洲高清| 成人伦理片在线| 日韩欧美国产一区二区三区| 亚洲愉拍自拍另类高清精品| 懂色av一区二区三区免费观看| 91精品午夜视频| 亚洲精品大片www| 成人手机在线视频| 精品国产第一区二区三区观看体验| 亚洲综合免费观看高清完整版| 国产不卡一区视频| 久久久久久久国产精品影院| 天堂在线亚洲视频| 一本一本大道香蕉久在线精品| 国产日韩欧美一区二区三区综合| 日韩国产在线观看一区| 日本韩国欧美一区二区三区| 欧美国产精品中文字幕| 国模少妇一区二区三区| 日韩精品一区在线观看| 日韩高清不卡在线| 欧美军同video69gay| 亚洲成人av一区| 欧美亚洲国产一区二区三区va | 91精品国产一区二区人妖| 亚洲午夜日本在线观看| 91豆麻精品91久久久久久| 成人免费在线视频观看| 99精品久久99久久久久| 国产精品传媒视频| 99久久精品国产网站| 亚洲视频免费观看| 一本久道久久综合中文字幕| 中文字幕一区二区不卡 |