On Thu, 1 May 2014, Mikael P. Sundqvist wrote:
\startluacode userdata = userdata or {} function userdata.lundklippfyllbild(str, bredd, hojd) if tex.dimen[0] / tex.dimen[2] < tex.dimen[4] / tex.dimen[6] then local skalning = -0.5*(tex.dimen[4]/tex.dimen[0]*tex.dimen[2]-tex.dimen[6]) context("\\vskip%ssp", skalning) context.externalfigure({str},{width=bredd}) context.sprint("foo") else local skalning = -0.5*(tex.dimen[6]/tex.dimen[2]*tex.dimen[0]-tex.dimen[4]) context("\\hskip%ssp", skalning) context.externalfigure({str},{height=hojd}) context.sprint("bar") end end \stopluacode
\unexpanded\def\lundklippfyllbild#1#2#3{% \startexternalfigurecollection[#1]% \useexternalfigure[#1][#1]% \stopexternalfigurecollection% \clip[ width=#2, height=#3, hoffset=0mm, voffset=0mm, ]{% \framed[width=#2,height=#3,align={middle,lohi},offset=overlay,frame=off]{% \dimen0=\externalfigurecollectionminwidth{#1}% \dimen2=\externalfigurecollectionmaxheight{#1}% \dimen4=#2% \dimen6=#3% {\ctxlua{userdata.lundklippfyllbild([==[#1]==],[==[#2]==],[==[#3]==])}}}}}
and then run
\lundklippfyllbild{k.jpg}{\textwidth}{\textheight}
Here is an eTeX solution. \unprotect \newdimen\d_scaleandclip_actual_wd \newdimen\d_scaleandclip_actual_ht \newdimen\d_scaleandclip_requested_wd \newdimen\d_scaleandclip_requested_ht \newbox\scaleandclip_box \installnamespace{scaleandclip} \installcommandhandler \????scaleandclip {scaleandclip} \????scaleandclip \setupscaleandclip [width=\textwidth, height=\textheight] \unexpanded\def\scaleandclip{\dodoubleempty\doscaleandclip} \def\doscaleandclip[#1][#2]% {\bgroup \ifsecondargument \edef\currentscaleandclip{#1}% \setupcurrentscaleandclip[#2]% \else\iffirstargument \doifassignmentelse{#1} {\let\currentscaleandclip\empty \setupcurrentscaleandclip[#1]} {\edef\currentscaleandclip{#1}} \else \let\currentscaleandclip\empty \fi\fi \dowithnextboxcs\scaleandclip_finish\hbox} \def\scaleandclip_finish {% \d_scaleandclip_requested_wd \dimexpr\scaleandclipparameter\c!width\relax \d_scaleandclip_requested_ht \dimexpr\scaleandclipparameter\c!height\relax % \d_scaleandclip_actual_wd\wd\nextbox \d_scaleandclip_actual_ht\dimexpr\ht\nextbox + \dp\nextbox\relax % \ifdim\dimexpr\d_scaleandclip_actual_wd*100/\d_scaleandclip_requested_wd < \dimexpr\d_scaleandclip_actual_ht*100/\d_scaleandclip_requested_ht \relax \setbox\scaleandclip_box\hbox {\scale[\c!width=\d_scaleandclip_requested_wd]{\box\nextbox}}% \scratchdimen=\the\dimexpr(\ht\scaleandclip_box - \d_scaleandclip_requested_ht)/2\relax \clip [ \c!voffset=\scratchdimen, \c!height=\d_scaleandclip_requested_ht, ]{\box\scaleandclip_box}% \else \setbox\scaleandclip_box\hbox {\scale[\c!height=\d_scaleandclip_requested_ht]{\box\nextbox}}% \scratchdimen=\the\dimexpr(\wd\scaleandclip_box - \d_scaleandclip_requested_wd)/2\relax \clip [ \c!hoffset=\scratchdimen, \c!width=\d_scaleandclip_requested_wd, ]{\box\scaleandclip_box}% \fi \egroup} \protect The usage is: \scaleandclip[width=..., height=...]{ ... any box ...} simimlar to the usage of \scale macro. \starttext \dontleavehmode \scaleandclip[width=3cm, height=3cm]{\externalfigure[cow.pdf][width=3cm,frame=on]} \scale[maxwidth=3cm, maxheight=3cm]{\externalfigure[cow.pdf][width=3cm,frame=on]} \dontleavehmode \scaleandclip[width=3cm, height=3cm]{\externalfigure[cow.pdf][width=3cm,height=10cm,frame=on]} \scale[maxwidth=3cm, maxheight=3cm]{\externalfigure[cow.pdf][width=3cm,height=10cm,frame=on]} \dontleavehmode \scaleandclip[width=3cm, height=3cm]{\externalfigure[cow.pdf][width=10cm,height=3cm,frame=on]} \scale[maxwidth=3cm, maxheight=3cm]{\externalfigure[cow.pdf][width=10cm,height=3cm,frame=on]} \stoptext