自动缩放图像

自动缩放图像

在 A5 大小的书信合集中,我想在每一章的开头插入一封手写信件的传真件(或信件的一页)。这些图像大小不一,有些信件写在 A4 纸上,有些写在较小的纸张上,因此除非缩小尺寸,否则它们可能无法放在 A5 纸上。

我已经在本地样式文件中创建了这个功能:

% Insert an image in the middle of a page
% Arguments: #1 (Optional): Description; #2: Path to image
\newlength{\imagewidth}
\newsavebox{\tmpimage}

\newcommand{\addimage}[2][]{%
  \vspace*{\fill}%
  \begin{minipage}[c]{\linewidth}%
\savebox{\tmpimage}{\includegraphics{#2}}%
\ifthenelse{\dimtest{\heightof{\usebox{\tmpimage}}}{>}{\textheight}}
  % If image height is greater than text height, set \imagewidth to width of vertically scaled image
  {%
    \savebox{\tmpimage{\includegraphics[height=.9\textheight]{#2}}}%
    \setlength{\imagewidth}{\widthof{\usebox{\tmpimage}}}%
  }
  % Otherwise set \imagewidth to a fraction of \linewidth
  {\setlength{\imagewidth}{.9\linewidth}}%
% If an image has been scaled vertically, its width may still be greater than \linewidth
\ifthenelse{\dimtest{\imagewidth}{>}{\linewidth}}
  % Scale image again to make sure \imagewidth really is smaller than \linewidth
  {\setlength{\imagewidth}{.9\linewidth}}%
  % Everything is OK, do nothing!
  {}%
\includegraphics[width=\imagewidth]{#2}%
\ifthenelse{\equal{#1}{}}
  {}
  {{\centering\par%
    \rule[.5ex]{\imagewidth}{.6pt}\par%
    \noindent\small\hspace*{\fill}#1\hfill~%
  }}%
  \end{minipage}%
  \vfill%
  \clearpage%
}

这种方法虽然有效,但效率极低,如果文档中有多个 5MB 或更大的图像文件,处理包含脚注和交叉引用的 200 多页文档(因此需要最多 3 次处理)确实需要花费一些时间。原因是我的函数每次处理每个图像 2 次(最坏情况:3 次)。

基本上,我用未缩放的图像定义一个保存框。然后我检查它是否适合垂直页面——如果适合,我将\imagewidth(本地定义的长度)设置为.9\linewidth。如果它不适合,我用垂直缩放的图像覆盖保存框并设置\imagewidth为保存框的宽度。

\imagewidth然后,我通过比较和来检查图像是否适合水平方向\linewidth。如果图像仍然太宽,我将设置\imagewidth.9\linewidth。最后,我使用的值\imagewidth在页面上输出缩放版本。

你知道该如何优化吗?我希望它能够普遍适用,并适用于不同的图像格式。

相关内容