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 в виде генератора изображений на главной странице.

5 Comments

  1. разработчик сайтов на joomlaразработчик сайтов на joomla  
    сентября 11, 2010
    REPLY))

  2. Огромное спасибо за алгоритм картинок
    очень полезная вещь

    1F

  3. megacoolprogrammermegacoolprogrammer  
    января 10, 2011
    REPLY))

  4. А в чём прикол заполнять пустое пространство белым/чем пожелаете?

    2F

    Прикол в том что верстать не нужно под разные размеры картинок. (если они меньше размера нужного)

    3F

  5. ТарасТарас  
    июня 29, 2011
    REPLY))

  6. Функция полезная автору спасибо, только пример использования не очень практичен в плане содействия верстальщика и прогорамиста, можно организовать так что-бы верстальщик выбирал в штмле размер а скрипт обрабативал, короче вот как здесь показано: //sitear.ru/material/preview_of_picture_with_php
    На мой взгляд так будет проще в плане работы с дизайном, нет необходимости копаться в коде.

    4F

  7. июня 29, 2011
    REPLY))

  8. Каждый раз генерить превью через PHP? Это очень неразумно.

    5F

Написать ответ

 Имя

 Mail

 Сайт

[Имя и Mail обязательны для заполнения. Mail не будет опубликован.]


 9fce13c8-2714-4603-b8e7-33be6c785d58