Размытый текст в PNG-изображении, конвертированный из PDF через TikZ и автономный пакет

У меня проблема с преобразованием PDF-изображения, сгенерированного pdflatex, в изображение PNG с помощью отдельного пакета.

Точечный рендеринг текста в преобразованном изображении (PDF->PS->PNG через gs и ImageMagick?) Ужасно размыт и хуже по качеству (резкость, четкость и т. Д.) По сравнению с исходным PDF-файлом с выводом на экран.

Я проверил эти сообщения StackExchange:

и руководствовался при настройке моего рабочего процесса автономным руководством по пакетам. Но после значительной экспериментальной настройки различных параметров преобразования в приведенном ниже коде я не смог улучшить качество выводимого изображения PNG.

Пример настроек, с которыми я играл:

  • плотность (увеличение dpi)
  • размер (увеличить / уменьшить размеры)
  • Размеры ширины / высоты изображения TikZ (оптимум не найден, но если он слишком мал, ширина изображения PNG не равна той, которая указана среди параметров класса документа)
  • с использованием command={} вариант, я также играл с такими параметрами, как -quality и - установить цветовое пространство RGB (хотя я действительно не знал, что я делал здесь)

Другой подход, который я выбрал, состоит в том, чтобы попытаться установить ширину и высоту изображения TikZ (в см) таким образом, чтобы они соответствовали размерам преобразования, указанным среди параметров класса документа (с использованием преобразователя dpi + пиксель -> см).

Ничего из этого не сработало! Поэтому любая помощь в преобразовании из PDF в PNG с использованием отдельного пакета, который сохраняет четкость и четкость визуализированного текста на изображении, будет очень цениться.

Для справки я использую следующие версии различных систем / приложений:

  • Windows 7
  • MiKTeX 2.9
  • TeXnicCenter
  • 9.09
  • ImageMagick 6.8.6 Q16 (32-разрядная версия)
  • автономный пакет установлен с помощью менеджера пакетов MiKTeX в конце августа 2013 г.

\documentclass[preview,convert={density=300,size=900x300,outext=.png}]{standalone}

\usepackage{tikz}
\usepackage{pgf}
\usepackage{pgfplots}

\begin{document}

\pgfplotsset{every x tick label/.style={at={(1,0)}, yshift=-0.15cm, xshift=-0.0cm,         inner sep=0pt, font=\normalsize}}

