Преобразование команды ImageMagick в GraphicsMagick - PullRequest
0 голосов
/ 24 марта 2020

Чтобы увеличить скорость конвертации и избежать ошибок, я хотел бы преобразовать следующую команду ImageMagick в команду GraphicsMagick.

При этом PDF-файл любого размера передается до 300 DPI, а затем преобразуется. этот PDF в высококачественный PDF 8,5x11 в ImageMagick.

convert -density 300 ~/Desktop/10x11.pdf -density 300 -resize 2550x3300 -gravity center -extent 2550x3300 -colorspace Gray ~/Desktop/8.5x11.pdf

При выполнении той же команды в GraphicsMagick получается PDF размером 35x45 дюймов. Это потому, что интерпретируемая плотность окончательного PDF-файла по какой-то причине равна 72 (а не 300).

gm convert -density 300 ~/Desktop/10x11.pdf -density 300 -resize 2550x3300 -gravity center -extent 2550x3300 -colorspace Gray ~/Desktop/35x45.pdf

Следующее дает (размытый) 8,5x11 дюймовый PDF.

gm convert -density 300 ~/Desktop/10x11.pdf -density 300 -resize 612x792 -gravity center -extent 612x792 -colorspace Gray ~/Desktop/8.5x11.pdf

Есть идеи, что я здесь делаю неправильно? Целью является создание четких 8,5x11-дюймовых PDF-файлов с использованием GraphicsMagick.

1 Ответ

2 голосов
/ 27 марта 2020

Я понимаю, что вы просили решение для графики, но если вы открыты для других библиотек, libvips обычно быстрее в таких задачах.

Imagemagick и Graphicsmagick используют Ghostscript для PDF рендеринг. Вместо этого libvips использует poppler: эта библиотека может генерировать высококачественные сглаженные растровые изображения из PDF-файлов любого размера. Вам не нужно рендерить в высоком разрешении, а затем уменьшать его размер.

На этом ноутбуке я вижу:

$ /usr/bin/time -f %M:%e convert -density 300 ISO_12233-reschart.pdf -density 300 -resize 2550x3300 -gravity center -extent 2550x3300 -colorspace Gray x.pdf
250460:2.51

Итак, 250 МБ памяти и 2,5 с для создания PDF.

Эквивалент libvips будет:

#!/bin/bash

vips thumbnail $1 t1.v 2550 --height 3300 
vips colourspace t1.v t2.v b-w
# drop any alpha channels
if [ $(vipsheader -f bands t2.v) -gt 1 ]; then
        vips extract_band t2.v t3.v 0
        mv t3.v t2.v
fi
vips gravity t2.v t3.v centre 2550 3300 --extend white
vips magicksave t3.v $2

Я вижу:

$ /usr/bin/time -f %M:%e ./process.sh ISO_12233-reschart.pdf x.pdf
110168:1.05

110 МБ памяти и 1,05 с.

Вы уверены, что вам нужен PDF вывод? Генерируемые вами PDF-файлы не являются «настоящими» PDF-файлами, а представляют собой растровые изображения с оболочкой PDF. Вместо этого я бы использовал PNG:

#!/bin/bash

vips thumbnail $1 t1.v 2550 --height 3300 
vips colourspace t1.v t2.v b-w
# drop any alpha channels
if [ $(vipsheader -f bands t2.v) -gt 1 ]; then
        vips extract_band t2.v t3.v 0
        mv t3.v t2.v
fi
vips gravity t2.v $2 centre 2550 3300 --extend white

Теперь я вижу:

$ /usr/bin/time -f %M:%e ./process.sh ~/pics/ISO_12233-reschart.pdf x.png
58324:0.59

60 МБ памяти и 0,6 с.

Если вы можете использовать что-то вроде Python вместо bash, вы можете получить его еще немного быстрее.

#!/usr/bin/python3

import sys
import pyvips

x = pyvips.Image.thumbnail(sys.argv[1], 2550, height=3300)
x = x.colourspace("b-w")
if x.bands > 1:
    x = x.extract_band(0)
x = x.gravity("centre", 2550, 3300, extend="white")
x.write_to_file(sys.argv[2])

Теперь 0,5 с, потому что нет временных файлов.

...