Added zoom to UI

feature/image-source
Christoph Oberhofer 8 years ago
parent 6f8bbe96d2
commit b2ac66eb72

@ -278,10 +278,10 @@ footer {
} }
#interactive.viewport > canvas, #interactive.viewport > video { #interactive.viewport > canvas, #interactive.viewport > video {
max-width: 100%;
width: 100%; width: 100%;
} }
canvas.drawing { canvas.drawing {
position: absolute; position: absolute;
z-index: 2;
} }

@ -170,7 +170,7 @@ $(function() {
frequency: 2, frequency: 2,
decoder: { decoder: {
readers : [{ readers : [{
format: "ean_reader", format: "code_128_reader",
config: {} config: {}
}] }]
}, },

@ -78,7 +78,7 @@ function resolveMinWidthToAdvanced({aspectRatio, minPixels}) {
.map(({pre}) => pre); .map(({pre}) => pre);
} }
function getOrCreateVideo(source, target) { function getOrCreateVideo(target) {
const $viewport = getViewport(target); const $viewport = getViewport(target);
if ($viewport) { if ($viewport) {
let $video = $viewport.querySelector("video"); let $video = $viewport.querySelector("video");
@ -153,10 +153,10 @@ function adjustWithZoom(videoConstraints) {
}; };
} }
export function fromCamera(constraints) { export function fromCamera(constraints, {target} = {}) {
var {video: videoConstraints, zoom} = adjustWithZoom(constraints); var {video: videoConstraints, zoom} = adjustWithZoom(constraints);
const video = getOrCreateVideo(); const video = getOrCreateVideo(target);
return CameraAccess.request(video, videoConstraints) return CameraAccess.request(video, videoConstraints)
.then(function(mediastream) { .then(function(mediastream) {
const track = mediastream.getVideoTracks()[0]; const track = mediastream.getVideoTracks()[0];

@ -136,7 +136,7 @@ function createApi() {
fromCamera(options) { fromCamera(options) {
const config = merge({}, Config, options); const config = merge({}, Config, options);
return Source return Source
.fromCamera(config.constraints) .fromCamera(config.constraints, {target: config.target})
.then(fromSource.bind(null, config)); .then(fromSource.bind(null, config));
}, },
fromSource(src, inputConfig) { fromSource(src, inputConfig) {

@ -7,6 +7,7 @@ import createEventedElement from './common/events';
import {release, aquire, releaseAll} from './common/buffers'; import {release, aquire, releaseAll} from './common/buffers';
import Config from './config/config'; import Config from './config/config';
import CameraAccess from './input/camera_access'; import CameraAccess from './input/camera_access';
import {getViewport} from './common/utils';
const vec2 = { const vec2 = {
clone: require('gl-vec2/clone') clone: require('gl-vec2/clone')
@ -45,17 +46,33 @@ function createScanner(pixelCapturer) {
const source = pixelCapturer ? pixelCapturer.getSource() : {}; const source = pixelCapturer ? pixelCapturer.getSource() : {};
function setup() { function updateViewportStyle(target) {
let {numOfWorkers} = _config; const $video = source.getDrawable();
const $viewport = getViewport(target);
const {viewport} = source.getDimensions();
const zoom = Math.floor((((2 * viewport.x) + viewport.width) / viewport.width) * 100) / 100;
const videoWidth = zoom * viewport.width;
const translate = ((viewport.x / videoWidth) * (-100)).toFixed(5);
$video.style.width = `${zoom * 100}%`;
$video.style.transform = `translate(${translate}%, ${translate}%)`;
$viewport.style.paddingBottom = `${(viewport.height * 100 / viewport.width).toFixed(5)}%`;
$viewport.style.overflow = "hidden";
$viewport.style.height = 0;
}
function setup({numOfWorkers, target}) {
if (source.type === 'IMAGE') { if (source.type === 'IMAGE') {
numOfWorkers = numOfWorkers >= 1 ? 1 : 0; numOfWorkers = numOfWorkers >= 1 ? 1 : 0;
} }
return adjustWorkerPool(numOfWorkers) return adjustWorkerPool(numOfWorkers)
.then(() => { .then(() => {
if (_config.numOfWorkers === 0) { if (numOfWorkers === 0) {
initBuffers(); initBuffers();
} }
}); })
.then(updateViewportStyle.bind(null, target));
} }
function initBuffers(imageWrapper) { function initBuffers(imageWrapper) {
@ -92,10 +109,10 @@ function createScanner(pixelCapturer) {
} }
} }
function transformResult(result) { function transformResult(result, dimensions = {}) {
const {viewport} = source.getDimensions(); const {clipping = {x: 0, y: 0}} = dimensions;
let xOffset = viewport.x, let xOffset = clipping.x,
yOffset = viewport.y, yOffset = clipping.y,
i; i;
if (xOffset === 0 && yOffset === 0) { if (xOffset === 0 && yOffset === 0) {
@ -104,7 +121,7 @@ function createScanner(pixelCapturer) {
if (result.barcodes) { if (result.barcodes) {
for (i = 0; i < result.barcodes.length; i++) { for (i = 0; i < result.barcodes.length; i++) {
transformResult(result.barcodes[i]); transformResult(result.barcodes[i], dimensions);
} }
} }
@ -158,11 +175,11 @@ function createScanner(pixelCapturer) {
result.codeResult); result.codeResult);
} }
function publishResult(result, imageData) { function publishResult(result, imageData, bitmap) {
let resultToPublish = result; let resultToPublish = result;
if (result && _onUIThread) { if (result && _onUIThread) {
transformResult(result); transformResult(result, bitmap.dimensions);
addResult(result, imageData); addResult(result, imageData);
resultToPublish = result.barcodes || result; resultToPublish = result.barcodes || result;
} }
@ -173,7 +190,7 @@ function createScanner(pixelCapturer) {
} }
} }
function locateAndDecode() { function locateAndDecode(bitmap) {
var result, var result,
boxes; boxes;
@ -183,9 +200,9 @@ function createScanner(pixelCapturer) {
.decodeFromBoundingBoxes(_inputImageWrapper, boxes); .decodeFromBoundingBoxes(_inputImageWrapper, boxes);
result = result || {}; result = result || {};
result.boxes = boxes; result.boxes = boxes;
publishResult(result, _inputImageWrapper.data); publishResult(result, _inputImageWrapper.data, bitmap);
} else { } else {
publishResult(); publishResult(undefined, undefined, bitmap);
} }
} }
@ -212,10 +229,11 @@ function createScanner(pixelCapturer) {
return pixelCapturer.grabFrameData({clipping: calculateClipping}) return pixelCapturer.grabFrameData({clipping: calculateClipping})
.then((bitmap) => { .then((bitmap) => {
if (bitmap) { if (bitmap) {
console.log(bitmap.dimensions); //console.log(bitmap.dimensions);
// adjust image size! // adjust image size!
if (availableWorker) { if (availableWorker) {
availableWorker.imageData = bitmap.data; availableWorker.imageData = bitmap.data;
availableWorker.dimensions = bitmap.dimensions;
availableWorker.busy = true; availableWorker.busy = true;
availableWorker.worker.postMessage({ availableWorker.worker.postMessage({
cmd: 'process', cmd: 'process',
@ -223,7 +241,7 @@ function createScanner(pixelCapturer) {
}, [availableWorker.imageData.buffer]); }, [availableWorker.imageData.buffer]);
} else { } else {
_inputImageWrapper.data = bitmap.data; _inputImageWrapper.data = bitmap.data;
locateAndDecode(); locateAndDecode(bitmap);
} }
} }
}) })
@ -286,7 +304,7 @@ function createScanner(pixelCapturer) {
} else if (e.data.event === 'processed') { } else if (e.data.event === 'processed') {
release(e.data.imageData); release(e.data.imageData);
workerThread.busy = false; workerThread.busy = false;
publishResult(e.data.result, workerThread.imageData); publishResult(e.data.result, workerThread.imageData, workerThread.dimensions);
} else if (e.data.event === 'error') { } else if (e.data.event === 'error') {
if (ENV.development) { if (ENV.development) {
console.log("Worker error: " + e.data.message); console.log("Worker error: " + e.data.message);
@ -407,7 +425,7 @@ function createScanner(pixelCapturer) {
initBuffers(imageWrapper); initBuffers(imageWrapper);
return cb(); return cb();
} else { } else {
return setup().then(cb); return setup(_config).then(cb);
} }
}, },
start: function() { start: function() {

Loading…
Cancel
Save