Архив метки: PHP

Изменение размеров изображения на PHP

Если у вас возникла необходимость изменять размер изображения с php, то чаще всего такую возможность предоставляет движок,  на котором реализован сайт. Но иногда такого не бывает, приходится писать функции ресайза самому.  Приведу пример функций ресайза изображений.

Как таковой, функции изменения размеров изображения в библиотеке GD нет. Есть две функции копирования части одного изображения в другое с изменением размеров копируемой части. Это функции imagecopyresized() и imagecopyresampled().

Функция imagecopyresampled() появилась в библиотеке GD с версии 2.0.1 и отличается от imagecopyresampled() тем, что при изменении размеров плавно интерполируются значения цветов в точках изображения.  Об ограничениях на работу функции imagecopyresampled() с палитровыми изображениями в документации по PHP ничего не сказано. Более того, там есть сноска, в которой описываются проблемы, возникающие с палитровыми изображениями. В примерах мы будем использовать функцию imagecopyresampled(), но если у вас более старая версия GD, то просто замените «resampled» на «resized».

Функция, изменяющая размер изображения.

function imageresize($outfile,$infile,$neww,$newh,$quality) {

    $im=imagecreatefromjpeg($infile);
    $im1=imagecreatetruecolor($neww,$newh);
    imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));

    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }

imageresize("","webcam.jpg",320,240,75);

Изменение размеров изображения с заданным коэффициентом.

function imageresize($outfile,$infile,$percents,$quality) {
    $im=imagecreatefromjpeg($infile);
    $w=imagesx($im)*$percents/100;
    $h=imagesy($im)*$percents/100;
    $im1=imagecreatetruecolor($w,$h);
    imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }

imageresize("","webcam.jpg",30,75);

Иногда необходимо вписать новое изображение в определенные рамки. В таком случае можно воспользоваться следующей функцией:

Изменение размеров изображения с вписыванием в рамки

function imageresize($outfile,$infile,$neww,$newh,$quality) {
    $im=imagecreatefromjpeg($infile);
    $k1=$neww/imagesx($im);
    $k2=$newh/imagesy($im);
    $k=$k1>$k2?$k2:$k1;

    $w=intval(imagesx($im)*$k);
    $h=intval(imagesy($im)*$k);

    $im1=imagecreatetruecolor($w,$h);
    imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }

imageresize("","webcam.jpg",640,240,75);

Наложение изображений или склеивание картинок на php

Иногда бывает необходимость реализовать на php накладывание изображений друг на друга, или попросту, склеивание двух картинок. Например, такое бывает, когда вам нужно поместить на изображении водный знак или наложить на все изображения сайта логотип (как пример, Одноклассники), чтобы придать сайту определенный стиль и чтобы все изображения с ресурса однозначно указывали на их владельца. Такое часто можно увидеть на сайтах фотогалерей, а водные знаки на изображении — незаменимый атрибут фотобанков.
Условием такого наложения является то, что полученный коллаж из картинок следует вывести в тег <img>.
Не будем сильно вдаваться в подробности и технические детали процесса накладывания, а приступим сразу к делу. Итак, что нам нужно  для наложения изображений? Изображение, на которое будет что-то накладываться, изображение, которое будет накладываться на первое, а также координаты наложения.
Для этого необходимо создать php страницу, на которой будет выполняться код, склеивающий картинки. Странице мы должны передать адрес того изображения, на которое будет накладываться логотип или водный знак. Результатом выполнения кода будет вывод склеенной картинки.

Рассмотрим все подробнее. Создаем, к примеру, страницу img.php, в ней будет выполняться код, приведенный ниже.  Внимание, в коде страницы img.php не должно быть вывода никакой информации на экран, только представленный код. О том, как вывести потом полученное изображение в тег <img>, расскажу ниже.

$img_path = "http://".$_SERVER['SERVER_NAME'].$_REQUEST['p']; //передаем скрипту изображение, на которое нужно что-то наложить, в формате .jpg
$wi = "http://".$_SERVER['SERVER_NAME']."/i/copy.png"; //тут хранится путь к накладываемому изображению, в формате .png
$img = imagecreatefromjpeg($img_path); //создаем исходное изображение
$arwater_img = getimagesize($img_path); //узнаем размер переданного изображения, чтобы правильно рассчитать координаты наложения
$water_width = $arwater_img[0]; //ширина исходного изображения
$water_height = $arwater_img[1]; //высота исходного изображения
$water_img_type = $arwater_img[2];
$water_img_type = $arwater_img[$water_img_type-1];
$water_img_size = $arwater_img[3];
$water_img = imagecreatefrompng($wi); //создаем водный знак
$water_size = getimagesize($wi); //узнаем размеры водного знака, чтобы правильно выполнить наложение
$logo_h = $water_size[1]; //высота водного знака
$logo_w = $water_size[0]; //ширинаа водного знака
imagecopy ($img, $water_img, 0, 0, 0, 0, $logo_w, $logo_h); //накладываем водный знак на изображение по заданным координатам.
header("Content-type: image/png");
imagepng($img); //выводим изображение

Чтобы посмотреть результат выполняемого кода, необходимо обратиться к этой странице и в параметре p передать путь к тому изображению, на которое вы накладываете логотип. (http://ваш_сайт.ru/img.php?p=». Не забудьте поместить в нужное место (в данном примере — в корень сайта) водный знак, изображение copy.png. Итак, что мы видим? Картинки склеились, но наложились не в том месте, где хотелось бы? Не беда, нужно всего лишь подкорректировать координаты наложения, в функции imagecopy. Давайте разберем все по полочкам и рассмотрим функцию накладывания изображения.

imagecopy ( a, b, a_x, a_y, b_x, b_y, w, h);
  • a — исходное изображение, на которое мы будем накладывать картинку (тип resource)
  • b — логотип или водный знак, который будет накладываться на картинку (тип resource)
  • a_x, a_y — логотип копируется в координаты  a_x, a_y исходной картинки (тип int)
  • b_x, b_y — копируем логотип на исходник, начиная с координат  b_x, b_y (тип int)
  • w — ширина накладываемого изображения (тип int)
  • h — высота накладываемого изображения (тип int)

Приведу несколько базовых примеров:

// левый верхний угол
imagecopy ($img, $water_img, 0, 0, 0, 0, $logo_w, $logo_h); 
 // правый верхний угол
imagecopy ($img, $water_img, $water_width-$logo_w, 0, 0, 0, $logo_w, $logo_h);
// правый нижний угол
imagecopy ($img, $water_img, $water_width-$logo_w, $water_height - $logo_h, 0, 0, $logo_w, $logo_h); 
 //левый нижний угол
imagecopy ($img, $water_img, 0, $water_height - $logo_h, 0, 0, $logo_w, $logo_h);

Надеюсь, вы уже поняли что с координатами наложения можно поэкспериментировать, в т.ч., передать координаты наложения в запрос и тем самым, управлять выводом. Теперь нашей задачей стоит вывод изображения в тег <img>. Как же быть, подумаете вы? Нет ничего сложного! Просто передаем в атрибуте src путь к картинкеУдачных экспериментов, красивых сайтов! 😉

Постраничная навигация при query_post в WordPress

Те, кто сталкивался, знают, что при выводе записей в цикле loop, используя в качестве фильтр query_posts,
перестает работать постраничная навигация – при переходе на следующую страницу всегда отображается контент первой страницы.
Проблема решается элементарно, перед функцией query_posts выполните этот код:

$page = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts("paged=$page");

после чего исправьте свою функцию таким образом:

query_posts($query_string . $str."&paged=".$page);