我正在使用JavaScript LoadImage.parseMetaData(https://github.com/blueimp/JavaScript-Load-Image)来尝试获取Web上图像的方向,因此我可以旋转它。
如果我对方向进行硬编码(请参阅第二次loadImage调用中的“orientation:3”),我可以旋转它......但我正在尝试使用loadImage.parseMetaData来获取方向。
我使用过基于网络的EXIF解析器,图像中有方向信息。
当我调用loadImage.parseMetaData时,“data.exif”似乎为null。看到这个小提琴:http://jsfiddle.net/aginsburg/GgrTM/13/
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.filepicker.io/api/file/U0D9Nb9gThy0fFbkrLJP', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
// Note: .response instead of .responseText
console.log ("got image");
var blob = new Blob([this.response], {type: 'image/png'});
console.log("about to parse blob:" + _.pairs(this.response));
loadImage.parseMetaData(blob, function (data) {
console.log("EXIF:" + _.pairs(data))
var ori ="initial";
if (data.exif) {
ori = data.exif.get('Orientation');
}
console.log("ori is:" + ori);
});
var loadingImage = loadImage(
blob,
function (img) {
console.log("in loadingImage");
document.body.appendChild(img);
},
{maxWidth: 600,
orientation: 3,
canvas: true,
crossOrigin:'anonymous'
}
);
if (!loadingImage) {
// Alternative code ...
}
}
};
xhr.send();
正确定位图像的任何想法或替代方法都欢迎。
答案 0 :(得分:2)
你对loadImage的调用需要在调用parseMetaData的回调中。
原因:因为您的代码包含竞争条件。在调用parseMetaData之前很可能调用loadImage,并且由于它们都是异步调用而填充方向。
答案 1 :(得分:1)
为什么你要一个新的blob,而你要求一个Blob?然后丢失元数据,这就是为什么你丢失它并且exif为null。 只需替换:
var blob = new Blob([this.response], {type: 'image/png'});
人:
var blob = this.response;
应该做的伎俩。
答案 2 :(得分:1)
出现同样的问题,我更改了'arrayBuffer'的响应类型,然后从响应中创建了blob
xhr.responseType = 'arraybuffer';
xhr.onload = function (e) {
if (this.status == 200) {
var arrayBufferView = new Uint8Array(this.response);
var blob = new Blob([arrayBufferView], { type: "image/jpeg" });
...