blob: 5a35c766f82ac6a89e004408012a3e5741ca3bc6 [file] [log] [blame]
/*
* ImageInfo 0.1.2 - A JavaScript library for reading image metadata.
* Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
* MIT License [http://www.nihilogic.dk/licenses/mit-license.txt]
*/
var ImageInfo = {};
ImageInfo.useRange = false;
ImageInfo.range = 10240;
(function() {
var files = [];
function readFileData(url, callback) {
BinaryAjax(
url,
function(http) {
var tags = readInfoFromData(http.binaryResponse);
var mime = http.getResponseHeader("Content-Type");
tags["mimeType"] = mime;
tags["byteSize"] = http.fileSize;
files[url] = tags;
if (callback) callback();
},
null,
ImageInfo.useRange ? [0, ImageInfo.range] : null
)
}
function readInfoFromData(data) {
var offset = 0;
if (data.getByteAt(0) == 0xFF && data.getByteAt(1) == 0xD8) {
return readJPEGInfo(data);
}
if (data.getByteAt(0) == 0x89 && data.getStringAt(1, 3) == "PNG") {
return readPNGInfo(data);
}
if (data.getStringAt(0,3) == "GIF") {
return readGIFInfo(data);
}
if (data.getByteAt(0) == 0x42 && data.getByteAt(1) == 0x4D) {
return readBMPInfo(data);
}
if (data.getByteAt(0) == 0x00 && data.getByteAt(1) == 0x00) {
return readICOInfo(data);
}
return {
format : "UNKNOWN"
};
}
function readPNGInfo(data) {
var w = data.getLongAt(16,true);
var h = data.getLongAt(20,true);
var bpc = data.getByteAt(24);
var ct = data.getByteAt(25);
var bpp = bpc;
if (ct == 4) bpp *= 2;
if (ct == 2) bpp *= 3;
if (ct == 6) bpp *= 4;
var alpha = data.getByteAt(25) >= 4;
return {
format : "PNG",
version : "",
width : w,
height : h,
bpp : bpp,
alpha : alpha,
exif : {}
}
}
function readGIFInfo(data) {
var version = data.getStringAt(3,3);
var w = data.getShortAt(6);
var h = data.getShortAt(8);
var bpp = ((data.getByteAt(10) >> 4) & 7) + 1;
return {
format : "GIF",
version : version,
width : w,
height : h,
bpp : bpp,
alpha : false,
exif : {}
}
}
function readJPEGInfo(data) {
var w = 0;
var h = 0;
var comps = 0;
var len = data.getLength();
var offset = 2;
while (offset < len) {
var marker = data.getShortAt(offset, true);
offset += 2;
if (marker == 0xFFC0) {
h = data.getShortAt(offset + 3, true);
w = data.getShortAt(offset + 5, true);
comps = data.getByteAt(offset + 7, true)
break;
} else {
offset += data.getShortAt(offset, true)
}
}
var exif = {};
if (typeof EXIF != "undefined" && EXIF.readFromBinaryFile) {
exif = EXIF.readFromBinaryFile(data);
}
return {
format : "JPEG",
version : "",
width : w,
height : h,
bpp : comps * 8,
alpha : false,
exif : exif
}
}
function readBMPInfo(data) {
var w = data.getLongAt(18);
var h = data.getLongAt(22);
var bpp = data.getShortAt(28);
return {
format : "BMP",
version : "",
width : w,
height : h,
bpp : bpp,
alpha : false,
exif : {}
}
}
ImageInfo.loadInfo = function(url, cb) {
if (!files[url]) {
readFileData(url, cb);
} else {
if (cb) cb();
}
}
ImageInfo.getAllFields = function(url) {
if (!files[url]) return null;
var tags = {};
for (var a in files[url]) {
if (files[url].hasOwnProperty(a))
tags[a] = files[url][a];
}
return tags;
}
ImageInfo.getField = function(url, field) {
if (!files[url]) return null;
return files[url][field];
}
})();