id-scanner-lib 1.6.6 → 1.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/id-scanner-lib.js
CHANGED
|
@@ -1724,17 +1724,32 @@
|
|
|
1724
1724
|
outputData[pos + 3] = data[pos + 3]; // 保持透明度不变
|
|
1725
1725
|
}
|
|
1726
1726
|
}
|
|
1727
|
-
//
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1727
|
+
// 处理边缘像素(仅遍历四条边,而非全图 O(width×height) → O(width+height))
|
|
1728
|
+
// 上边 + 下边
|
|
1729
|
+
for (let x = 0; x < width; x++) {
|
|
1730
|
+
const topPos = x * 4;
|
|
1731
|
+
const bottomPos = ((height - 1) * width + x) * 4;
|
|
1732
|
+
outputData[topPos] = data[topPos];
|
|
1733
|
+
outputData[topPos + 1] = data[topPos + 1];
|
|
1734
|
+
outputData[topPos + 2] = data[topPos + 2];
|
|
1735
|
+
outputData[topPos + 3] = data[topPos + 3];
|
|
1736
|
+
outputData[bottomPos] = data[bottomPos];
|
|
1737
|
+
outputData[bottomPos + 1] = data[bottomPos + 1];
|
|
1738
|
+
outputData[bottomPos + 2] = data[bottomPos + 2];
|
|
1739
|
+
outputData[bottomPos + 3] = data[bottomPos + 3];
|
|
1740
|
+
}
|
|
1741
|
+
// 左边 + 右边(排除四角,它们已在上下一行处理)
|
|
1742
|
+
for (let y = 1; y < height - 1; y++) {
|
|
1743
|
+
const leftPos = y * width * 4;
|
|
1744
|
+
const rightPos = (y * width + width - 1) * 4;
|
|
1745
|
+
outputData[leftPos] = data[leftPos];
|
|
1746
|
+
outputData[leftPos + 1] = data[leftPos + 1];
|
|
1747
|
+
outputData[leftPos + 2] = data[leftPos + 2];
|
|
1748
|
+
outputData[leftPos + 3] = data[leftPos + 3];
|
|
1749
|
+
outputData[rightPos] = data[rightPos];
|
|
1750
|
+
outputData[rightPos + 1] = data[rightPos + 1];
|
|
1751
|
+
outputData[rightPos + 2] = data[rightPos + 2];
|
|
1752
|
+
outputData[rightPos + 3] = data[rightPos + 3];
|
|
1738
1753
|
}
|
|
1739
1754
|
// 创建新的ImageData对象
|
|
1740
1755
|
return new ImageData(outputData, width, height);
|
|
@@ -1747,11 +1762,10 @@
|
|
|
1747
1762
|
* @returns 处理后的图像数据
|
|
1748
1763
|
*/
|
|
1749
1764
|
static threshold(imageData, threshold = 128) {
|
|
1750
|
-
//
|
|
1751
|
-
const grayscaleImage = this.toGrayscale(
|
|
1765
|
+
// 先转换为灰度图(toGrayscale 内部已创建新 ImageData,无需外部拷贝)
|
|
1766
|
+
const grayscaleImage = this.toGrayscale(imageData);
|
|
1752
1767
|
const data = grayscaleImage.data;
|
|
1753
|
-
|
|
1754
|
-
for (let i = 0; i < length; i += 4) {
|
|
1768
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
1755
1769
|
// 二值化处理
|
|
1756
1770
|
const value = data[i] < threshold ? 0 : 255;
|
|
1757
1771
|
data[i] = data[i + 1] = data[i + 2] = value;
|
|
@@ -1765,8 +1779,8 @@
|
|
|
1765
1779
|
* @returns 二值化后的图像数据
|
|
1766
1780
|
*/
|
|
1767
1781
|
static toBinaryImage(imageData) {
|
|
1768
|
-
//
|
|
1769
|
-
const grayscaleImage = this.toGrayscale(
|
|
1782
|
+
// 先转换为灰度图(toGrayscale 内部已创建新 ImageData,无需外部拷贝)
|
|
1783
|
+
const grayscaleImage = this.toGrayscale(imageData);
|
|
1770
1784
|
// 使用OTSU算法自动确定阈值
|
|
1771
1785
|
const threshold = this.getOtsuThreshold(grayscaleImage);
|
|
1772
1786
|
return this.threshold(grayscaleImage, threshold);
|
|
@@ -1779,8 +1793,9 @@
|
|
|
1779
1793
|
*/
|
|
1780
1794
|
static getOtsuThreshold(imageData) {
|
|
1781
1795
|
const data = imageData.data;
|
|
1782
|
-
|
|
1783
|
-
|
|
1796
|
+
// 使用 Uint8Array 替代 Array<number>,避免 boxing 开销,提升直方图统计性能
|
|
1797
|
+
const histogram = new Uint32Array(256);
|
|
1798
|
+
// 统计灰度直方图(每4字节取R通道,即灰度值)
|
|
1784
1799
|
for (let i = 0; i < data.length; i += 4) {
|
|
1785
1800
|
histogram[data[i]]++;
|
|
1786
1801
|
}
|