mirror of
https://github.com/lovell/sharp.git
synced 2026-02-05 22:26:20 +01:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bd20bd1881 | ||
|
|
60f1fda7ee | ||
|
|
ea1013f6ec | ||
|
|
247b607afd | ||
|
|
a56102a209 | ||
|
|
940b6f505f | ||
|
|
e1b5574c4a |
@@ -45,6 +45,7 @@ To install the most suitable version of libvips on the following Operating Syste
|
|||||||
* Red Hat Linux
|
* Red Hat Linux
|
||||||
* RHEL/Centos/Scientific 6, 7
|
* RHEL/Centos/Scientific 6, 7
|
||||||
* Fedora 21, 22
|
* Fedora 21, 22
|
||||||
|
* Amazon Linux 2014.09
|
||||||
|
|
||||||
run the following as a user with `sudo` access:
|
run the following as a user with `sudo` access:
|
||||||
|
|
||||||
@@ -403,7 +404,7 @@ Use progressive (interlace) scan for JPEG and PNG output. This typically reduces
|
|||||||
|
|
||||||
#### withMetadata()
|
#### withMetadata()
|
||||||
|
|
||||||
Include all metadata (ICC, EXIF, XMP) from the input image in the output image.
|
Include all metadata (EXIF, XMP, IPTC) from the input image in the output image. This will also convert to and add the latest web-friendly v2 sRGB ICC profile.
|
||||||
|
|
||||||
The default behaviour is to strip all metadata and convert to the device-independent sRGB colour space.
|
The default behaviour is to strip all metadata and convert to the device-independent sRGB colour space.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "sharp",
|
"name": "sharp",
|
||||||
"version": "0.8.1",
|
"version": "0.8.2",
|
||||||
"author": "Lovell Fuller <npm@lovell.info>",
|
"author": "Lovell Fuller <npm@lovell.info>",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Pierre Inglebert <pierre.inglebert@gmail.com>",
|
"Pierre Inglebert <pierre.inglebert@gmail.com>",
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"mocha": "^2.0.1",
|
"mocha": "^2.0.1",
|
||||||
"mocha-jshint": "^0.0.9",
|
"mocha-jshint": "^0.0.9",
|
||||||
"istanbul": "^0.3.2",
|
"istanbul": "^0.3.5",
|
||||||
"coveralls": "^2.11.2"
|
"coveralls": "^2.11.2"
|
||||||
},
|
},
|
||||||
"license": "Apache 2.0",
|
"license": "Apache 2.0",
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
# * Red Hat Linux
|
# * Red Hat Linux
|
||||||
# * RHEL/Centos/Scientific 6, 7
|
# * RHEL/Centos/Scientific 6, 7
|
||||||
# * Fedora 21, 22
|
# * Fedora 21, 22
|
||||||
|
# * Amazon Linux 2014.09
|
||||||
|
|
||||||
vips_version_minimum=7.40.0
|
vips_version_minimum=7.40.0
|
||||||
vips_version_latest_major=7.42
|
vips_version_latest_major=7.42
|
||||||
@@ -143,6 +144,19 @@ case $(uname -s) in
|
|||||||
sorry "$RELEASE"
|
sorry "$RELEASE"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
elif [ -f /etc/system-release ]; then
|
||||||
|
# Probably Amazon Linux
|
||||||
|
RELEASE=$(cat /etc/system-release)
|
||||||
|
case $RELEASE in
|
||||||
|
"Amazon Linux AMI release 2014.09")
|
||||||
|
# Amazon Linux
|
||||||
|
echo "Detected '$RELEASE'"
|
||||||
|
echo "Installing libvips dependencies via yum"
|
||||||
|
yum groupinstall -y "Development Tools"
|
||||||
|
yum install -y gtk-doc libxml2-devel libjpeg-turbo-devel libpng-devel libtiff-devel libexif-devel lcms-devel ImageMagick-devel gobject-introspection-devel libwebp-devel curl
|
||||||
|
install_libvips_from_source "--prefix=/usr"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
else
|
else
|
||||||
# Unsupported OS
|
# Unsupported OS
|
||||||
sorry "$(uname -a)"
|
sorry "$(uname -a)"
|
||||||
|
|||||||
@@ -115,6 +115,9 @@ class ResizeWorker : public NanAsyncWorker {
|
|||||||
// Increment processing task counter
|
// Increment processing task counter
|
||||||
g_atomic_int_inc(&counterProcess);
|
g_atomic_int_inc(&counterProcess);
|
||||||
|
|
||||||
|
// Latest v2 sRGB ICC profile
|
||||||
|
std::string srgbProfile = baton->iccProfilePath + "sRGB_IEC61966-2-1_black_scaled.icc";
|
||||||
|
|
||||||
// Hang image references from this hook object
|
// Hang image references from this hook object
|
||||||
VipsObject *hook = reinterpret_cast<VipsObject*>(vips_image_new());
|
VipsObject *hook = reinterpret_cast<VipsObject*>(vips_image_new());
|
||||||
|
|
||||||
@@ -272,16 +275,14 @@ class ResizeWorker : public NanAsyncWorker {
|
|||||||
// Ensure we're using a device-independent colour space
|
// Ensure we're using a device-independent colour space
|
||||||
if (HasProfile(image)) {
|
if (HasProfile(image)) {
|
||||||
// Convert to sRGB using embedded profile
|
// Convert to sRGB using embedded profile
|
||||||
std::string srgbProfile = baton->iccProfilePath + "sRGB_IEC61966-2-1_black_scaled.icc";
|
|
||||||
VipsImage *transformed;
|
VipsImage *transformed;
|
||||||
if (vips_icc_transform(image, &transformed, srgbProfile.c_str(), "embedded", TRUE, NULL)) {
|
if (!vips_icc_transform(image, &transformed, srgbProfile.c_str(), "embedded", TRUE, NULL)) {
|
||||||
return Error(baton, hook);
|
// Embedded profile can fail, so only update references on success
|
||||||
}
|
|
||||||
vips_object_local(hook, transformed);
|
vips_object_local(hook, transformed);
|
||||||
image = transformed;
|
image = transformed;
|
||||||
|
}
|
||||||
} else if (image->Type == VIPS_INTERPRETATION_CMYK) {
|
} else if (image->Type == VIPS_INTERPRETATION_CMYK) {
|
||||||
// Convert to sRGB using default "USWebCoatedSWOP" CMYK profile
|
// Convert to sRGB using default "USWebCoatedSWOP" CMYK profile
|
||||||
std::string srgbProfile = baton->iccProfilePath + "sRGB_IEC61966-2-1_black_scaled.icc";
|
|
||||||
std::string cmykProfile = baton->iccProfilePath + "USWebCoatedSWOP.icc";
|
std::string cmykProfile = baton->iccProfilePath + "USWebCoatedSWOP.icc";
|
||||||
VipsImage *transformed;
|
VipsImage *transformed;
|
||||||
if (vips_icc_transform(image, &transformed, srgbProfile.c_str(), "input_profile", cmykProfile.c_str(), NULL)) {
|
if (vips_icc_transform(image, &transformed, srgbProfile.c_str(), "input_profile", cmykProfile.c_str(), NULL)) {
|
||||||
@@ -571,22 +572,24 @@ class ResizeWorker : public NanAsyncWorker {
|
|||||||
image = gammaDecoded;
|
image = gammaDecoded;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert colour space to either sRGB or RGB-with-profile, if not already
|
// Convert image to sRGB, if not already
|
||||||
if (image->Type != VIPS_INTERPRETATION_sRGB) {
|
if (image->Type != VIPS_INTERPRETATION_sRGB) {
|
||||||
|
// Switch intrepretation to sRGB
|
||||||
VipsImage *rgb;
|
VipsImage *rgb;
|
||||||
if (baton->withMetadata && HasProfile(image)) {
|
|
||||||
// Convert to device-dependent RGB using embedded profile of input
|
|
||||||
if (vips_icc_export(image, &rgb, NULL)) {
|
|
||||||
return Error(baton, hook);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Convert to device-independent sRGB
|
|
||||||
if (vips_colourspace(image, &rgb, VIPS_INTERPRETATION_sRGB, NULL)) {
|
if (vips_colourspace(image, &rgb, VIPS_INTERPRETATION_sRGB, NULL)) {
|
||||||
return Error(baton, hook);
|
return Error(baton, hook);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
vips_object_local(hook, rgb);
|
vips_object_local(hook, rgb);
|
||||||
image = rgb;
|
image = rgb;
|
||||||
|
// Tranform colours from embedded profile to sRGB profile
|
||||||
|
if (baton->withMetadata && HasProfile(image)) {
|
||||||
|
VipsImage *profiled;
|
||||||
|
if (vips_icc_transform(image, &profiled, srgbProfile.c_str(), "embedded", TRUE, NULL)) {
|
||||||
|
return Error(baton, hook);
|
||||||
|
}
|
||||||
|
vips_object_local(hook, profiled);
|
||||||
|
image = profiled;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !(VIPS_MAJOR_VERSION >= 7 && VIPS_MINOR_VERSION >= 40 && VIPS_MINOR_VERSION >= 5)
|
#if !(VIPS_MAJOR_VERSION >= 7 && VIPS_MINOR_VERSION >= 40 && VIPS_MINOR_VERSION >= 5)
|
||||||
|
|||||||
17
test/fixtures/Wikimedia-logo.svg
vendored
Normal file
17
test/fixtures/Wikimedia-logo.svg
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" standalone="yes"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
|
||||||
|
id="Wikimedia logo"
|
||||||
|
viewBox="-599 -599 1198 1198" width="1024" height="1024">
|
||||||
|
<defs>
|
||||||
|
<clipPath id="mask">
|
||||||
|
<path d="M 47.5,-87.5 v 425 h -95 v -425 l -552,-552 v 1250 h 1199 v -1250 z" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g clip-path="url(#mask)">
|
||||||
|
<circle id="green parts" fill="#396" r="336.5"/>
|
||||||
|
<circle id="blue arc" fill="none" stroke="#069" r="480.25" stroke-width="135.5" />
|
||||||
|
</g>
|
||||||
|
<circle fill="#900" cy="-379.5" r="184.5" id="red circle"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 692 B |
BIN
test/fixtures/free-gearhead-pack.psd
vendored
Normal file
BIN
test/fixtures/free-gearhead-pack.psd
vendored
Normal file
Binary file not shown.
2
test/fixtures/index.js
vendored
2
test/fixtures/index.js
vendored
@@ -21,6 +21,8 @@ module.exports = {
|
|||||||
inputWebP: getPath('4.webp'), // http://www.gstatic.com/webp/gallery/4.webp
|
inputWebP: getPath('4.webp'), // http://www.gstatic.com/webp/gallery/4.webp
|
||||||
inputTiff: getPath('G31D.TIF'), // http://www.fileformat.info/format/tiff/sample/e6c9a6e5253348f4aef6d17b534360ab/index.htm
|
inputTiff: getPath('G31D.TIF'), // http://www.fileformat.info/format/tiff/sample/e6c9a6e5253348f4aef6d17b534360ab/index.htm
|
||||||
inputGif: getPath('Crash_test.gif'), // http://upload.wikimedia.org/wikipedia/commons/e/e3/Crash_test.gif
|
inputGif: getPath('Crash_test.gif'), // http://upload.wikimedia.org/wikipedia/commons/e/e3/Crash_test.gif
|
||||||
|
inputSvg: getPath('Wikimedia-logo.svg'), // http://commons.wikimedia.org/wiki/File:Wikimedia-logo.svg
|
||||||
|
inputPsd: getPath('free-gearhead-pack.psd'), // https://dribbble.com/shots/1624241-Free-Gearhead-Vector-Pack
|
||||||
|
|
||||||
outputJpg: getPath('output.jpg'),
|
outputJpg: getPath('output.jpg'),
|
||||||
outputPng: getPath('output.png'),
|
outputPng: getPath('output.png'),
|
||||||
|
|||||||
@@ -400,6 +400,32 @@ describe('Input/output', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Convert SVG to PNG', function(done) {
|
||||||
|
sharp(fixtures.inputSvg)
|
||||||
|
.resize(100, 100)
|
||||||
|
.png()
|
||||||
|
.toFile(fixtures.path('output.svg.png'), function(err, info) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual('png', info.format);
|
||||||
|
assert.strictEqual(100, info.width);
|
||||||
|
assert.strictEqual(100, info.height);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Convert PSD to PNG', function(done) {
|
||||||
|
sharp(fixtures.inputPsd)
|
||||||
|
.resize(320, 240)
|
||||||
|
.png()
|
||||||
|
.toFile(fixtures.path('output.psd.png'), function(err, info) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual('png', info.format);
|
||||||
|
assert.strictEqual(320, info.width);
|
||||||
|
assert.strictEqual(240, info.height);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
if (semver.gte(sharp.libvipsVersion(), '7.40.0')) {
|
if (semver.gte(sharp.libvipsVersion(), '7.40.0')) {
|
||||||
it('Load TIFF from Buffer [libvips ' + sharp.libvipsVersion() + '>=7.40.0]', function(done) {
|
it('Load TIFF from Buffer [libvips ' + sharp.libvipsVersion() + '>=7.40.0]', function(done) {
|
||||||
var inputTiffBuffer = fs.readFileSync(fixtures.inputTiff);
|
var inputTiffBuffer = fs.readFileSync(fixtures.inputTiff);
|
||||||
|
|||||||
@@ -122,6 +122,15 @@ describe('Image metadata', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Non-existent file in, Promise out', function(done) {
|
||||||
|
sharp('fail').metadata().then(function(metadata) {
|
||||||
|
throw new Error('Non-existent file');
|
||||||
|
}, function (err) {
|
||||||
|
assert.ok(!!err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('Stream in, Promise out', function(done) {
|
it('Stream in, Promise out', function(done) {
|
||||||
var readable = fs.createReadStream(fixtures.inputJpg);
|
var readable = fs.createReadStream(fixtures.inputJpg);
|
||||||
var pipeline = sharp();
|
var pipeline = sharp();
|
||||||
|
|||||||
Reference in New Issue
Block a user