Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions lib/exif/Buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ Buffer.prototype.getSignedLong = function (offset, bigEndian) {
Buffer.prototype.getString = function (offset, length) {
var string = [];
for (var i = offset; i < offset + length; i++) {
string.push(String.fromCharCode(this[i]));
if (this[i]) {
string.push(String.fromCharCode(this[i]));
}
}
return string.join('');
};
};
87 changes: 69 additions & 18 deletions lib/exif/ExifImage.js
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,7 @@ ExifImage.prototype.extractExifData = function (data, start, length) {

debug("Makernote IFD parsed",exifData.makernote);
}

};

ExifImage.prototype.extractExifEntry = function (data, entryOffset, tiffOffset, isBigEndian, tags) {
Expand Down Expand Up @@ -461,44 +462,75 @@ ExifImage.prototype.extractExifEntry = function (data, entryOffset, tiffOffset,
} else {
return false;
}

switch (entry.format) {

case 0x0001: // unsigned byte, 1 byte per component
entry.valueOffset = (entry.components <= 4) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getByte(entry.valueOffset + i));
for (var i = 0; i < entry.components; i++) {
var value = data.getByte(entry.valueOffset + i);
if (value) {
entry.value.push(value);
} else {
break;
}
}
break;

case 0x0002: // ascii strings, 1 byte per component
entry.valueOffset = (entry.components <= 4) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;

entry.value = data.getString(entry.valueOffset, entry.components);
if (entry.value[entry.value.length - 1] === "\u0000") // Trim null terminated strings
entry.value = entry.value.substring(0, entry.value.length - 1);
break;

case 0x0003: // unsigned short, 2 byte per component
entry.valueOffset = (entry.components <= 2) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getShort(entry.valueOffset + i * 2, isBigEndian));
for (var i = 0; i < entry.components; i++) {
var value = data.getShort(entry.valueOffset + i * 2, isBigEndian);
if (value) {
entry.value.push(value);
} else {
break;
}
}
break;

case 0x0004: // unsigned long, 4 byte per component
entry.valueOffset = (entry.components == 1) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getLong(entry.valueOffset + i * 4, isBigEndian));
for (var i = 0; i < entry.components; i++) {
var value = data.getLong(entry.valueOffset + i * 4, isBigEndian);
if (value) {
entry.value.push(value);
} else {
break;
}
}
break;

case 0x0005: // unsigned rational, 8 byte per component (4 byte numerator and 4 byte denominator)
entry.valueOffset = data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getLong(entry.valueOffset + i * 8, isBigEndian) / data.getLong(entry.valueOffset + i * 8 + 4, isBigEndian));
for (var i = 0; i < entry.components; i++) {
var num = data.getLong(entry.valueOffset + i * 8, isBigEndian);
var den = data.getLong(entry.valueOffset + i * 8 + 4, isBigEndian);
if (num && den && den > 0) {
entry.value.push(num / den);
} else {
break;
}
}
break;

case 0x0006: // signed byte, 1 byte per component
entry.valueOffset = (entry.components <= 4) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getSignedByte(entry.valueOffset + i));
for (var i = 0; i < entry.components; i++) {
var value = data.getSignedByte(entry.valueOffset + i);
if (value) {
entry.value.push(value);
} else {
break;
}
}
break;

case 0x0007: // undefined, 1 byte per component
Expand All @@ -508,20 +540,39 @@ ExifImage.prototype.extractExifEntry = function (data, entryOffset, tiffOffset,

case 0x0008: // signed short, 2 byte per component
entry.valueOffset = (entry.components <= 2) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getSignedShort(entry.valueOffset + i * 2, isBigEndian));
for (var i = 0; i < entry.components; i++) {
var value = data.getSignedShort(entry.valueOffset + i * 2, isBigEndian);
if (value) {
entry.value.push(value);
} else {
break;
}
}
break;

case 0x0009: // signed long, 4 byte per component
entry.valueOffset = (entry.components == 1) ? entryOffset + 8 : data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getSignedLong(entry.valueOffset + i * 4, isBigEndian));
for (var i = 0; i < entry.components; i++) {
var value = data.getSignedLong(entry.valueOffset + i * 4, isBigEndian);
if (value) {
entry.value.push(value);
} else {
break;
}
}
break;

case 0x000A: // signed rational, 8 byte per component (4 byte numerator and 4 byte denominator)
entry.valueOffset = data.getLong(entryOffset + 8, isBigEndian) + tiffOffset;
for (var i = 0; i < entry.components; i++)
entry.value.push(data.getSignedLong(entry.valueOffset + i * 8, isBigEndian) / data.getSignedLong(entry.valueOffset + i * 8 + 4, isBigEndian));
for (var i = 0; i < entry.components; i++) {
var num = data.getSignedLong(entry.valueOffset + i * 8, isBigEndian);
var den = data.getSignedLong(entry.valueOffset + i * 8 + 4, isBigEndian);
if (num && den && den > 0) {
entry.value.push(num / den);
} else {
break;
}
}
break;

default:
Expand Down Expand Up @@ -1021,4 +1072,4 @@ ExifImage.TAGS = {

}

};
};