Capturing images respecting their orientation

feature/image-source
Christoph Oberhofer 8 years ago
parent 12398a8ed9
commit 5f385d490d

@ -41,6 +41,39 @@ function getOrCreateCanvas(source, target) {
return $canvas; return $canvas;
} }
function drawImage(
canvasSize,
ctx,
source,
type,
drawable,
...drawImageArgs,
) {
let drawAngle = 0;
if (source.type === 'IMAGE') {
if (source.tags && source.tags.orientation) {
switch(source.tags.orientation) {
case 6:
drawAngle = 90 * TO_RADIANS;
break;
case 8:
drawAngle = -90 * TO_RADIANS;
break;
}
}
}
if (drawAngle !== 0) {
ctx.translate(canvasSize.width / 2, canvasSize.height / 2);
ctx.rotate(drawAngle);
ctx.drawImage(drawable, -canvasSize.height / 2, -canvasSize.width / 2, canvasSize.height, canvasSize.width);
ctx.rotate(-drawAngle);
ctx.translate(-canvasSize.width / 2, -canvasSize.height / 2);
} else {
ctx.drawImage(drawable, ...drawImageArgs);
}
}
export function fromSource(source, {target = "#interactive.viewport"} = {}) { export function fromSource(source, {target = "#interactive.viewport"} = {}) {
var drawable = source.getDrawable(); var drawable = source.getDrawable();
var $canvas = null; var $canvas = null;
@ -61,8 +94,6 @@ export function fromSource(source, {target = "#interactive.viewport"} = {}) {
return new Uint8Array(aquire(bytesRequired)); return new Uint8Array(aquire(bytesRequired));
} }
return { return {
grabFrameData: function grabFrameData({clipping} = {}) { grabFrameData: function grabFrameData({clipping} = {}) {
const {viewport, canvas: canvasSize} = source.getDimensions(); const {viewport, canvas: canvasSize} = source.getDimensions();
@ -87,8 +118,22 @@ export function fromSource(source, {target = "#interactive.viewport"} = {}) {
if ($canvas.height < 10 || $canvas.width < 10) { if ($canvas.height < 10 || $canvas.width < 10) {
return sleep(100).then(grabFrameData); return sleep(100).then(grabFrameData);
} }
if (!(drawable instanceof HTMLCanvasElement)) { if (!(drawable instanceof HTMLCanvasElement)) {
ctx.drawImage(drawable, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); drawImage(
canvasSize,
ctx,
source,
drawable,
sx,
sy,
sWidth,
sHeight,
dx,
dy,
dWidth,
dHeight
);
} }
var imageData = ctx.getImageData( var imageData = ctx.getImageData(
clipping.x, clipping.x,

Loading…
Cancel
Save