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