PHP функция генерирования превью изображения
В сети есть много функций для генерирования маленьких изображений. Особенность моей заключается в том что она “умная”.
Например нам нужно уменьшить изображение размером 1000х500 до размера 500х500. Большинство просто сделает новое изображение 500х250 – моя же сделает размером 500х500 и не испортит ничего -попросту вырежет середину. При том функция уменьшает до любых размеров, например: 100х160, 234х34, 320х240, и при этом правило остается.
Если же изображение маленькое то лишняя часть заполнится белым цветом ( или тем что вы пожелаете ).
На вход функция получает переменную-ссылку на открытое зарание изображение – на выход же отдает переменную уменьшенного изображения.
Код функции
<?php
/* Author: Golubovsky Alexey
Email: itinua@gmail.com
Site: golubovsky.name */
function resizeImg( &$i, $width, $height )
{
$thumb = imagecreatetruecolor( $width, $height );
$white = imagecolorallocate( $thumb, 255, 255, 255 ); //цвет заполнения пустого пространства
imagefilledrectangle( $thumb, 0,0, $width, $height, $white );
$iWidth = imagesx( $i );
$iHeight = imagesy( $i );
$iKoeficient = $width / $height;
$thumbKoeficient = $iWidth / $iHeight;
$ix1 = 0; $ix2 = $width;
$iy1 = 0; $iy2 = $height;
if ( $width > $iWidth && $height > $iHeight )
{
$ix1 = round( $width - $iWidth ) / 2;
$ix2 = $iWidth;
$iy1 = round( $height - $iHeight ) / 2;
$iy2 = $iHeight;
$x1 = 0; $x2 = $iWidth;
$y1 = 0; $y2 = $iHeight;
} elseif ( $width > $iWidth ) {
$iy1 = 0;
$iy2 = $height;
$coeficient = $height / $iHeight;
$newwidth = round( $iWidth * $coeficient );
$ix1 = round( ($width - $newwidth)/2 );
$ix2 = $newwidth;
$x1 = 0; $x2 = $iWidth;
$y1 = 0; $y2 = $iHeight;
} elseif ( $height > $iHeight ) {
$ix1 = 0;
$ix2 = $width;
$coeficient = $width / $iWidth;
$newheight = round( $iHeight * $coeficient );
$iy1 = round( ($height - $newheight)/2 );
$iy2 = $newheight;
$x1 = 0; $x2 = $iWidth;
$y1 = 0; $y2 = $iHeight;
} else {
if ( $iKoeficient > $thumbKoeficient )
{
//если сторона исхорного изобращения пропорционально меньше изображения что нужно получить то нужно отслеживать по высоте
$x1 = 0;
$x2 = $iWidth;
$coeficient = $width / $iWidth;
$y2 = round( $height / $coeficient );
$y1 = round( ($iHeight - $y2)/2 );
}
else
{
$y1 = 0;
$y2 = $iHeight;
$coeficient = $height / $iHeight;
$x2 = round( $width / $coeficient );
$x1 = round( ( $iWidth-$x2 )/2 );
}
}
imagecopyresampled( $thumb, $i, $ix1, $iy1, $x1, $y1, $ix2, $iy2, $x2, $y2 );
return $thumb;
} ?>
Примеры использования
$i = imagecratefromjpeg( 'myfile.jpg' ); $thumb = resizeImg( &$i, 320, 240 ); header( 'Content-type: image/png' ); imagepng( $thumb ); imagedestroy( $i ); imagedestroy( $thumb ); die();
В сети эта функция используется на сайте www.connectnews.ru в виде генератора изображений на главной странице.

REPLY))
Огромное спасибо за алгоритм картинок
очень полезная вещь
REPLY))
А в чём прикол заполнять пустое пространство белым/чем пожелаете?
REPLY))
Прикол в том что верстать не нужно под разные размеры картинок. (если они меньше размера нужного)
REPLY))
Функция полезная автору спасибо, только пример использования не очень практичен в плане содействия верстальщика и прогорамиста, можно организовать так что-бы верстальщик выбирал в штмле размер а скрипт обрабативал, короче вот как здесь показано: //sitear.ru/material/preview_of_picture_with_php
На мой взгляд так будет проще в плане работы с дизайном, нет необходимости копаться в коде.
REPLY))
Каждый раз генерить превью через PHP? Это очень неразумно.