Обработка изображений или фантазии дизайнера

Недавно заказали верстку каталога недвижимости, ничего сложного, кроме одного момента — формирование превью изображений в категории, материале и модулях, т.к. в качестве каталога использовался FLEXIcontent, то описание сделаю именно для него, хотя для com_content схема действий будет аналогичная.

Для работы данного решения потребуется библиотека GD2, по этому рекомендую заранее узнать стоит она у хостера или нет.

Изначально у меня было три превью и по клику на первый итем нужно было выводить в модальном окне нормальное изображение, т.е. возможность обработки изображения, и приведения к требуемому виду, до загрузки на сайт невозможна, а т.к. фон неоднородный, то возможность наложить сверху другое изображение отсутствовала, следовательно средствами css нужный результат не получить (один способ есть, но решение сложное и не кроссбраузерное). В итоге после консультаций и раздумий (да-да, собрали целый консилиум из-за создания одной картинки ;) ) принято решение обрабатывать изображение с помощью GD2, а чтобы не грузить каждый раз сервер, то сохранять изображение в той же папке, что и превью сгенерированное плагином FLEXIcontent, но с добавлением суффикса к изображению, а при загрузке проверять, есть нужное превью или нет, если есть, то грузим превью, если нету, то создаем его и загружаем.

Перейдем непосредственно к решению (field26 — поле типа image, в котором хранится первое выводимое превью):

  <?php
  $field26 = explode('src="', $item->fields['field26']->display);
  $field26_img = explode('" alt', $field26[1]);
  $field26_img_src = substr_replace($field26_img[0],"-home.png",-4);

  if (file_exists($field26_img_src)) {
  echo $field26[0].'src="'.$field26_img_src.'" alt'.$field26_img[1];
  } else {

    $res = imagecreatetruecolor(240,165);
    $img = imagecreatefromjpeg($field26_img[0]);
    $mask = imagecreatefrompng("templates/linkor/images/mask_small.png");

    imagecopy ($img,$mask,0,0,0,0,220,165);
    $color = imagecolorallocate($img,0,0,0);
    imagecolortransparent($img,$color);
    header('Content-Type: image/png');
    imagepng($img, $field26_img_src);
    imagedestroy($img);
    echo $field26[0].'src="'.$field26_img_src.'" alt'.$field26_img[1];
  }
  ?>

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

Приведу образцы: исходного изображения, маску и результат обработки:

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


Документация:

1 comment
Помню как это тяжело рождалось, но круто, что нашли решение :-) это однозначно в копилку для дальнейшего использования.
Only registered users can comment.