scandoc-ai-components 0.0.61 → 0.0.62
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/index.js +68 -31
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -11204,6 +11204,47 @@ class ExtractorVideo {
|
|
|
11204
11204
|
this.unsupportedDocCount = 0;
|
|
11205
11205
|
this.video = null;
|
|
11206
11206
|
}
|
|
11207
|
+
async getCameraMargins() {
|
|
11208
|
+
const video = document.getElementById('ScanDocAIVideoElement');
|
|
11209
|
+
const canvas = document.createElement('canvas');
|
|
11210
|
+
const ctx = canvas.getContext('2d');
|
|
11211
|
+
canvas.width = video.videoWidth;
|
|
11212
|
+
canvas.height = video.videoHeight;
|
|
11213
|
+
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|
11214
|
+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;
|
|
11215
|
+
const isColumnBlack = x => {
|
|
11216
|
+
const threshold = 16;
|
|
11217
|
+
for (let y = 0; y < canvas.height; y++) {
|
|
11218
|
+
const i = (y * canvas.width + x) * 4;
|
|
11219
|
+
const [r, g, b] = [imageData[i], imageData[i + 1], imageData[i + 2]];
|
|
11220
|
+
if (r > threshold || g > threshold || b > threshold) return false;
|
|
11221
|
+
}
|
|
11222
|
+
return true;
|
|
11223
|
+
};
|
|
11224
|
+
const isRowBlack = y => {
|
|
11225
|
+
const threshold = 16;
|
|
11226
|
+
for (let x = 0; x < canvas.width; x++) {
|
|
11227
|
+
const i = (y * canvas.width + x) * 4;
|
|
11228
|
+
const [r, g, b] = [imageData[i], imageData[i + 1], imageData[i + 2]];
|
|
11229
|
+
if (r > threshold || g > threshold || b > threshold) return false;
|
|
11230
|
+
}
|
|
11231
|
+
return true;
|
|
11232
|
+
};
|
|
11233
|
+
let left = 0,
|
|
11234
|
+
right = 0,
|
|
11235
|
+
top = 0,
|
|
11236
|
+
bottom = 0;
|
|
11237
|
+
while (left < canvas.width && isColumnBlack(left)) left++;
|
|
11238
|
+
while (right < canvas.width && isColumnBlack(canvas.width - 1 - right)) right++;
|
|
11239
|
+
while (top < canvas.height && isRowBlack(top)) top++;
|
|
11240
|
+
while (bottom < canvas.height && isRowBlack(canvas.height - 1 - bottom)) bottom++;
|
|
11241
|
+
return {
|
|
11242
|
+
leftPct: left / canvas.width,
|
|
11243
|
+
rightPct: right / canvas.width,
|
|
11244
|
+
topPct: top / canvas.height,
|
|
11245
|
+
bottomPct: bottom / canvas.height
|
|
11246
|
+
};
|
|
11247
|
+
}
|
|
11207
11248
|
async analyzeVideoStream() {
|
|
11208
11249
|
if (!this.isRunning) {
|
|
11209
11250
|
return;
|
|
@@ -11364,6 +11405,17 @@ class ExtractorVideo {
|
|
|
11364
11405
|
await this.video.play().catch(e => {
|
|
11365
11406
|
console.warn(`Error on video play: ${e}`);
|
|
11366
11407
|
});
|
|
11408
|
+
setTimeout(async () => {
|
|
11409
|
+
const margins = await this.getCameraMargins();
|
|
11410
|
+
const rectangle = document.querySelector('.desktopRectangle');
|
|
11411
|
+
if (rectangle) {
|
|
11412
|
+
rectangle.style.top = `${margins.topPct * 100}%`;
|
|
11413
|
+
rectangle.style.bottom = `${margins.bottomPct * 100}%`;
|
|
11414
|
+
rectangle.style.left = `${margins.leftPct * 100}%`;
|
|
11415
|
+
rectangle.style.right = `${margins.rightPct * 100}%`;
|
|
11416
|
+
}
|
|
11417
|
+
}, 500); // Give time for video frame to show
|
|
11418
|
+
|
|
11367
11419
|
this.scanStartTime = Date.now(); // Reset timer
|
|
11368
11420
|
setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);
|
|
11369
11421
|
this.showMessage("Starting scanning");
|
|
@@ -11401,11 +11453,9 @@ class ExtractorVideo {
|
|
|
11401
11453
|
<div class="desktopFeedback" id="ScanDocAIMessage"></div>
|
|
11402
11454
|
<div class="desktopVideoArea">
|
|
11403
11455
|
<div class="desktopVideoHolder">
|
|
11404
|
-
|
|
11405
|
-
|
|
11406
|
-
|
|
11407
|
-
<div class="desktopRectangle dashedRectangle"></div>
|
|
11408
|
-
</div>
|
|
11456
|
+
<video id="ScanDocAIVideoElement" class="desktopVideo" autoPlay muted playsInline></video>
|
|
11457
|
+
<div class="backgroundOverlay"></div>
|
|
11458
|
+
<div class="desktopRectangle dashedRectangle"></div>
|
|
11409
11459
|
</div>
|
|
11410
11460
|
</div>
|
|
11411
11461
|
|
|
@@ -11426,39 +11476,26 @@ class ExtractorVideo {
|
|
|
11426
11476
|
position: relative;
|
|
11427
11477
|
max-width: 100%;
|
|
11428
11478
|
overflow: hidden;
|
|
11479
|
+
aspect-ratio: 16 / 9;
|
|
11429
11480
|
}
|
|
11430
|
-
|
|
11431
|
-
.videoWrapper {
|
|
11432
|
-
position: relative;
|
|
11433
|
-
width: 100%;
|
|
11434
|
-
aspect-ratio: 16 / 9;
|
|
11435
|
-
}
|
|
11481
|
+
|
|
11436
11482
|
.desktopVideo {
|
|
11437
11483
|
width: 100%;
|
|
11438
11484
|
height: 100%;
|
|
11439
|
-
object-fit:
|
|
11485
|
+
object-fit: contain;
|
|
11440
11486
|
display: block;
|
|
11441
11487
|
}
|
|
11488
|
+
|
|
11442
11489
|
.desktopRectangle {
|
|
11443
|
-
|
|
11444
|
-
|
|
11445
|
-
|
|
11446
|
-
|
|
11447
|
-
|
|
11448
|
-
|
|
11449
|
-
|
|
11450
|
-
|
|
11451
|
-
|
|
11452
|
-
z-index: 3;
|
|
11453
|
-
}
|
|
11454
|
-
|
|
11455
|
-
.dashedRectangle {
|
|
11456
|
-
border: 5px dashed #5078bb;
|
|
11457
|
-
}
|
|
11458
|
-
|
|
11459
|
-
.solidRectangle {
|
|
11460
|
-
border: 5px solid #5078bb;
|
|
11461
|
-
}
|
|
11490
|
+
position: absolute;
|
|
11491
|
+
border-radius: 30px;
|
|
11492
|
+
display: flex;
|
|
11493
|
+
justify-content: center;
|
|
11494
|
+
align-items: center;
|
|
11495
|
+
z-index: 3;
|
|
11496
|
+
border: 5px dashed #5078bb;
|
|
11497
|
+
transition: all 0.3s ease;
|
|
11498
|
+
}
|
|
11462
11499
|
|
|
11463
11500
|
.backgroundOverlay {
|
|
11464
11501
|
position: absolute;
|