mirror of
https://github.com/serratus/quaggaJS.git
synced 2026-08-12 21:21:42 +08:00
Merge pull request #122 from serratus/feature/121
Recognizing EXIF orientation
This commit is contained in:
@@ -24,7 +24,12 @@
|
|||||||
"objectLiteralComputedProperties": true
|
"objectLiteralComputedProperties": true
|
||||||
},
|
},
|
||||||
"globals": {
|
"globals": {
|
||||||
"ENV": true
|
"ENV": true,
|
||||||
|
"beforeEach": true,
|
||||||
|
"describe": true,
|
||||||
|
"it": true,
|
||||||
|
"expect": true,
|
||||||
|
"sinon": true
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
"no-unused-expressions": 1,
|
"no-unused-expressions": 1,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
quaggaJS
|
quaggaJS
|
||||||
========
|
========
|
||||||
|
|
||||||
- [Changelog](#changelog) (2016-04-24)
|
- [Changelog](#changelog) (2016-08-15)
|
||||||
- [Browser Support](#browser-support)
|
- [Browser Support](#browser-support)
|
||||||
- [Installing](#installing)
|
- [Installing](#installing)
|
||||||
- [Getting Started](#gettingstarted)
|
- [Getting Started](#gettingstarted)
|
||||||
@@ -636,6 +636,11 @@ on the ``singleChannel`` flag in the configuration when using ``decodeSingle``.
|
|||||||
|
|
||||||
## <a name="changelog">Changelog</a>
|
## <a name="changelog">Changelog</a>
|
||||||
|
|
||||||
|
### 2016-08-15
|
||||||
|
- Features
|
||||||
|
- Proper handling of EXIF orientation when using `Quagga.decodeSingle`
|
||||||
|
(see [#121](https://github.com/serratus/quaggaJS/issues/121))
|
||||||
|
|
||||||
### 2016-04-24
|
### 2016-04-24
|
||||||
- Features
|
- Features
|
||||||
- EAN-13 extended codes can now be decoded (See
|
- EAN-13 extended codes can now be decoded (See
|
||||||
|
|||||||
Vendored
+2282
-2250
File diff suppressed because one or more lines are too long
Vendored
+3
-4
File diff suppressed because one or more lines are too long
@@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<fieldset class="input-group">
|
<fieldset class="input-group">
|
||||||
<input type="file" capture/>
|
<input type="file" accept="image/*" capture="camera"/>
|
||||||
<button>Rerun</button>
|
<button>Rerun</button>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset class="reader-config-group">
|
<fieldset class="reader-config-group">
|
||||||
|
|||||||
+2066
-2262
File diff suppressed because one or more lines are too long
@@ -0,0 +1,146 @@
|
|||||||
|
// Scraped from https://github.com/exif-js/exif-js
|
||||||
|
|
||||||
|
const ExifTags = {0x0112: "orientation"};
|
||||||
|
export const AvailableTags = Object.keys(ExifTags).map(key => ExifTags[key]);
|
||||||
|
|
||||||
|
export function findTagsInObjectURL(src, tags = AvailableTags) {
|
||||||
|
if (/^blob\:/i.test(src)) {
|
||||||
|
return objectURLToBlob(src)
|
||||||
|
.then(readToBuffer)
|
||||||
|
.then(buffer => findTagsInBuffer(buffer, tags));
|
||||||
|
}
|
||||||
|
return Promise.resolve(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function base64ToArrayBuffer(dataUrl) {
|
||||||
|
const base64 = dataUrl.replace(/^data\:([^\;]+)\;base64,/gmi, ''),
|
||||||
|
binary = atob(base64),
|
||||||
|
len = binary.length,
|
||||||
|
buffer = new ArrayBuffer(len),
|
||||||
|
view = new Uint8Array(buffer);
|
||||||
|
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
view[i] = binary.charCodeAt(i);
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function readToBuffer(blob) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
const fileReader = new FileReader();
|
||||||
|
fileReader.onload = function(e) {
|
||||||
|
return resolve(e.target.result);
|
||||||
|
};
|
||||||
|
fileReader.readAsArrayBuffer(blob);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function objectURLToBlob(url) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const http = new XMLHttpRequest();
|
||||||
|
http.open("GET", url, true);
|
||||||
|
http.responseType = "blob";
|
||||||
|
http.onreadystatechange = function () {
|
||||||
|
if (http.readyState === XMLHttpRequest.DONE && (http.status === 200 || http.status === 0)) {
|
||||||
|
resolve(this.response);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
http.onerror = reject;
|
||||||
|
http.send();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function findTagsInBuffer(file, selectedTags = AvailableTags) {
|
||||||
|
const dataView = new DataView(file),
|
||||||
|
length = file.byteLength,
|
||||||
|
exifTags = selectedTags.reduce((result, selectedTag) => {
|
||||||
|
const exifTag = Object.keys(ExifTags).filter(tag => ExifTags[tag] === selectedTag)[0];
|
||||||
|
if (exifTag) {
|
||||||
|
result[exifTag] = selectedTag;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}, {});
|
||||||
|
let offset = 2,
|
||||||
|
marker;
|
||||||
|
|
||||||
|
if ((dataView.getUint8(0) !== 0xFF) || (dataView.getUint8(1) !== 0xD8)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (offset < length) {
|
||||||
|
if (dataView.getUint8(offset) !== 0xFF) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
marker = dataView.getUint8(offset + 1);
|
||||||
|
if (marker === 0xE1) {
|
||||||
|
return readEXIFData(dataView, offset + 4, exifTags);
|
||||||
|
} else {
|
||||||
|
offset += 2 + dataView.getUint16(offset + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function readEXIFData(file, start, exifTags) {
|
||||||
|
if (getStringFromBuffer(file, start, 4) !== "Exif") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const tiffOffset = start + 6;
|
||||||
|
let bigEnd,
|
||||||
|
tags;
|
||||||
|
|
||||||
|
if (file.getUint16(tiffOffset) === 0x4949) {
|
||||||
|
bigEnd = false;
|
||||||
|
} else if (file.getUint16(tiffOffset) === 0x4D4D) {
|
||||||
|
bigEnd = true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file.getUint16(tiffOffset + 2, !bigEnd) !== 0x002A) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
|
||||||
|
if (firstIFDOffset < 0x00000008) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tags = readTags(file, tiffOffset, tiffOffset + firstIFDOffset, exifTags, bigEnd);
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
function readTags(file, tiffStart, dirStart, strings, bigEnd) {
|
||||||
|
const entries = file.getUint16(dirStart, !bigEnd),
|
||||||
|
tags = {};
|
||||||
|
|
||||||
|
for (let i = 0; i < entries; i++) {
|
||||||
|
const entryOffset = dirStart + i * 12 + 2,
|
||||||
|
tag = strings[file.getUint16(entryOffset, !bigEnd)];
|
||||||
|
if (tag) {
|
||||||
|
tags[tag] = readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
function readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd) {
|
||||||
|
const type = file.getUint16(entryOffset + 2, !bigEnd),
|
||||||
|
numValues = file.getUint32(entryOffset + 4, !bigEnd);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 3:
|
||||||
|
if (numValues === 1) {
|
||||||
|
return file.getUint16(entryOffset + 8, !bigEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStringFromBuffer(buffer, start, length) {
|
||||||
|
let outstr = "";
|
||||||
|
for (let n = start; n < start + length; n++) {
|
||||||
|
outstr += String.fromCharCode(buffer.getUint8(n));
|
||||||
|
}
|
||||||
|
return outstr;
|
||||||
|
}
|
||||||
@@ -4,6 +4,23 @@ import {
|
|||||||
computeGray
|
computeGray
|
||||||
} from '../common/cv_utils';
|
} from '../common/cv_utils';
|
||||||
|
|
||||||
|
const TO_RADIANS = Math.PI / 180;
|
||||||
|
|
||||||
|
function adjustCanvasSize(canvas, targetSize) {
|
||||||
|
if (canvas.width !== targetSize.x) {
|
||||||
|
if (ENV.development) {
|
||||||
|
console.log("WARNING: canvas-size needs to be adjusted");
|
||||||
|
}
|
||||||
|
canvas.width = targetSize.x;
|
||||||
|
}
|
||||||
|
if (canvas.height !== targetSize.y) {
|
||||||
|
if (ENV.development) {
|
||||||
|
console.log("WARNING: canvas-size needs to be adjusted");
|
||||||
|
}
|
||||||
|
canvas.height = targetSize.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var FrameGrabber = {};
|
var FrameGrabber = {};
|
||||||
|
|
||||||
FrameGrabber.create = function(inputStream, canvas) {
|
FrameGrabber.create = function(inputStream, canvas) {
|
||||||
@@ -54,9 +71,35 @@ FrameGrabber.create = function(inputStream, canvas) {
|
|||||||
_that.grab = function() {
|
_that.grab = function() {
|
||||||
var doHalfSample = _streamConfig.halfSample,
|
var doHalfSample = _streamConfig.halfSample,
|
||||||
frame = inputStream.getFrame(),
|
frame = inputStream.getFrame(),
|
||||||
|
drawable = frame,
|
||||||
|
drawAngle = 0,
|
||||||
ctxData;
|
ctxData;
|
||||||
if (frame) {
|
if (drawable) {
|
||||||
_ctx.drawImage(frame, 0, 0, _canvasSize.x, _canvasSize.y);
|
adjustCanvasSize(_canvas, _canvasSize);
|
||||||
|
if (_streamConfig.type === 'ImageStream') {
|
||||||
|
drawable = frame.img;
|
||||||
|
if (frame.tags && frame.tags.orientation) {
|
||||||
|
switch (frame.tags.orientation) {
|
||||||
|
case 6:
|
||||||
|
drawAngle = 90 * TO_RADIANS;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
drawAngle = -90 * TO_RADIANS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drawAngle !== 0) {
|
||||||
|
_ctx.translate(_canvasSize.x / 2, _canvasSize.y / 2);
|
||||||
|
_ctx.rotate(drawAngle);
|
||||||
|
_ctx.drawImage(drawable, -_canvasSize.y / 2, -_canvasSize.x / 2, _canvasSize.y, _canvasSize.x);
|
||||||
|
_ctx.rotate(-drawAngle);
|
||||||
|
_ctx.translate(-_canvasSize.x / 2, -_canvasSize.y / 2);
|
||||||
|
} else {
|
||||||
|
_ctx.drawImage(drawable, 0, 0, _canvasSize.x, _canvasSize.y);
|
||||||
|
}
|
||||||
|
|
||||||
ctxData = _ctx.getImageData(_sx, _sy, _size.x, _size.y).data;
|
ctxData = _ctx.getImageData(_sx, _sy, _size.x, _size.y).data;
|
||||||
if (doHalfSample){
|
if (doHalfSample){
|
||||||
grayAndHalfSampleFromCanvasData(ctxData, _size, _data);
|
grayAndHalfSampleFromCanvasData(ctxData, _size, _data);
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import {findTagsInObjectURL} from './exif_helper';
|
||||||
|
|
||||||
var ImageLoader = {};
|
var ImageLoader = {};
|
||||||
ImageLoader.load = function(directory, callback, offset, size, sequence) {
|
ImageLoader.load = function(directory, callback, offset, size, sequence) {
|
||||||
var htmlImagesSrcArray = new Array(size),
|
var htmlImagesSrcArray = new Array(size),
|
||||||
@@ -26,7 +28,7 @@ ImageLoader.load = function(directory, callback, offset, size, sequence) {
|
|||||||
for (var y = 0; y < htmlImagesSrcArray.length; y++) {
|
for (var y = 0; y < htmlImagesSrcArray.length; y++) {
|
||||||
var imgName = htmlImagesSrcArray[y].substr(htmlImagesSrcArray[y].lastIndexOf("/"));
|
var imgName = htmlImagesSrcArray[y].substr(htmlImagesSrcArray[y].lastIndexOf("/"));
|
||||||
if (loadedImg.src.lastIndexOf(imgName) !== -1) {
|
if (loadedImg.src.lastIndexOf(imgName) !== -1) {
|
||||||
htmlImagesArray[y] = loadedImg;
|
htmlImagesArray[y] = {img: loadedImg};
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,7 +39,18 @@ ImageLoader.load = function(directory, callback, offset, size, sequence) {
|
|||||||
if (ENV.development) {
|
if (ENV.development) {
|
||||||
console.log("Images loaded");
|
console.log("Images loaded");
|
||||||
}
|
}
|
||||||
callback.apply(null, [htmlImagesArray]);
|
if (sequence === false) {
|
||||||
|
findTagsInObjectURL(directory, ['orientation'])
|
||||||
|
.then(tags => {
|
||||||
|
htmlImagesArray[0].tags = tags;
|
||||||
|
callback(htmlImagesArray);
|
||||||
|
}).catch(e => {
|
||||||
|
console.log(e);
|
||||||
|
callback(htmlImagesArray);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback(htmlImagesArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -176,8 +176,21 @@ InputStream.createImageStream = function() {
|
|||||||
loaded = false;
|
loaded = false;
|
||||||
ImageLoader.load(baseUrl, function(imgs) {
|
ImageLoader.load(baseUrl, function(imgs) {
|
||||||
imgArray = imgs;
|
imgArray = imgs;
|
||||||
width = imgs[0].width;
|
if (imgs[0].tags && imgs[0].tags.orientation) {
|
||||||
height = imgs[0].height;
|
switch (imgs[0].tags.orientation) {
|
||||||
|
case 6:
|
||||||
|
case 8:
|
||||||
|
width = imgs[0].img.height;
|
||||||
|
height = imgs[0].img.width;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
width = imgs[0].img.width;
|
||||||
|
height = imgs[0].img.height;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
width = imgs[0].img.width;
|
||||||
|
height = imgs[0].img.height;
|
||||||
|
}
|
||||||
calculatedWidth =
|
calculatedWidth =
|
||||||
_config.size ? width / height > 1 ? _config.size : Math.floor((width / height) * _config.size) : width;
|
_config.size ? width / height > 1 ? _config.size : Math.floor((width / height) * _config.size) : width;
|
||||||
calculatedHeight =
|
calculatedHeight =
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
import {
|
||||||
|
findTagsInObjectURL,
|
||||||
|
findTagsInBuffer,
|
||||||
|
base64ToArrayBuffer
|
||||||
|
} from '../../src/input/exif_helper';
|
||||||
|
|
||||||
|
|
||||||
|
const fixtures = {
|
||||||
|
orientation: {
|
||||||
|
'none': 'data:image/jpeg;base64,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',
|
||||||
|
'6': 'data:image/jpeg;base64,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',
|
||||||
|
'3': 'data:image/jpeg;base64,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',
|
||||||
|
'8': 'data:image/jpeg;base64,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',
|
||||||
|
'1': 'data:image/jpeg;base64,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'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('exif_helper', () => {
|
||||||
|
describe("findTagsInObjectURL", () => {
|
||||||
|
it("should return null if the src type is not supported", (done) => {
|
||||||
|
findTagsInObjectURL("blabla").then(tags => {
|
||||||
|
expect(tags === null).to.equal(true);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should fail for a invalid blob type", (done) => {
|
||||||
|
findTagsInObjectURL('blob:balbla')
|
||||||
|
.then(() => {})
|
||||||
|
.catch(err => {
|
||||||
|
console.log(err);
|
||||||
|
expect(typeof err !== 'undefined');
|
||||||
|
}).then(done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("findTagsInBuffer", () => {
|
||||||
|
it("should result in a rotation value of 1", () => {
|
||||||
|
const result = findTagsInBuffer(base64ToArrayBuffer(fixtures.orientation['1']));
|
||||||
|
expect(result).to.deep.equal({orientation: 1});
|
||||||
|
});
|
||||||
|
it("should result in a rotation value of 6", () => {
|
||||||
|
const result = findTagsInBuffer(base64ToArrayBuffer(fixtures.orientation['6']));
|
||||||
|
expect(result).to.deep.equal({orientation: 6});
|
||||||
|
});
|
||||||
|
it("should result in a rotation value of 3", () => {
|
||||||
|
const result = findTagsInBuffer(base64ToArrayBuffer(fixtures.orientation['3']));
|
||||||
|
expect(result).to.deep.equal({orientation: 3});
|
||||||
|
});
|
||||||
|
it("should result in a rotation value of 4", () => {
|
||||||
|
const result = findTagsInBuffer(base64ToArrayBuffer(fixtures.orientation['8']));
|
||||||
|
expect(result).to.deep.equal({orientation: 8});
|
||||||
|
});
|
||||||
|
it("should return nothing if orientation is not found", () => {
|
||||||
|
const result = findTagsInBuffer(base64ToArrayBuffer(fixtures.orientation['none']));
|
||||||
|
expect(result).to.deep.equal({});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user