Размытый текст в 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:
- Использование ImageMagick's
convert
(который использует Ghostscript за вашей спиной как "делегат" для обработки ввода PDF) - Использование Ghostscript напрямую
1. Использование convert
с -density 720
Я использовал эту команду для создания PNG из PDF:
convert -density 720 tikz.pdf 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:
Это размер файла 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 (при аналогичном уровне масштабирования):
Размеры текста, используемые для аннотации координатной оси, составляют всего около 10 точек. Если вы растеризуете их, вы получите четко видимую пикселизацию при любом разрешении ниже 400 PPI, возможно даже выше...
Мой Ghostscript - это самокомпилируемый 9.17 GIT PRERELEASE
, Мой ImageMagick это 6.9.0-0 Q16 x86_64
,