如何将 beamer 类直接转换为 png

如何将 beamer 类直接转换为 png

我正在尝试使用 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

可以看出,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}

相关内容