这是我在很长一段时间内的第一次编程,所以我基本上是从头开始,而且我正在使用coldfusion 8.
我要做的是从各种较大的图像,一些肖像,一些风景中创建一系列统一的缩略图(总是68 X 46)。在两种情况下,调整图像大小以填充缩略图的高度或宽度,然后在两侧(顶部/底部,左/右)均匀地裁剪多余的图像。就像Photoshop在默认情况下使用画布调整大小一样。
只要源图像尺寸/比例完美,下面的代码就可以正常工作,但我已经开始遇到代码失败的情况。在这种情况下,当调整大小的图像宽度最终小于68时。
<cfif FileExists(ExpandPath('images/gallery/thumbs/thm_'&imageMed[i].medium.XmlText)) IS false> <!--- If the thumb doesn't exist, create it. --->
<cfif imageDataThumb.width gt imageDataThumb.height >
<!--- Landscape --->
<cfset ImageResize(cfImageThumb,"","46")>
<cfset ImageCrop(cfImageThumb,(cfImageThumb.width-68)/2,0,68,46)> <!--- Crop left/right edges of images --->
<cfimage source="#cfImageThumb#" action="write" destination="images/gallery/thumbs/thm_#imageMed[i].medium.XmlText#" overwrite="yes">
<cfelse>
<!--- Portrait --->
<cfset ImageResize(cfImageThumb,"68","")>
<cfset ImageCrop(cfImageThumb,0,(cfImageThumb.height-23)/2,68,46)>
<!--- Crop top/bottom edges of images --->
<cfimage source="#cfImageThumb#" action="write" destination="images/gallery/thumbs/thm_#imageMed[i].medium.XmlText#" overwrite="yes">
</cfif>
试图解决这些“边缘情况”正在将代码变成一团糟。有没有更好的方法来解决这个问题?冷敷或cfc中的东西?
答案 0 :(得分:2)
我知道这是旧的,但您可以在ben nadel的imageUtils库中使用AspectCrop。检查riaforge.com。它完全符合您的要求。我知道,我写了。 :)
答案 1 :(得分:1)
我首先检查图像的比例,然后相应地调整短边裁剪。我正在使用CFScript来简洁,但这很容易转换为Coldfusion标签。
<cfscript>
minimumRatio = 68 / 46; // 1.478 (68 pixels / 46 pixels)
width = ImageGetWidth(imageDataThumb);
height = ImageGetHeight(imageDataThumb);
// determine the longside and the aspect
if (width GT height) {
longside = width;
shortside = height;
aspect = "landscape";
} else {
longside = height;
shortside = width;
aspect = "portrait";
}
// determine the aspect ratio
if (longside / shortside GTE minimumRatio) {
// Do normal resize / crop
if (width EQ longside) {
// landscape
} else {
// portrait
}
} else {
// ratio is too small - perform some additional calculations before resize / crop
// in this case, you'll likely need to resize for the opposite side then crop the excess
}
</cfscipt>
<cfimage source="#cfImageThumb#" action="write" destination="images/gallery/thumbs/thm_#imageMed[i].medium.XmlText#" overwrite="yes">
如果您不想检查比率,请在使用类似逻辑调整大小之前验证长度和宽度是否足够。
答案 2 :(得分:1)
代码不仅需要关注当前的比例,还需要关注如何改变作物的比例。
此外,高度计算基于所需高度的一半,应该是全高。
假设您的代码的所有其他内容都正确,您应该能够将以下代码放入FileExists中,如果阻止,则替换当前内容。
<cfset CurrentWidth = imageDataThumb.width>
<cfset CurrentHeight = imageDataThumb.height>
<cfset CurrentRatio = CurrentWidth / CurrentHeight>
<cfset DesiredRatio = 68 / 46>
<cfif CurrentWidth GTE CurrentHeight>
<!--- Landscape Image --->
<cfif CurrentRatio LT DesiredRatio>
<!--- More Landscape --->
<cfset Keep = "width">
<cfelse>
<!--- Less Landscape --->
<cfset Keep = "height">
</cfif>
<cfelse>
<!--- Portrait Image --->
<cfif CurrentRatio GT DesiredRatio>
<!--- More Portrait --->
<cfset Keep = "height">
<cfelse>
<!--- Less Portrait --->
<cfset Keep = "width">
</cfif>
</cfif>
<cfif Keep EQ "width">
<!--- Crop top/bottom edges of images --->
<cfset ImageResize(cfImageThumb,"68","")>
<cfset ImageCrop(cfImageThumb,0,(cfImageThumb.height-46)/2,68,46)>
<cfelse>
<!--- Crop left/right edges of images --->
<cfset ImageResize(cfImageThumb,"","46")>
<cfset ImageCrop(cfImageThumb,(cfImageThumb.width-68)/2,0,68,46)>
</cfif>
<cfimage source="#cfImageThumb#" action="write" destination="images/gallery/thumbs/thm_#imageMed[i].medium.XmlText#" overwrite="yes">
答案 3 :(得分:-2)
没有。 ImageScaleToFit将确保图像适合边界内,在这种情况下会留下空白区域。我需要用图像完全填充可用空间。