存储并重现有效的图形缩放

存储并重现有效的图形缩放

当图像的长度被缩放为可变长度时,\textwidth我如何确定有效的缩放因子?

\includegraphics[width=\textwidth]{image.pdf}

我想用它将相同的缩放比例应用到另一幅图像:

\includegraphics[scale=\myscale]{image2.pdf}

作为一种解决方法,我只需打印有效缩放因子并将其手动插入到第二个命令中即可。这可以通过确定 pdflatex 所见的原始图像的长度并除以\the\textwidth它来完成。这可能吗?修剪会对此产生什么影响?

答案1

这里我介绍\SetIncludegraphics[]{}了参考图,其目的是\myscale在设置图像时进行计算。

它的作用(在临时框中)是比较\includegraphics使用和不使用可选参数的结果。\myscale计算为使用和不使用的两个图像的宽度比[#1]。此后,\myscale即可使用。

这使用了将图像宽度存储在变量中的技巧\newcount,因此它本质上没有物理单位(即,它具有“机器”单位)并且存储为一个大整数。这样,​​使用该fp包对两个计数进行简单除法即可得出比例。

\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{graphicx,fp}
\newcount\scaledwidth
\newcount\unscaledwidth
\newcommand\SetIncludegraphics[2][]{%
  \setbox0=\hbox{\includegraphics{#2}}%
  \unscaledwidth=\wd0\relax%
  \setbox0=\hbox{\includegraphics[#1]{#2}}%
  \scaledwidth=\wd0\relax%
  \FPdiv\myscale{\the\scaledwidth}{\the\unscaledwidth}%
  \includegraphics[#1]{#2}%
}
\parindent 0pt\parskip 2em
\begin{document}
\includegraphics{example-image-1x1}\\
\includegraphics{example-image-16x10}

\SetIncludegraphics[width=.2\textwidth]{example-image-1x1}%
\includegraphics[scale=\myscale]{example-image-16x10}
\end{document}

在此处输入图片描述

答案2

这是我的尝试: 

三幅图像的宽度不同(大、中、小),但每幅图像上的星星大小相同。我使用 \settowidth 来获取原始图像宽度,并使用 \pgfmathsetmacro 来划分尺寸(Matthew Leingang 回答)这里帮助过我)。

\documentclass{article}
\usepackage{graphicx}
\usepackage{pgf}

\begin{document}
\newlength{\imagewidth}
\settowidth{\imagewidth}{\includegraphics{img_big}}
\pgfmathsetmacro{\myscale}{\the\textwidth/\the\imagewidth}

\includegraphics[width=\textwidth]{img_big}

\includegraphics[scale=\myscale]{img_medium}

\includegraphics[scale=\myscale]{img_small}

\end{document}

在此处输入图片描述

然后您可以在序言中添加 \newcommand:

\newlength{\imagewidth}
\newcommand\getscale[1]{%
    \settowidth{\imagewidth}{\includegraphics{#1}}
    \pgfmathsetmacro{\myscale}{\the\textwidth/\the\imagewidth}
}

并使用以下方法获取图像的缩放因子:

\getscale{img_big}
\includegraphics[scale=\myscale]{img_medium}

答案3

下面的示例定义了\setscalewidth[<options>]{<image}(和\setscaleheight) 来设置 LaTeX 在使用 包含图像时使用的比例\includegraphics[<options>]{<image>}

在此处输入图片描述

\documentclass{article}

\usepackage{xparse,graphicx}
\ExplSyntaxOn
  \cs_new_eq:NN \calc \fp_eval:n
\ExplSyntaxOff

\makeatletter
\newcommand{\scalefactor}{1}% Default scale factor
\newcommand{\setscalewidth}[2][]{% \setscalewidth[<options>]{<image>}
  \settowidth{\@tempdima}{\includegraphics{#2}}% Original width
  \settowidth{\@tempdimb}{\includegraphics[#1]{#2}}% Modified width
  \edef\scalefactor{\calc{\strip@pt\@tempdimb/\strip@pt\@tempdima}}% modified/original = scale factor
}
\newcommand{\setscaleheight}[2][]{% \setscaleheight[<options>]{<image>}
  \settoheight{\@tempdima}{\includegraphics{#2}}% Original height
  \settoheight{\@tempdimb}{\includegraphics[#1]{#2}}% Modified height
  \edef\scalefactor{\calc{\strip@pt\@tempdimb/\strip@pt\@tempdima}}% modified/original = scale factor
}

\begin{document}

\setscalewidth[width=0.2\textwidth]{example-image}% Define scale width

\includegraphics[width=0.2\textwidth]{example-image} \quad % Print original image using width= specification
\includegraphics[scale=\scalefactor]{example-image} % Print original image using scale= specification

\end{document}

一旦设置,缩放因子就会存储在中\scalefactor

答案4

除了 Steven B. Segletes 的回答之外,我还做了一个修改,将缩放相关参数与缩放不相关的参数分开,例如,可以使用修剪后的图像作为缩放基础:

\usepackage{graphicx,fp}
\newcount\scaledwidth
\newcount\unscaledwidth
\newcommand{\SetTrimIncludegraphics}[3]{%
  % #1: scaling, #2: trimming and other, #3: name
  \setbox0=\hbox{\includegraphics[#2]{#3}}%
  \unscaledwidth=\wd0\relax%
  \setbox0=\hbox{\includegraphics[#1,#2]{#3}}%
  \scaledwidth=\wd0\relax%
  \FPdiv\myscale{\the\scaledwidth}{\the\unscaledwidth}%
  \includegraphics[#1,#2]{#3}%
}

这样,以下代码将生成两个并排相同的图像:

\SetTrimIncludegraphics{width=0.48\textwidth}{page=4,trim=52 595 321 61,clip}{mypic}
\includegraphics[scale=\myscale,page=4,trim=52 595 321 61,clip]{mypic}

编辑:

我刚刚意识到这\myscale只是局部定义的。要获得全局分配,可以替换:

  \FPdiv\myscale{\the\scaledwidth}{\the\unscaledwidth}%

和:

  \FPdiv\0{\the\scaledwidth}{\the\unscaledwidth}%
  \global\let\myscale\0%

相关内容