gm node.js 无法调整大文件大小的图像
gm node.js can't resize images of large filesize
我在 linux 服务器上为 node.js 使用 gm express.js。它适用于小于 2MB 文件大小的图像。但是一旦超过,代码就会停止工作。这是代码
gm('public/'+article.page.image)
.resize(width,height)
.quality(80)
.write('public/article_image/'+ folder + '/' + "something.jpg", function(err){
if (err){
console.log('error occurred')
console.log(err)
}
else{
console.log('resized image 16')
somefunction(16, true);
}
})
我遇到的错误是
Error: Command failed:
at ChildProcess.onExit (/root/patarboi/node_modules/gm/lib/command.js:301:17)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:920:16)
at Socket.<anonymous> (internal/child_process.js:351:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:497:12) code: null, signal: 'SIGSEGV'
如何解决?
我们应该使用pipe
来处理大文件以避免将整个文件读入内存。
let writeStream = fs.createWriteStream('public/article_image/' + folder + '/' + "something.jpg");
writeStream.on('finish', () => {
console.log('resized image 16')
somefunction(16, true);
});
writeStream.on('error', (errr) => {
console.log('error occurred')
console.log(err)
});
gm('public/' + article.page.image)
.resize(width, height)
.quality(80)
.stream()
.on('error', (err) => {
console.log('read stream err', er)
})
.pipe(writeStream);
问题是由于imagemagick的分割错误引起的。我使用的是旧版本的 imagemagick。而不是这样安装。
sudo apt-get install ImageMagick
从 here 找到最新版本的 imagemagick。然后像下面这样安装它。目前最新版本为ImageMagick-7.0.7-22.tar.gz。首先建立依赖关系。然后从 url.
中获取
$sudo apt-get install build-essential checkinstall && apt-get build-dep imagemagick -y
$sudo wget http://www.imagemagick.org/download/ImageMagick-7.0.7-22.tar.gz
现在解压
$sudo tar xzvf 7.0.7-22.tar.gz
移动到目录
cd ImageMagick-7.0.7-22
检查配置
。/配置
现在构建代码
make clean
make
checkinstall
ldconfig /usr/local/lib
检查是否安装完成
convert -version
我在 linux 服务器上为 node.js 使用 gm express.js。它适用于小于 2MB 文件大小的图像。但是一旦超过,代码就会停止工作。这是代码
gm('public/'+article.page.image)
.resize(width,height)
.quality(80)
.write('public/article_image/'+ folder + '/' + "something.jpg", function(err){
if (err){
console.log('error occurred')
console.log(err)
}
else{
console.log('resized image 16')
somefunction(16, true);
}
})
我遇到的错误是
Error: Command failed:
at ChildProcess.onExit (/root/patarboi/node_modules/gm/lib/command.js:301:17)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:920:16)
at Socket.<anonymous> (internal/child_process.js:351:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:497:12) code: null, signal: 'SIGSEGV'
如何解决?
我们应该使用pipe
来处理大文件以避免将整个文件读入内存。
let writeStream = fs.createWriteStream('public/article_image/' + folder + '/' + "something.jpg");
writeStream.on('finish', () => {
console.log('resized image 16')
somefunction(16, true);
});
writeStream.on('error', (errr) => {
console.log('error occurred')
console.log(err)
});
gm('public/' + article.page.image)
.resize(width, height)
.quality(80)
.stream()
.on('error', (err) => {
console.log('read stream err', er)
})
.pipe(writeStream);
问题是由于imagemagick的分割错误引起的。我使用的是旧版本的 imagemagick。而不是这样安装。
sudo apt-get install ImageMagick
从 here 找到最新版本的 imagemagick。然后像下面这样安装它。目前最新版本为ImageMagick-7.0.7-22.tar.gz。首先建立依赖关系。然后从 url.
中获取$sudo apt-get install build-essential checkinstall && apt-get build-dep imagemagick -y
$sudo wget http://www.imagemagick.org/download/ImageMagick-7.0.7-22.tar.gz
现在解压
$sudo tar xzvf 7.0.7-22.tar.gz
移动到目录
cd ImageMagick-7.0.7-22
检查配置 。/配置 现在构建代码
make clean
make
checkinstall
ldconfig /usr/local/lib
检查是否安装完成
convert -version