ghostscript downsampling of pdf images, downsample

2019-08-01 14:48发布

I issue the following command:

gs \
-o downsampled.pdf \
-sDEVICE=pdfwrite \
-dDownsampleColorImages=true \
-dColorImageResolution=180 \
-dColorImageDownsampleThreshold=1.0 \

And get the following errors:

Subsample filter does not support non-integer downsample factor (1.994360)
Failed to initialise downsample filter, downsampling aborted

(on some pages)

and:

Subsample filter does not support non-integer downsample factor (2.000029)
Failed to initialise downsample filter, downsampling aborted

Originally I tried to downsample to 150dpi, which gave the error with factor (2.40????), meaning multiple errors, where the last few digits are different for different pages. So I guessed that images are approximately 150*2.4 = 360 dpi. So I try downsampling to 180. But it seems the images are all slightly off?

  1. Is there a way to specify the factor instead of the dpi?
  2. Is there a way to "round" the factor?

1条回答
爷、活的狠高调
2楼-- · 2019-08-01 15:11

No, there is no way to specify the factor (this is the Adobe specification for distiller params, we are currently limited to those). You cannot specify an approximation for rounding either, without modifying the source code.

You can use a different downsampling algorithm.

[much later]

In fact I just checked the current code, and you must be using an old version of Ghostscript.

The current default downsampling filter is the Bicubic filter, and if you do force the Subsample filter, then the code checks to see if the downsample factor requested is an integer.

If the factor is not an integer but is within 0.1 of an integer then it forces factor to the nearest integer.

If its outside 0.1 of an integer factor then it aborts the subsample filter and switches to Bicubic.

I'd recommend upgrading.

[later edit]

So avoiding the bogus ColorDownsampleOption, the problem is actually not colour images at all, its monochrome images, or more precisely in your case, imagemasks.

I set up this command line:

gs 
    -sDEVICE=pdfwrite \
    -sOutputFile=pdfwrite.pdf \
    -dDownsampleColorImages=true \
    -dDownsampleGrayImages=true \
    -dDownsampleMonoImages=true \
    -dColorImageDownsampleThreshold=1 \
    -dGrayImageDownsampleThreshold=1 \
    -dMonoImageDownsampleThreshold=1 \
    -dColorImageDownsampleType=/Bicubic \
    -dGrayImageDownsampleType=/Bicubic \
    -dMonoImageDownsampleType=/Bicubic \
    -dColorImageResolution=72 \
    -dGrayImageResolution=72 \
    -dMonoImageResolution=100 "gs sample.pdf"

And that produces an error message that the only filter available for monochrome images is Subsample, followed by the error messages you quote about the imprecise factor.

I guess basically this makes my point that an example file is pretty much vital in order to investigate problems.

So there is a problem there, and I will look into it, obviously for monochrome images it should be clamped to the nearest integer resolution, since no other filter is possible. However, Gray and Colour images do work as expected.

Reporting a bug, as I suggested in an early comment would probably have got to this point much sooner. I'd still suggest you do that, so that this is not overlooked.

You may be interested to note that, for me, the resulting file when I don't downsample monochrome images, but do downsample the others, as per the command line above, is 785KB the original being 2.5MB.

查看更多
登录 后发表回答