Gulp: 图像损坏时的有损重新压缩
Gulp: lossy recompression of images when some are broken
我有一组约 18,000 张 jpg 文件需要 optimize/recompress。
我尝试了几乎所有 gulp 图像优化插件,但每个插件在某个时候都会出现错误,但没有给出错误原因的建议。
这是 gulp-image-resize
的结尾:
events.js:141
throw er; // Unhandled 'error' event
^
Error: Error: Command failed: gm identify: No decode delegate for this image format (/var/folders/ns/85cnwvcx5ysb7jzr8hh_k4r80000gn/T/gmROZu8m).
gm identify: Request did not return an image.
at finish (/Users/mvasin/Sites/process images/node_modules/gulp-gm/index.js:40:21)
at gm. (/Users/mvasin/Sites/process images/node_modules/async/lib/async.js:485:30)
at emitMany (events.js:108:13)
at gm.emit (events.js:182:7)
at gm. (/Users/mvasin/Sites/process images/node_modules/gm/lib/getters.js:70:16)
at cb (/Users/mvasin/Sites/process images/node_modules/gm/lib/command.js:318:16)
at ChildProcess.proc.on.onExit (/Users/mvasin/Sites/process images/node_modules/gm/lib/command.js:293:9)
at emitTwo (events.js:87:13)
at ChildProcess.emit (events.js:172:7)
at maybeClose (internal/child_process.js:817:16)
这是 gulp-gm
的蓝屏:
events.js:141
throw er; // Unhandled 'error' event
^
Error: Stream yields empty buffer
at Socket. (/Users/mvasin/Sites/process images/node_modules/gm/lib/command.js:57:17)
at emitNone (events.js:72:20)
at Socket.emit (events.js:166:7)
at endReadableNT (_stream_readable.js:893:12)
at doNTCallback2 (node.js:429:9)
at process._tickCallback (node.js:343:17)
a228:process images mvasin$ gulp GraphicsMagick
gulp-responsive
:
events.js:141
throw er; // Unhandled 'error' event
^
Error: Input buffer contains unsupported image format
at Error (native)
gulp-sharp-resize
:
Unhandled rejection Error: Input buffer contains unsupported image format
at Error (native)
漂亮!我将整理我所有的 18,000 张图片,希望能找出 'unsupported image format' 的那一张。留下来,我马上回来。
现在 imagemin-jpeg-recompress
:
events.js:141
throw er; // Unhandled 'error' event
^
Error: Unsupported color conversion request
at ChildProcess. (/Users/mvasin/Sites/process images/node_modules/imagemin-jpeg-recompress/index.js:101:11)
at emitTwo (events.js:87:13)
at ChildProcess.emit (events.js:172:7)
at maybeClose (internal/child_process.js:817:16)
at Socket. (internal/child_process.js:319:11)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at Pipe._onclose (net.js:469:12)
你明白了...
gulp-imagemin
也会因错误而停止。
我尝试求助于桌面 mac 应用程序 ImageOptim(它在设置的深处有 'lossy'),但是在非常大的图像集上,由于内部原因,它会在中间的某个时候静静地停止处理错误。
无论如何我都想保留 gulp 工作流程。
使用 GNU Parallel
和 ImageMagick
,您可以像这样重新压缩所有 JPEG 图像并剥离 EXIF 数据:
parallel convert {} -quality 70% -strip {} ::: *.jpg
两个{}
代表输入文件名和输出文件名。请在您的文件的副本上尝试此操作,并检查您是否对结果以及版权和 EXIF 数据是否满意,然后再对您的真实数据进行操作。
如果 shell 需要扩展的文件太多,您可以像这样通过 stdin
将文件名输入:
find TOPDIR -iname *.jpg | parallel convert {} -quality 70% -strip {}
我自己不使用 pngcrush
,但假设您可以:
parallel pngcrush {} {} ::: *.png
如果您喜欢看进度表并想要预计到达时间,请在 parallel
一词后添加 --eta
。
parallel --eta pngcrush {} {} ::: *.png
您可以使用 gulp-plumber 来防止在不正确的图像上停止 gulp 任务。
它还可以显示哪个图像导致错误。
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
gulp.task('images', function() {
return gulp.src('src/*.jpg')
.pipe($.plumber())
.pipe($.responsive({
...
}))
.pipe(gulp.dest('dist'));
});
嗯,也许这对某人有帮助:
还要花几个小时浏览这些奇怪的 imagemagick 错误消息。
在我的例子中,对源图像路径的简单修正解决了它:
gulp.src('path/to/imagesrc/*')
对比
gulp.src('path/to/imagesrc/*.jpg')
我的 gulp 围绕它的任务会立即在 imagesrc 文件夹中创建一个缩略图文件夹。这就是问题所在。 * 选择器包含此缩略图文件夹并将其通过管道传输到 imagemagick 函数,这当然无法处理它。
我有一组约 18,000 张 jpg 文件需要 optimize/recompress。
我尝试了几乎所有 gulp 图像优化插件,但每个插件在某个时候都会出现错误,但没有给出错误原因的建议。
这是 gulp-image-resize
的结尾:
events.js:141 throw er; // Unhandled 'error' event ^ Error: Error: Command failed: gm identify: No decode delegate for this image format (/var/folders/ns/85cnwvcx5ysb7jzr8hh_k4r80000gn/T/gmROZu8m). gm identify: Request did not return an image. at finish (/Users/mvasin/Sites/process images/node_modules/gulp-gm/index.js:40:21) at gm. (/Users/mvasin/Sites/process images/node_modules/async/lib/async.js:485:30) at emitMany (events.js:108:13) at gm.emit (events.js:182:7) at gm. (/Users/mvasin/Sites/process images/node_modules/gm/lib/getters.js:70:16) at cb (/Users/mvasin/Sites/process images/node_modules/gm/lib/command.js:318:16) at ChildProcess.proc.on.onExit (/Users/mvasin/Sites/process images/node_modules/gm/lib/command.js:293:9) at emitTwo (events.js:87:13) at ChildProcess.emit (events.js:172:7) at maybeClose (internal/child_process.js:817:16)
这是 gulp-gm
的蓝屏:
events.js:141 throw er; // Unhandled 'error' event ^ Error: Stream yields empty buffer at Socket. (/Users/mvasin/Sites/process images/node_modules/gm/lib/command.js:57:17) at emitNone (events.js:72:20) at Socket.emit (events.js:166:7) at endReadableNT (_stream_readable.js:893:12) at doNTCallback2 (node.js:429:9) at process._tickCallback (node.js:343:17) a228:process images mvasin$ gulp GraphicsMagick
gulp-responsive
:
events.js:141 throw er; // Unhandled 'error' event ^ Error: Input buffer contains unsupported image format at Error (native)
gulp-sharp-resize
:
Unhandled rejection Error: Input buffer contains unsupported image format at Error (native)
漂亮!我将整理我所有的 18,000 张图片,希望能找出 'unsupported image format' 的那一张。留下来,我马上回来。
现在 imagemin-jpeg-recompress
:
events.js:141 throw er; // Unhandled 'error' event ^ Error: Unsupported color conversion request at ChildProcess. (/Users/mvasin/Sites/process images/node_modules/imagemin-jpeg-recompress/index.js:101:11) at emitTwo (events.js:87:13) at ChildProcess.emit (events.js:172:7) at maybeClose (internal/child_process.js:817:16) at Socket. (internal/child_process.js:319:11) at emitOne (events.js:77:13) at Socket.emit (events.js:169:7) at Pipe._onclose (net.js:469:12)
你明白了...
gulp-imagemin
也会因错误而停止。
我尝试求助于桌面 mac 应用程序 ImageOptim(它在设置的深处有 'lossy'),但是在非常大的图像集上,由于内部原因,它会在中间的某个时候静静地停止处理错误。
无论如何我都想保留 gulp 工作流程。
使用 GNU Parallel
和 ImageMagick
,您可以像这样重新压缩所有 JPEG 图像并剥离 EXIF 数据:
parallel convert {} -quality 70% -strip {} ::: *.jpg
两个{}
代表输入文件名和输出文件名。请在您的文件的副本上尝试此操作,并检查您是否对结果以及版权和 EXIF 数据是否满意,然后再对您的真实数据进行操作。
如果 shell 需要扩展的文件太多,您可以像这样通过 stdin
将文件名输入:
find TOPDIR -iname *.jpg | parallel convert {} -quality 70% -strip {}
我自己不使用 pngcrush
,但假设您可以:
parallel pngcrush {} {} ::: *.png
如果您喜欢看进度表并想要预计到达时间,请在 parallel
一词后添加 --eta
。
parallel --eta pngcrush {} {} ::: *.png
您可以使用 gulp-plumber 来防止在不正确的图像上停止 gulp 任务。
它还可以显示哪个图像导致错误。
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
gulp.task('images', function() {
return gulp.src('src/*.jpg')
.pipe($.plumber())
.pipe($.responsive({
...
}))
.pipe(gulp.dest('dist'));
});
嗯,也许这对某人有帮助: 还要花几个小时浏览这些奇怪的 imagemagick 错误消息。 在我的例子中,对源图像路径的简单修正解决了它:
gulp.src('path/to/imagesrc/*')
对比
gulp.src('path/to/imagesrc/*.jpg')
我的 gulp 围绕它的任务会立即在 imagesrc 文件夹中创建一个缩略图文件夹。这就是问题所在。 * 选择器包含此缩略图文件夹并将其通过管道传输到 imagemagick 函数,这当然无法处理它。