更新
This commit is contained in:
+118
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
Ported to JavaScript by Lazar Laszlo 2011
|
||||
|
||||
lazarsoft@gmail.com, www.lazarsoft.info
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright 2007 ZXing authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import BitMatrix from './bitmat';
|
||||
|
||||
var GridSampler = {};
|
||||
|
||||
GridSampler.checkAndNudgePoints = function(image, points) {
|
||||
var width = image.width;
|
||||
var height = image.height;
|
||||
// Check and nudge points from start until we see some that are OK:
|
||||
var nudged = true;
|
||||
for (var offset = 0; offset < points.length && nudged; offset += 2) {
|
||||
var x = Math.floor(points[offset]);
|
||||
var y = Math.floor(points[offset + 1]);
|
||||
if (x < -1 || x > width || y < -1 || y > height) {
|
||||
throw "Error.checkAndNudgePoints ";
|
||||
}
|
||||
nudged = false;
|
||||
if (x == -1) {
|
||||
points[offset] = 0.0;
|
||||
nudged = true;
|
||||
} else if (x == width) {
|
||||
points[offset] = width - 1;
|
||||
nudged = true;
|
||||
}
|
||||
if (y == -1) {
|
||||
points[offset + 1] = 0.0;
|
||||
nudged = true;
|
||||
} else if (y == height) {
|
||||
points[offset + 1] = height - 1;
|
||||
nudged = true;
|
||||
}
|
||||
}
|
||||
// Check and nudge points from end:
|
||||
nudged = true;
|
||||
for (var offset = points.length - 2; offset >= 0 && nudged; offset -= 2) {
|
||||
var x = Math.floor(points[offset]);
|
||||
var y = Math.floor(points[offset + 1]);
|
||||
if (x < -1 || x > width || y < -1 || y > height) {
|
||||
throw "Error.checkAndNudgePoints ";
|
||||
}
|
||||
nudged = false;
|
||||
if (x == -1) {
|
||||
points[offset] = 0.0;
|
||||
nudged = true;
|
||||
} else if (x == width) {
|
||||
points[offset] = width - 1;
|
||||
nudged = true;
|
||||
}
|
||||
if (y == -1) {
|
||||
points[offset + 1] = 0.0;
|
||||
nudged = true;
|
||||
} else if (y == height) {
|
||||
points[offset + 1] = height - 1;
|
||||
nudged = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
GridSampler.sampleGrid3 = function(image, dimension, transform) {
|
||||
var bits = new BitMatrix(dimension);
|
||||
var points = new Array(dimension << 1);
|
||||
for (var y = 0; y < dimension; y++) {
|
||||
var max = points.length;
|
||||
var iValue = y + 0.5;
|
||||
for (var x = 0; x < max; x += 2) {
|
||||
points[x] = (x >> 1) + 0.5;
|
||||
points[x + 1] = iValue;
|
||||
}
|
||||
transform.transformPoints1(points);
|
||||
// Quick check to see if points transformed to something inside the image
|
||||
// sufficient to check the endpoints
|
||||
GridSampler.checkAndNudgePoints(image, points);
|
||||
try {
|
||||
for (var x = 0; x < max; x += 2) {
|
||||
var bit = image.data[Math.floor(points[x]) + image.width * Math.floor(points[x + 1])];
|
||||
if (bit)
|
||||
bits.set_Renamed(x >> 1, y);
|
||||
}
|
||||
} catch (aioobe) {
|
||||
// This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting
|
||||
// transform gets "twisted" such that it maps a straight line of points to a set of points
|
||||
// whose endpoints are in bounds, but others are not. There is probably some mathematical
|
||||
// way to detect this about the transformation that I don't know yet.
|
||||
// This results in an ugly runtime exception despite our clever checks above -- can't have
|
||||
// that. We could check each point's coordinates but that feels duplicative. We settle for
|
||||
// catching and wrapping ArrayIndexOutOfBoundsException.
|
||||
throw "Error.checkAndNudgePoints";
|
||||
}
|
||||
}
|
||||
return bits;
|
||||
};
|
||||
|
||||
export default GridSampler;
|
||||
Reference in New Issue
Block a user