1/* 2 * ImageInfo 0.1.2 - A JavaScript library for reading image metadata. 3 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ 4 * MIT License [http://www.nihilogic.dk/licenses/mit-license.txt] 5 */ 6 7 8var ImageInfo = {}; 9 10ImageInfo.useRange = false; 11ImageInfo.range = 10240; 12 13(function() { 14 15 var files = []; 16 17 function readFileData(url, callback) { 18 BinaryAjax( 19 url, 20 function(http) { 21 var tags = readInfoFromData(http.binaryResponse); 22 var mime = http.getResponseHeader("Content-Type"); 23 24 tags["mimeType"] = mime; 25 tags["byteSize"] = http.fileSize; 26 27 files[url] = tags; 28 if (callback) callback(); 29 }, 30 null, 31 ImageInfo.useRange ? [0, ImageInfo.range] : null 32 ) 33 } 34 35 function readInfoFromData(data) { 36 37 var offset = 0; 38 39 if (data.getByteAt(0) == 0xFF && data.getByteAt(1) == 0xD8) { 40 return readJPEGInfo(data); 41 } 42 if (data.getByteAt(0) == 0x89 && data.getStringAt(1, 3) == "PNG") { 43 return readPNGInfo(data); 44 } 45 if (data.getStringAt(0,3) == "GIF") { 46 return readGIFInfo(data); 47 } 48 if (data.getByteAt(0) == 0x42 && data.getByteAt(1) == 0x4D) { 49 return readBMPInfo(data); 50 } 51 if (data.getByteAt(0) == 0x00 && data.getByteAt(1) == 0x00) { 52 return readICOInfo(data); 53 } 54 55 return { 56 format : "UNKNOWN" 57 }; 58 } 59 60 61 function readPNGInfo(data) { 62 var w = data.getLongAt(16,true); 63 var h = data.getLongAt(20,true); 64 65 var bpc = data.getByteAt(24); 66 var ct = data.getByteAt(25); 67 68 var bpp = bpc; 69 if (ct == 4) bpp *= 2; 70 if (ct == 2) bpp *= 3; 71 if (ct == 6) bpp *= 4; 72 73 var alpha = data.getByteAt(25) >= 4; 74 75 return { 76 format : "PNG", 77 version : "", 78 width : w, 79 height : h, 80 bpp : bpp, 81 alpha : alpha, 82 exif : {} 83 } 84 } 85 86 function readGIFInfo(data) { 87 var version = data.getStringAt(3,3); 88 var w = data.getShortAt(6); 89 var h = data.getShortAt(8); 90 91 var bpp = ((data.getByteAt(10) >> 4) & 7) + 1; 92 93 return { 94 format : "GIF", 95 version : version, 96 width : w, 97 height : h, 98 bpp : bpp, 99 alpha : false, 100 exif : {} 101 } 102 } 103 104 function readJPEGInfo(data) { 105 106 var w = 0; 107 var h = 0; 108 var comps = 0; 109 var len = data.getLength(); 110 var offset = 2; 111 while (offset < len) { 112 var marker = data.getShortAt(offset, true); 113 offset += 2; 114 if (marker == 0xFFC0) { 115 h = data.getShortAt(offset + 3, true); 116 w = data.getShortAt(offset + 5, true); 117 comps = data.getByteAt(offset + 7, true) 118 break; 119 } else { 120 offset += data.getShortAt(offset, true) 121 } 122 } 123 124 var exif = {}; 125 126 if (typeof EXIF != "undefined" && EXIF.readFromBinaryFile) { 127 exif = EXIF.readFromBinaryFile(data); 128 } 129 130 return { 131 format : "JPEG", 132 version : "", 133 width : w, 134 height : h, 135 bpp : comps * 8, 136 alpha : false, 137 exif : exif 138 } 139 } 140 141 function readBMPInfo(data) { 142 var w = data.getLongAt(18); 143 var h = data.getLongAt(22); 144 var bpp = data.getShortAt(28); 145 return { 146 format : "BMP", 147 version : "", 148 width : w, 149 height : h, 150 bpp : bpp, 151 alpha : false, 152 exif : {} 153 } 154 } 155 156 ImageInfo.loadInfo = function(url, cb) { 157 if (!files[url]) { 158 readFileData(url, cb); 159 } else { 160 if (cb) cb(); 161 } 162 } 163 164 ImageInfo.getAllFields = function(url) { 165 if (!files[url]) return null; 166 167 var tags = {}; 168 for (var a in files[url]) { 169 if (files[url].hasOwnProperty(a)) 170 tags[a] = files[url][a]; 171 } 172 return tags; 173 } 174 175 ImageInfo.getField = function(url, field) { 176 if (!files[url]) return null; 177 return files[url][field]; 178 } 179 180 181})(); 182 183