package jp.sourceforge.qrcode.codec.reader;
import jp.sourceforge.qrcode.codec.data.*;
import jp.sourceforge.qrcode.codec.exception.AlignmentPatternEdgeNotFoundException;
import jp.sourceforge.qrcode.codec.exception.FinderPatternNotFoundException;
import jp.sourceforge.qrcode.codec.exception.VersionInformationException;
import jp.sourceforge.qrcode.codec.geom.*;
import jp.sourceforge.qrcode.codec.reader.pattern.*;
import jp.sourceforge.qrcode.codec.util.*;
public class QRCodeImageReader {
DebugCanvas canvas;
//boolean[][] image;
//DP =
//23 ... max 255
//22 .. max 511
//21 .. max 1023
public static int DECIMAL_POINT = 22;
public static final boolean POINT_DARK = true;
public static final boolean POINT_LIGHT = false;
//int numModuleAtSide; //デコード対象のシンボルにおける一辺のモジュールの数
public QRCodeImageReader() {
//this.image = image;
this.canvas = DebugCanvas.getCanvas();
}
boolean[][] applyMedianFilter(boolean[][] image, int threshold, int internalScale) {//threshold,耙ヨオ
boolean[][] filteredMatrix = new boolean[image.length][image[0].length];
//ノイズフィルタ(メディアンフィルタ)
int numPointDark;
for (int y = internalScale; y < image[0].length - internalScale; y+=internalScale) {
for (int x = internalScale; x < image.length - internalScale; x+=internalScale) {
//if (image[x][y] == true) {
numPointDark = 0;
for (int fy = -internalScale; fy < internalScale + 1; fy+=internalScale) {
for (int fx = -internalScale; fx < internalScale + 1; fx+=internalScale) {
if (image[x + fx][y + fy] == true) {
numPointDark++;
}
}
}
if (numPointDark > threshold) {
for (int dy = 0; dy < internalScale; dy++)
for (int dx = 0; dx < internalScale; dx++)
filteredMatrix[x + dx][y + dy] = POINT_DARK;
}
//}
}
}
return filteredMatrix;
}
public QRCodeSymbol getQRCodeSymbol(boolean[][] image, int internalScale)
throws FinderPatternNotFoundException ,
VersionInformationException ,
AlignmentPatternEdgeNotFoundException {
int longSide = (image.length < image[0].length) ? image[0].length : image.length;
// if (longSide < 255)
QRCodeImageReader.DECIMAL_POINT = 23 - QRCodeUtility.sqrt(longSide / 256);
canvas.println("Drawing matrix.");
canvas.drawMatrix(image);
//for(int i = 0; i < 500000; i++) System.out.println("");
canvas.println("Scanning Finder Pattern.");
FinderPattern finderPattern = null;
try {
finderPattern = FinderPattern.findFinderPattern(image);
} catch (FinderPatternNotFoundException e) {
canvas.println("Not found, now retrying...");
image = applyMedianFilter(image, 5, internalScale);
canvas.drawMatrix(image);
try {
finderPattern = FinderPattern.findFinderPattern(image);
} catch (FinderPatternNotFoundException e2) {
e2.printStackTrace();
throw e2;
} catch (VersionInformationException e3) {
throw e3;
}
// if (finderPattern.getCenter() == null) {
// canvas.println("ERROR: Finder pattern not found");
// }
} catch (VersionInformationException e4) {
throw e4;
}
canvas.println("FinderPattern at");
String finderPatternCoordinates =
finderPattern.getCenter(FinderPattern.UL).toString() +
finderPattern.getCenter(FinderPattern.UR).toString() +
finderPattern.getCenter(FinderPattern.DL).toString();
canvas.println(finderPatternCoordinates);
int[] sincos = finderPattern.getAngle();
canvas.println("Angle*4098: Sin " + Integer.toString(sincos[0]) + " " + "Cos " + Integer.toString(sincos[1]));
Line[][][][] samplingGrid = new Line[1][1][1][1];
int version = finderPattern.getVersion();
canvas.println("Version: " + Integer.toString(version));
AlignmentPattern alignmentPattern = null;
if (version > 1) {
try {
alignmentPattern = AlignmentPattern.findAlignmentPattern(image, finderPattern);
} catch (AlignmentPatternEdgeNotFoundException e) {
e.printStackTrace();
throw e;
}
int matrixLength = alignmentPattern.getCenter().length;
canvas.println("AlignmentPatterns at");
for (int y = 0; y < matrixLength; y++) {
String alignmentPatternCoordinates = "";
for (int x = 0; x < matrixLength; x++) {
alignmentPatternCoordinates += alignmentPattern.getCenter()[x][y].toString();
}
canvas.println(alignmentPatternCoordinates);
}
}
//for(int i = 0; i < 500000; i++) System.out.println("");
canvas.println("Creating sampling grid.");
//[TODO] need all-purpose method
if (version == 1)
samplingGrid = getSamplingGrid1(finderPattern);
else if (version >= 2 && version <= 6)
samplingGrid = getSamplingGrid2_6(finderPattern, alignmentPattern);
else if (version >= 7 && version <= 13)
samplingGrid = getSamplingGrid7_13(finderPattern, alignmentPattern);
// else if (version >= 14 && version <= 20)
// samplingGrid = getSamplingGrid14_20(finderPattern, alignmentPattern);
canvas.println("Reading grid.");
boolean[][] qRCodeMatrix = getQRCodeMatrix(image, samplingGrid);
//canvas.drawMatrix(qRCodeMatrix, 5);
return new QRCodeSymbol(qRCodeMatrix);
}
//位置合せパターンがない型番1専用
Line[][][][] getSamplingGrid1(FinderPattern finderPattern) {
int sqrtNumArea = 1;
int sqrtNumModules = finderPattern.getSqrtNumModules(); //一辺当たりのモジュール数を得る
int sqrtNumAreaModules = sqrtNumModules / sqrtNumArea;
Point[] centers = finderPattern.getCenter();
int logicalDistance = 14;
Line[][][][] samplingGrid = new Line[sqrtNumArea][sqrtNumArea][2][sqrtNumAreaModules];
Line baseLineX, baseLineY, gridLineX, gridLineY;
//モジュールピッチを得る
int[] modulePitch = new int[2]; //up left の順に格納
modulePitch[0] = getAreaModulePitch(centers[0], centers[1], logicalDistance);
modulePitch[1] = getAreaModulePitch(centers[0], centers[2], logicalDistance);
//X軸に垂直の基線(一般に縦)
baseLineX = new Line(
finderPattern.getCenter(FinderPattern.UL),
finderPattern.getCenter(FinderPattern.DL));
int sin = finderPattern.getAngle()[0];
int cos = finderPattern.getAngle()[1];
Axis axis = new Axis(sin, cos, modulePitch[0]);
axis.setOrigin(baseLineX.getP1());
baseLineX.setP1(axis.translate(-3, -3));
axis.setModulePitch(modulePitch[1]);
axis.setOrigin(baseLineX.getP2());
baseLineX.setP2(axis.translate(-3, 3));
//Y軸に垂直の基線(一般に横)
baseLineY =
new Line(finderPattern.getCenter(FinderPattern.UL),
finderPattern.getCenter(FinderPattern.UR));
axis.setModulePitch(modulePitch[1]);
axis.setOrigin(baseLineY.getP1());
baseLineY.setP1(axis.translate(-3, -3));
axis.setModulePitch(modulePitch[1]);
axis.setOrigin(baseLineY.getP2());
baseLineY.setP2(axis.translate(3, -3));
baseLineX.translate(1,1);
baseLineY.translate(1,1);
for (int i = 0; i < sqrtNumAreaModules; i++) {
gridLineX = new Line(baseLineX.getP1(), baseLineX.getP2());
axis.setOrigin(gridLineX.getP1());
axis.setModulePitch(modulePitch[0]);
gridLineX.setP1(axis.translate(i,0));
axis.setOrigin(gridLineX.getP2());
axis.setModulePitch(modulePitch[0]);
gridLineX.setP2(axis.translate(i,0));
gridLineY = new Line(baseLineY.getP1(), baseLineY.getP2());
axis.setOrigin(gridLineY.getP1());
axis.setModulePitch(modulePitch[1]);
gridLineY.setP1(axis.translate(0,i));
axis.setOrigin(gridLineY.getP2());
axis.setModulePitch(modulePitch[1]);
gridLineY.setP2(axis.translate(0,i));
samplingGrid[0][0][0][i] = gridLineX;
samplingGrid[0][0][1][i] = gridLineY;
}
for (int ay = 0; ay < samplingGrid[0].length; ay++) {
for (int ax = 0; ax < samplingGrid.length; ax++) {
canvas.drawLines(samplingGrid[ax][ay][0], Color.LIGHTBLUE);
canvas.drawLines(samplingGrid[ax][ay][1
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java的QR解码项目源码程序
共50个文件
java:25个
class:25个
需积分: 0 0 下载量 183 浏览量
2023-06-07
11:37:57
上传
评论
收藏 82KB RAR 举报
温馨提示
基于Java的QR解码项目源码程序
资源推荐
资源详情
资源评论
收起资源包目录
基于Java的QR解码项目源码程序.rar (50个子文件)
基于Java的QR解码项目源码程序
codefans.net
codec
QRCodeDecoder.class 12KB
geom
Line.java 4KB
Axis.class 2KB
Point.class 2KB
Point.java 1KB
Axis.java 2KB
Line.class 4KB
data
QRCodeSymbol.java 6KB
QRCodeSymbol.class 5KB
Buffer.java 1KB
Buffer.class 2KB
ecc
BCH15_5.class 4KB
ReedSolomon.java 9KB
ReedSolomon.class 5KB
BCH15_5.java 7KB
QRCodeEncoder.class 320B
exception
InvalidVersionInformationException.java 143B
IllegalDataBlockException.java 128B
AlignmentPatternEdgeNotFoundException.java 140B
SymbolNotFoundException.class 388B
DecodingFailedException.class 385B
SymbolNotFoundException.java 126B
DecodingFailedException.java 123B
InvalidVersionInformationException.class 452B
UnsupportedVersionException.java 133B
AlignmentPatternEdgeNotFoundException.class 430B
VersionInformationException.java 130B
UnsupportedVersionException.class 431B
FinderPatternNotFoundException.java 118B
IllegalDataBlockException.class 394B
VersionInformationException.class 400B
FinderPatternNotFoundException.class 394B
QRCodeEncoder.java 75B
QRCodeDecoder.java 20KB
util
DebugCanvas.java 4KB
ContentConverter.java 2KB
ContentConverter.class 2KB
QRCodeUtility.class 966B
Color.class 417B
Color.java 420B
DebugCanvas.class 2KB
QRCodeUtility.java 959B
reader
QRCodeDataBlockReader.java 10KB
QRCodeDataBlockReader.class 7KB
pattern
AlignmentPattern.java 8KB
FinderPattern.class 13KB
FinderPattern.java 21KB
AlignmentPattern.class 6KB
QRCodeImageReader.java 29KB
QRCodeImageReader.class 12KB
共 50 条
- 1
资源评论
F_D_D_1
- 粉丝: 3
- 资源: 208
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功