使用coldfusion从中心裁剪图像

时间:2010-01-27 02:31:31

标签: image coldfusion thumbnails crop

这是我在很长一段时间内的第一次编程,所以我基本上是从头开始,而且我正在使用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中的东西?

4 个答案:

答案 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将确保图像适合边界内,在这种情况下会留下空白区域。我需要用图像完全填充可用空间。