我正在尝试使用 beamer 生成具有一些动画效果的多幅图像。在这里发布我的代码(代码内容不相关,只是为了方便演示我遇到的问题)。
\documentclass[border=5mm, convert, usenames, dvipsnames]{beamer}
\usepackage{tikz, pifont, xcolor}
\usepackage[export]{adjustbox}
\usetikzlibrary{shapes, positioning, calc, arrows.meta, fit, backgrounds}
\usetikzlibrary{overlay-beamer-styles}
\usetikzlibrary{scopes}
\usepackage{lmodern}
\usepackage{underscore}
\pgfkeys{/tikz/savenumber/.code 2 args={\global\edef#1{#2}}}
\newcommand*\mydots{{\fontsize{60}{80}\selectfont$\cdots$}}
\makeatletter
\geometry{papersize={64cm,64cm}}
\tikzset{use path/.code={\pgfsyssoftpath@setcurrentpath{#1}}}
\makeatother
\begin{document}
\tikzset{myfunc/.style n args = {4}{font=\footnotesize \ttfamily, align=left, rounded corners, rectangle, minimum width=#1cm, minimum height=#2cm, fill=#3, draw=#4}}
\tikzset{myfunc/.default={3}{4}{white}{black}}
\tikzset{mytask/.style n args = {4}{font=\footnotesize \ttfamily, align=left, rounded corners, double, rectangle, minimum width=#1cm, minimum height=#2cm, fill=#3, draw=#4}}
\tikzset{mytask/.default={3}{4}{white}{black}}
\tikzset{desctext/.style = {font=\footnotesize \sffamily, align=left, color=Mahogany}}
\tikzset{mycon/.style = {rounded corners}}
\tikzset{demotext/.style = {font=\Huge \bfseries, fill opacity=1,text opacity=1}}
\tikzset{horizenjoin/.style = {to path={(\tikztostart.east) -- ($(\tikztostart.east)!0.5!(\tikztostart.east-|\tikztotarget.west)$)|- (\tikztotarget.west)}, rounded corners}}
\begin{frame}[c, fragile]
\begin{tikzpicture}[auto, >={Latex[angle=45:5pt 2]}]
\only<+-> {
\node [myfunc, save path=\stagingpath] (staging) {};
\node at (staging.north west) [anchor=north west, align=left] {};
\node [myfunc, right = of staging, save path=\localbranchpath] (localbranch) {};
\node at (localbranch.north west) [anchor=north west] {};
\draw let \p1=($(staging.west)-(localbranch.east)$), \n2={veclen(\x1, \y1)} in node [myfunc, minimum width = \n2, below = 1cm of staging.south west, anchor = north west, save path=\workingpath] (worktree) {};
\node at (worktree.north west) [anchor=north west] {};
% big picture
\draw let \p1=($(staging.west)-(localbranch.east)$), \n2={veclen(\x1, \y1)} in node [myfunc, minimum width = \n2, below = 1cm of worktree.south west, anchor = north west] (stash) {};
\node at (stash.north west) [anchor=north west] {};
\draw let \p1=($(staging.west)-(localbranch.east)$), \n2={veclen(\x1, \y1)}, \p3=($(staging.north)-(staging.north|-stash.south)$), \n4={veclen(\x3, \y3)} in node [myfunc, minimum width = \n2, minimum height = \n4, right = 1cm of localbranch.north east, anchor = north west, save path=\remotepath] (remote) {};
\node at (remote.north west) [anchor=north west, align=left] {};
\draw let \p1=($(staging.west)-(localbranch.east)$), \n2={veclen(\x1, \y1)}, \p3=($(staging.north)-(staging.north|-stash.south)$), \n4={veclen(\x3, \y3)} in node [myfunc, minimum width = \n2, minimum height = \n4, right = 4cm of remote.north east, anchor = north west, save path=\serverpath] (serverrepo) {};
\node at (serverrepo.north west) [anchor=north west, align=left] {};
\node [rectangle, fit=(staging)(remote), draw, line width = 0.5mm, inner sep=1cm, rounded corners, blue] (mypc) {};
\node at (mypc.north west) [anchor=north west, blue, font=\huge] {};
\node [rectangle, fit=(serverrepo), draw, line width = 0.5mm, inner sep=1cm, rounded corners, violet] (server) {};
\node at (server.north west) [anchor=north west, violet, font=\huge] {};
\draw let \p1=(server.north west),\p2=(server.south east),\n1={0.6*(\x2-\x1)},\n2={0.2*(\y1-\y2)} in node [rectangle, draw, right = 1.5cm of server.north east, anchor=north west, rounded corners, Bittersweet, minimum width=\n1, minimum height=\n2] (colleague1) {} [savenumber={\wid}{\n1}, savenumber={\hei}{\n2}];
\node at (colleague1.north west) [anchor=north west, Bittersweet, font=\LARGE] {};
\node [rectangle, draw, below = of colleague1, rounded corners, ForestGreen, minimum width=\wid, minimum height=\hei] (colleague2) {};
\node at (colleague2.north west) [anchor=north west, ForestGreen, font=\LARGE] {};
\node [rectangle, draw, right = 1.5cm of server.south east, anchor=south west, rounded corners, Magenta, minimum width=\wid, minimum height=\hei] (colleague3) {};
\node at (colleague3.north west) [anchor=north west, Magenta, font=\LARGE] {};
\path (colleague2.south) -- (colleague3.north) node [font=\Huge, pos=0.2, sloped, ForestGreen!50!Magenta] {\mydots};
}
\only<+> {
\fill [even odd rule, fill=green, opacity=.5, rounded corners] ([xshift=-0.5cm, yshift=0.5cm]staging.north west) rectangle ([xshift=0.5cm, yshift=-0.5cm]remote.south east) ([xshift=-0.5cm, yshift=0.5cm]worktree.north west) rectangle ([xshift=0.5cm, yshift=-0.5cm]worktree.south east);
\node [demotext, above = of mypc.north west, anchor=south west, fill=blue, white] {animation 1};
}
\only<+> {
\fill [fill=green, opacity=.5, rounded corners] ([xshift=-0.5cm, yshift=0.5cm]worktree.north west) rectangle ([xshift=0.5cm, yshift=-0.5cm]worktree.south east);
\node [demotext, above = of mypc.north west, anchor=south west, fill=blue, white] {animation 2};
}
\end{tikzpicture}
\end{frame}
\end{document}
我可以生成 3 页的 pdf。出于某种原因,我也想获得 3 个单独的 png。问题是,当我使用转换工具将其转换为 png 时
convert target.pdf target-%02d.png
生成的 png 图像质量很差。
我想知道我是否可以直接从源生成 png,就像我使用该类时一样standalone
。
另一个相关问题是,我使用命令更改页面大小geometry
,为了容纳足够大的图像,我首先将其设置得相当大。结果我需要裁剪生成的图像以删除空白区域。
我可以用 手动完成此操作-crop
。但是,我不想手动调整裁剪参数,而想寻找更智能的裁剪,然后我发现-trim
。但是当我将它与 一起使用时convert
,它只会裁剪页面的西北角。如何让-trim
适用于图像的所有边?
===== 根据@samcarter 建议更新 =====
简化示例如下
\documentclass[border=5mm, convert, usenames, dvipsnames]{beamer}
\usepackage{tikz, pifont, xcolor}
\usepackage[export]{adjustbox}
\usetikzlibrary{shapes, positioning, calc, arrows.meta, fit, backgrounds}
\usetikzlibrary{overlay-beamer-styles}
\usetikzlibrary{scopes}
\usepackage{lmodern}
\usepackage{underscore}
\makeatletter
\geometry{papersize={64cm,64cm}}
\makeatother
\begin{document}
\begin{frame}[c, fragile]
\begin{tikzpicture}
\only<+-> {
\node [draw, rectangle, minimum width=4cm, minimum height=3cm] {Sample};
}
\only<+> {
\node [fill=green, rectangle, minimum width=4cm, minimum height=3cm, opacity=0.5] {};
}
\end{tikzpicture}
\end{frame}
\end{document}
然后使用转换制作 png,为简单起见,我只转换第一页
convert -density 3000 simple_question.pdf[0] simple_image.png
以下是具有相似缩放比例的 pdf 和 png 图像的比较。
可以看出,PNG 中的线条和文本有点扭曲,而 PDF 中没有这样的问题。
我已按照@KJO 的建议使用更大的密度,但似乎没有效果。
当我使用该类时standalone
,我也制作了非常大的图片,但 png 始终具有良好的质量,不确定该类使用的命令行是什么。
答案1
您在问题中表明您对standalone
课程的质量感到满意。
好消息是,standalone
有一个选项beamer
允许您使用包括框架和覆盖在内的演示文稿。因此,在您的示例中,将文档类更改为
\documentclass[border=5mm, convert, usenames, dvipsnames,beamer]{standalone}
答案2
png 的质量与像素的大小和混叠有关。为了获得名义上的 64 x 64 厘米 .png,您需要使用低密度 100 的转换,如果将密度更改为 200,则需要 4 倍的时间,但会产生 128 厘米 x 128 厘米的输出;如果将其加倍,则需要 16 倍的时间才能产生 256 厘米 x 256 厘米的 .png,但相比之下线条会显得更细。
因此,这取决于您的目标用途,哪种方式最好。请注意,在所有情况下,这些生成的 png 都无法导入到 pdf 中以分发到 ISO 标准,因为线条太细了(尽管有些读者/查看者会使用厚度覆盖来使它们看起来不错)。
许多用户希望 magick 命令以统一的方式运行,但是您需要添加它们的应用位置,因此对于裁剪,您可能需要更复杂的定义,例如
convert -gravity center -density 100 -crop 2450x1800+0+0 +repage beamer.pdf images.png
其中 2450x1800 是您需要的图像尺寸。其他命令选项包括 -chop & trim
这里给出了许多例子http://www.imagemagick.org/Usage/crop/
[稍后编辑] 为了说明需要确定一个好的值,例如 192 dpi,以下是更新样本的结果。向左下方比较 PDF 以进行转换和捕获,然后看到在这种情况下,最佳值为 192 dpi,适合 200%-400% 的查看
因此,在这种情况下,我们可以将两个答案结合起来,并使用第一行自动转换所有页面
\documentclass[border=5mm,convert={density=192},usenames,dvipsnames,beamer]{standalone}