\begin{tikzpicture}
\begin{axis}[
no markers, domain=-2.1*pi:2.1*pi, samples=1000,
width=30.0cm,
height=10.0cm,
axis x line*=middle,
x axis line style={densely dotted, opacity=0.75},
axis y line*=middle,
y axis line style={densely dotted, opacity=0.75},
ymin=-1.1,
ymax=1.1,
xtick={-6.28318530717959, -5.65486677646163, -5.02654824574367, -4.71238898038469,     -4.39822971502571, -3.76991118430775, -3.14159265358979, -2.51327412287183, -1.88495559215388, -1.5707963267949, -1.25663706143592, -0.628318530717959, 0, 0.628318530717959, 1.25663706143592, 1.5707963267949, 1.88495559215388, 2.51327412287183, 3.14159265358979, 3.76991118430775, 4.39822971502571, 4.71238898038469, 5.02654824574367,     5.65486677646163, 6.28318530717959},
xticklabels={$-2\pi$, $-\frac{9\pi}{5}$, $-\frac{8\pi}{5}$, $-\frac{3\pi}{2}$, $-\frac{7\pi}{5}$, $-\frac{6\pi}{5}$, $-\pi$, $-\frac{4\pi}{5}$, $-\frac{3\pi}{5}$, $-\frac{\pi}{2}$, $-\frac{2\pi}{5}$, $-\frac{\pi}{5}$, $0$, $\frac{\pi}{5}$, $\frac{2\pi}{5}$, $\frac{\pi}{2}$, $\frac{3\pi}{5}$, $\frac{4\pi}{5}$, $\pi$, $\frac{6\pi}{5}$,     $\frac{7\pi}{5}$, $\frac{\pi}{2}$, $\frac{8\pi}{5}$, $\frac{9\pi}{5}$, $2\pi$},
ytick=\empty,
enlargelimits=false, clip=true, axis on top]
\addplot [line width=0.5,cyan!50!black] {sin(deg(5*x))*cos(deg(x)};
\end{axis}
\end{tikzpicture}
\end{document}

1 ответ

Решение

Чтобы исследовать эту проблему, я сначала создал PDF из вашего размещенного кода tikz/tex (после того, как скопировал его в tikz.tex файл):

pdflatex tikz.tex
pdflatex tikz.tex

Полученный PDF-файл содержит иллюстрацию в виде векторной графики, а не растровое изображение. Следовательно, pdfimages -list НЕ обнаружит это.

Затем я протестировал два способа преобразования полученного PDF-файла в PNG:

  1. Использование ImageMagick's convert (который использует Ghostscript за вашей спиной как "делегат" для обработки ввода PDF)
  2. Использование Ghostscript напрямую

1. Использование convert с -density 720

Я использовал эту команду для создания PNG из PDF:

convert -density 720 tikz.pdf tikz1.png

Вот результат:

tikz1.png

Почему я использовал -density 720? Поскольку 720 PPI является разрешением по умолчанию, которое Ghostscript использует при создании PDF-файлов (если вы не переопределите этот параметр по умолчанию, предоставив свой собственный с помощью -rNxM на gs командная строка)...

Полученное изображение имеет размер 374 kB (PDF был 49 kB) и width x height размерность 8060 x 2390 пиксели. Любая пикселизация (которая будет происходить всякий раз, когда вы создаете PNG!) Не сразу видна в этом разрешении.

Время выполнения цикла, выполняющего эту команду 10 раз, составило 47 секунд.

2. Использование Ghostscript напрямую

Для достижения прямого преобразования PNG с помощью команды Ghostscript я использовал:

gs -o tikz-gs.png    -sDEVICE=pngalpha     \
   -dAlignToPixels=0 -dGridFitTT=2         \
   -dTextAlphaBits=4 -dGraphicsAlphaBits=4 \
    tikz.pdf

Вот результирующий PNG:

tikz-гс

Это размер файла 308 kB с размерами 8060 x 2390 пиксели.

Время выполнения цикла, выполняющего эту команду 10 раз, составило 17 секунд.

Анализ

Входной файл PDF: размеры компонентов

Посмотрев исходный код файла PDF после распаковки всех объектов, я получил следующую статистику:

Total size of 5 embedded Type1 fonts................................ 38615 Bytes
Total size of v`/Contents` stream (mainly used by vector drawing)... 32630 Bytes
Rest of PDF structure ("overhead", if you want).....................  5827 Bytes
---------------------------------------------------------------------------------
Total size of PDF (after uncompressing objects)..................... 77072 Bytes

Шрифты Type 1 (т.е. PostScript) шрифты, в соответствии с выводом pdffonts, Все они встроены как подмножества:

pdffonts tikz.pdf
 name                       type         encoding         emb sub uni object ID
 -------------------------- ------------ ---------------- --- --- --- ---------
 FXXUVH+CMSY10              Type 1       Builtin          yes yes no       7  0
 BCSIZL+CMR10               Type 1       Builtin          yes yes no       8  0
 SFJZUV+CMMI10              Type 1       Builtin          yes yes no       9  0
 WPSSUY+CMR7                Type 1       Builtin          yes yes no      10  0
 SYHYOI+CMMI7               Type 1       Builtin          yes yes no      11  0

Так как...

  • ... Шрифты (если они не растровые шрифты) - это другой способ очень эффективно кодировать векторные фигуры для глифов, изображающих текстовые символы,

  • ... Шрифты + векторные рисунки составляют более 90% от общего размера PDF,

... в аду нет способа создать растровое изображение PNG из (сжатого) файла PDF 49 kB (несжатый размер был 75 kB), который не в несколько раз больше исходного PDF-файла, если вы хотите избежать видимых "пикселизации" и "размытия".

Даже если вы используете разрешение 720 PPI (что создает 308 kB размером PNG), вы все равно увидите пикселизацию, как только начнете увеличивать масштаб. Такая пикселизация не происходит с PDF (потому что все его формы определены как векторы).

Следующие три изображения являются скриншотами:

  • сверху, из tikz.pdf файл с высоким уровнем масштабирования (~1000%),
  • центр, от tikz.png созданный с 720 PPI (при аналогичном уровне масштабирования),
  • снизу, от tikz72.png создан с 72 PPI (при аналогичном уровне масштабирования):

tikz.pdf

tikz.png

tikz72.png

Размеры текста, используемые для аннотации координатной оси, составляют всего около 10 точек. Если вы растеризуете их, вы получите четко видимую пикселизацию при любом разрешении ниже 400 PPI, возможно даже выше...


Мой Ghostscript - это самокомпилируемый 9.17 GIT PRERELEASE , Мой ImageMagick это 6.9.0-0 Q16 x86_64 ,

Другие вопросы по тегам