обрезать изображение из центра с помощью Coldfusion - PullRequest
1 голос
/ 27 января 2010

Это мой первый опыт программирования за долгое время, поэтому я в основном начинаю с нуля и использую coldfusion 8.

То, что я пытаюсь сделать, - это создать серию однородных миниатюрных изображений (всегда 68 X 46) из множества больших изображений, некоторого портрета, некоторого пейзажа. В обоих случаях измените размер изображения, чтобы заполнить высоту или ширину миниатюры, а затем обрежьте лишнее изображение с обеих сторон (сверху / снизу, слева / справа). Так же, как фотошоп делает по умолчанию с изменением размера холста.

Приведенный ниже код работает очень хорошо, пока размеры / соотношение исходных изображений идеальны, но я начал сталкиваться со случаями, когда код не работает. В этом случае, когда ширина изображения с измененным размером становится меньше 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 ]

2 голосов
/ 23 августа 2010

Я знаю, что это старая версия, но вы могли бы просто использовать AspectCrop в библиотеке imageUtils от Бен Наделя. Проверьте riaforge.com. Это именно то, что вы ищете. Я знаю, я написал это. :)

1 голос
/ 27 января 2010

Я бы сначала проверил пропорции изображения и соответственно скорректировал обрезку короткой стороны. Я использую 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">

Если вы не хотите проверять соотношение, то убедитесь, что длины и ширины достаточно, прежде чем изменять размеры, используя аналогичную логику.

1 голос
/ 01 февраля 2010

Код должен обращать внимание не только на текущее соотношение, но и на то, как вы меняете соотношение с культурой.

Кроме того, расчет высоты основывался на половине требуемой высоты и должен был составлять полную высоту.

Предполагая, что все остальное правильно с вашим кодом, вы сможете поместить приведенный ниже код в блок FileExists if, заменяя текущее содержимое.

<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">
0 голосов
/ 27 января 2010

Нет. ImageScaleToFit гарантирует, что изображение помещается за границы, что в этом случае оставляет пустое пространство. Мне нужно полностью заполнить доступное пространство изображением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...