Skip to content

Commit

Permalink
Add support for loading images through ImageMagick as a buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
mcuelenaere committed Feb 16, 2015
1 parent 1f7e80e commit e38311b
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
6 changes: 4 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,13 @@ var Sharp = function(input) {
(input[0] === 0x52 && input[1] === 0x49) ||
// TIFF
(input[0] === 0x4D && input[1] === 0x4D && input[2] === 0x00 && (input[3] === 0x2A || input[3] === 0x2B)) ||
(input[0] === 0x49 && input[1] === 0x49 && (input[2] === 0x2A || input[2] === 0x2B) && input[3] === 0x00)
(input[0] === 0x49 && input[1] === 0x49 && (input[2] === 0x2A || input[2] === 0x2B) && input[3] === 0x00) ||
// GIF
(input[0] === 0x47 && input[1] === 0x49 && input[2] === 0x46 && input[3] === 0x38 && (input[4] === 0x37 || input[4] === 0x39) && input[5] === 0x61)
) {
this.options.bufferIn = input;
} else {
throw new Error('Buffer contains an unsupported image format. JPEG, PNG, WebP and TIFF are currently supported.');
throw new Error('Buffer contains an unsupported image format. JPEG, PNG, WebP, TIFF and GIF are currently supported.');
}
} else {
// input=stream
Expand Down
15 changes: 15 additions & 0 deletions src/common.cc
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,15 @@ namespace sharp {
);
}

static bool buffer_is_gif(char *buffer, size_t len) {
return (
len >= 6 && (
(buffer[0] == 'G' && buffer[1] == 'I' && buffer[2] == 'F' &&
buffer[3] == '8' && (buffer[4] == '7' || buffer[4] == '9') && buffer[5] == 'a')
)
);
}

/*
Determine image format of a buffer.
*/
Expand All @@ -57,6 +66,8 @@ namespace sharp {
imageType = ImageType::WEBP;
} else if (buffer_is_tiff(static_cast<char*>(buffer), length)) {
imageType = ImageType::TIFF;
} else if (buffer_is_gif(static_cast<char*>(buffer), length)) {
imageType = ImageType::MAGICK;
}
}
return imageType;
Expand All @@ -75,6 +86,10 @@ namespace sharp {
vips_webpload_buffer(buffer, length, &image, "access", access, NULL);
} else if (imageType == ImageType::TIFF) {
vips_tiffload_buffer(buffer, length, &image, "access", access, NULL);
#if (VIPS_MAJOR_VERSION >= 8 && VIPS_MINOR_VERSION >= 0)
} else if (imageType == ImageType::MAGICK) {
vips_magickload_buffer(buffer, length, &image, "access", access, NULL);
#endif
}
return image;
}
Expand Down
18 changes: 18 additions & 0 deletions test/unit/io.js
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,24 @@ describe('Input/output', function() {
});
}

if (semver.gt(sharp.libvipsVersion(), '7.42.3')) {
it('Load GIF from Buffer [libvips ' + sharp.libvipsVersion() + '>7.42.3]', function(done) {
var inputGifBuffer = fs.readFileSync(fixtures.inputGif);
sharp(inputGifBuffer)
.resize(320, 240)
.jpeg()
.toBuffer(function(err, data, info) {
if (err) throw err;
assert.strictEqual(true, data.length > 0);
assert.strictEqual(data.length, info.size);
assert.strictEqual('jpeg', info.format);
assert.strictEqual(320, info.width);
assert.strictEqual(240, info.height);
done();
});
});
}

if (semver.gte(sharp.libvipsVersion(), '7.42.0')) {
describe('Ouput raw, uncompressed image data [libvips ' + sharp.libvipsVersion() + '>=7.42.0]', function() {
it('1 channel greyscale image', function(done) {
Expand Down

0 comments on commit e38311b

Please sign in to comment.