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 ParallelImageMagick,您可以像这样重新压缩所有 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 函数,这当然无法处理它。