Gulp:当一些图像被破坏时,图像有损压缩

时间:2015-11-11 20:54:35

标签: imagemagick gulp gulp-imagemin

我有一组~18,000个jpg文件,我需要优化/重新压缩。

我几乎尝试了每个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张图像进行排序,并希望能够找出具有“不支持的图像格式”的图像。坚持下去,我马上回来。
现在来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(它在设置中有“有损”),但在真正庞大的图像集上,由于内部错误,它会在中间的某个时间静默停止处理。

无论如何我还想保留gulp工作流程。

3 个答案:

答案 0 :(得分:3)

您可以使用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'));
});

答案 1 :(得分:1)

使用GNU ParallelImageMagick,您可以重新压缩所有JPEG图像并删除EXIF数据,如下所示:

parallel convert {} -quality 70% -strip {} ::: *.jpg

两个{}表示输入文件名和输出文件名。请在您的文件的COPY上尝试此操作,并检查您是否对结果感到满意,并且在您对真实数据执行操作之前删除版权和EXIF数据。

如果你有太多的文件要扩展shell,你可以通过stdin这样抽取文件名:

find TOPDIR -iname *.jpg | parallel convert {} -quality 70% -strip {}

我自己不使用pngcrush,但假设你可以这样做:

parallel pngcrush {} {} ::: *.png

如果您想观看进度表并想要预估到达时间,请在--eta后添加parallel

parallel --eta pngcrush {} {} ::: *.png

答案 2 :(得分:0)

是的,也许这有助于某人: 还要花几个小时来围绕这些奇怪的imagemagick错误消息。 在我的例子中,对源图像路径的简单校正解决了它:

gulp.src('path/to/imagesrc/*')gulp.src('path/to/imagesrc/*.jpg')

我的gulp任务会立即在imagesrc文件夹中创建一个缩略图文件夹。这就是问题所在。 *选择器包含这个缩略图文件夹并将其传送到imagemagick函数,这当然无法处理它。