当使用 tikz 生成 pdf 文件时,我使用以下命令将其转换为 1920x1080 png 文件。
convert -density 300 exam.pdf -resize 1920x1080 out.png
但是如果原始pdf不是16:9的比例,那么输出文件将不会完全符合预期(例如1080x1080)。
我如何指示 tikz 输出具有固定比例的 pdf(例如 16:9)。
顺便说一句,这种方法将使用调整大小,这种转换会丢失图像质量吗?如何保持最佳质量将 pdf 转换为 png?
例如:
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\begin{document}
\tiny\begin{tikzpicture}[]
\draw (0,0) circle (5cm);
\end{tikzpicture}
\end{document}
这个圆圈将生成一个 10cmx10cm 的 pdf,所以默认比例是 1:1。我需要的圆圈仍然是一个圆圈,但比例是 16:9。
答案1
这是一段对称扩展边界框以匹配目标宽度:高度比的代码。它以一种尊重独立类可能产生的额外边距的方式执行此操作,但也适用于非独立文档。
\documentclass[tikz,border=2mm]{standalone}
\makeatletter
\tikzset{fixed ratio/.code={\def\tikz@pft##1:##2;{\edef\pgfutil@tempx{##1}\edef\pgfutil@tempy{##2}}%
\expandafter\tikz@pft#1;%
\tikzset{execute at end picture={%
\ifcsname sa@border@right\endcsname
\pgfmathsetmacro\pgfutil@tempa{((\pgf@picmaxx+\sa@border@right-\pgf@picminx+\sa@border@left)/%
(\pgf@picmaxy+\sa@border@top-\pgf@picminy+\sa@border@bottom)}%
\else
\pgfmathsetmacro\pgfutil@tempa{((\pgf@picmaxx-\pgf@picminx)/(\pgf@picmaxy-\pgf@picminy)}%
\fi
\pgfmathsetmacro\pgfutil@tempb{(\pgfutil@tempx/\pgfutil@tempy)}%
\ifdim\pgfutil@tempa pt=\pgfutil@tempb pt\relax
\else
\ifdim\pgfutil@tempb pt>\pgfutil@tempa pt\relax
% target ratio greater than actual
\pgfmathsetmacro\pgfutil@tempc{-(\pgf@picmaxx-\pgf@picminx)%
+\pgfutil@tempb*(\pgf@picmaxy-\pgf@picminy)}%
\path ([xshift=-0.5*\pgfutil@tempc]current bounding box.west)
([xshift=0.5*\pgfutil@tempc]current bounding box.east);
\else
% target ratio smaller than actual
\pgfmathsetmacro\pgfutil@tempc{-(\pgf@picmaxy-\pgf@picminy)%
+(\pgf@picmaxx-\pgf@picminx)/\pgfutil@tempb}%
\path ([yshift=-0.5*\pgfutil@tempc]current bounding box.south)
([yshift=0.5*\pgfutil@tempc]current bounding box.north);
\fi
\fi
}%
}}
}
\makeatother
\begin{document}
\begin{tikzpicture}[fixed ratio=16:9]
\draw (0,0) circle [radius=5cm];
\end{tikzpicture}
\begin{tikzpicture}[fixed ratio=9:16]
\draw (0,0) circle [radius=5cm];
\end{tikzpicture}
\end{document}
答案2
如果知道最终结果的尺寸,您可以使用可以调整 TiKZ 图形大小tcolorbox
的添加TikZ
来调整所需路径。此路径可以固定最终尺寸。一些示例:
\documentclass[tikz, border=2mm]{standalone}
\usepackage[skins]{tcolorbox}
\begin{document}
\begin{standalone}
\begin{tikzpicture}
\path[fill zoom picture={%
\draw (0,0) circle (5cm);}] (0,0) rectangle ++(16,9);
\end{tikzpicture}
\begin{tikzpicture}
\path[fill zoom picture={%
\draw (0,0) circle (5cm);}] (0,0) rectangle ++(10,10);
\end{tikzpicture}
\begin{tikzpicture}
\path[fill zoom picture={%
\draw (0,0) circle (5cm);}] (0,0) rectangle ++(20,25);
\end{tikzpicture}
\end{standalone}
\end{document}
答案3
另一个解决方案是做一些数学计算:
\documentclass[border=0mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\tiny\begin{tikzpicture}[]
\draw (0,0) circle (5cm);
% keep ratio
\def\ratio{16/9}
\path let \p1=(current bounding box.center),
\p2=(current bounding box.east),
\p3=(current bounding box.north),
\p4=(current bounding box.west),
\p5=(current bounding box.south),
\n1={\y3-\y1},
\n2={\n1*\ratio},
\n3={\y5 - \y1},
\n4={\n3*\ratio}
in
[use as bounding box] (\n4,\y5) rectangle (\n2,\y3);
\end{tikzpicture}
\end{document}
顺便说一句,不要添加边框,因为它会影响比例。