<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
        <channel>
        <title>gd2 / Tag search / Русский клуб Joomla</title>
        <link>http://joomclub.net/en/rss/tag/gd2/</link>
        <description><![CDATA[Сайт посвящен Joomla во всех ее проявлениях, мы рассказываем о шаблонах, расширениях, компонентах, плагинах и модулях]]></description>
        <language>ru</language>
        <managingEditor>tena2000@mail.ru</managingEditor>
        <webMaster>tena2000@mail.ru</webMaster>
        <generator>Alto CMS v.1.1.13</generator>
                    <item>
                <title>Обработка изображений или фантазии дизайнера</title>
                <guid isPermaLink="true">http://joomclub.net/en/t/65/</guid>
                <link>http://joomclub.net/en/blog/verstka/65.html</link>
                <author>tena2000@mail.ru</author>
                <description><![CDATA[<img style="cursor: default; width: 250px; height: 194px; float: left; margin: 10px;" src="http://joomclub.net/uploads/images/nightguard/2012/10/linkor-1.jpg"><p>Недавно заказали верстку каталога недвижимости, ничего сложного, кроме одного момента — формирование превью изображений в категории, материале и модулях, т.к. в качестве каталога использовался FLEXIcontent, то описание сделаю именно для него, хотя для com_content схема действий будет аналогичная.</p><p>Для работы данного решения потребуется библиотека GD2, по этому рекомендую заранее узнать стоит она у хостера или нет.</p><p>Изначально у меня было три превью и по клику на первый итем нужно было выводить в модальном окне нормальное изображение, т.е. возможность обработки изображения, и приведения к требуемому виду, до загрузки на сайт невозможна, а т.к. фон неоднородный, то возможность наложить сверху другое изображение отсутствовала, следовательно средствами css нужный результат не получить (один способ есть, но решение сложное и не кроссбраузерное). В итоге после консультаций и раздумий (да-да, собрали целый консилиум из-за создания одной картинки ;) ) принято решение обрабатывать <a name="cut" rel="nofollow"></a> изображение с помощью GD2, а чтобы не грузить каждый раз сервер, то сохранять изображение в той же папке, что и превью сгенерированное плагином FLEXIcontent, но с добавлением суффикса к изображению, а при загрузке проверять, есть нужное превью или нет, если есть, то грузим превью, если нету, то создаем его и загружаем.</p><p>Перейдем непосредственно к решению (field26 — поле типа image, в котором хранится первое выводимое превью):</p><pre class="prettyprint"><code>&nbsp; &lt;?php<br />&nbsp; $field26 = explode('src=&quot;', $item-&gt;fields['field26']-&gt;display);<br />&nbsp; $field26_img = explode('&quot; alt', $field26[1]);<br />&nbsp; $field26_img_src = substr_replace($field26_img[0],&quot;-home.png&quot;,-4);<br /><br />&nbsp; if (file_exists($field26_img_src)) {<br />&nbsp; echo $field26[0].'src=&quot;'.$field26_img_src.'&quot; alt'.$field26_img[1];<br />&nbsp; } else {<br /><br />&nbsp;&nbsp;&nbsp; $res = imagecreatetruecolor(240,165);<br />&nbsp;&nbsp;&nbsp; $img = imagecreatefromjpeg($field26_img[0]);<br />&nbsp;&nbsp;&nbsp; $mask = imagecreatefrompng(&quot;templates/linkor/images/mask_small.png&quot;);<br /><br />&nbsp;&nbsp;&nbsp; imagecopy ($img,$mask,0,0,0,0,220,165);<br />&nbsp;&nbsp;&nbsp; $color = imagecolorallocate($img,0,0,0);<br />&nbsp;&nbsp;&nbsp; imagecolortransparent($img,$color);<br />&nbsp;&nbsp;&nbsp; header('Content-Type: image/png');<br />&nbsp;&nbsp;&nbsp; imagepng($img, $field26_img_src);<br />&nbsp;&nbsp;&nbsp; imagedestroy($img);<br />&nbsp;&nbsp;&nbsp; echo $field26[0].'src=&quot;'.$field26_img_src.'&quot; alt'.$field26_img[1];<br />&nbsp; }<br />&nbsp; ?&gt;</code></pre><p>Если описывать в двух словах, то происходит наложение одноцветной маски на изображение, с последующим удалением пикселей определенного цвета, да решение тоже не идеальное, т.к. помимо маски могут быть удалены пиксели и с самого изображения, но оно кроссбраузерное и работает всегда, что и требовалось сделать, кроме того можно повторно наложить изображение на инвертированную маску, тогда пиксели на изображении можно вернуть обратно (вот пока писал понял где совершил недочет, полезно иногда мануалы писать ;) ).</p><p>Приведу образцы: исходного изображения, маску и результат обработки:</p><p align="center"><img style="cursor: default;" src="http://joomclub.net/uploads/images/nightguard/2012/10/linkor-2.jpg"></p><p>Кстати, проверку делать настоятельно рекомендую, т.к. GD2 создает нагрузку при обработке, а если каталог достаточно большой, то и нагрузка будет не маленькой.</p><p><br>
</p><p>Документация:<br>
</p><ul><li><a href="http://php.net/manual/ru/book.image.php" target="_blank" rel="nofollow">Обработка изображений и GD (русский)</a> </li><li><a href="http://php.net/manual/en/book.image.php" target="_blank" rel="nofollow">Image Processing and GD (английский)</a> </li></ul>]]></description>
                <pubDate>Sat, 13 Oct 2012 09:00:19 +0400</pubDate>
                            </item>
            </channel>
    </rss>
