усовершенстованная превьюшка

alexblade

Новичок
PHP:
<?php
function Resize($src, $width = 168, $height = 126)
{
if (!file_exists($src) or !is_int($width) or !is_int($height)) return false;

// Определяем размер изображения с помощью функции getimagesize
$size = getimagesize($src);
if ($size === false) return false;

// Определяем исходный формат по MIME-информации
$tmp = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$ifunc = "imagecreatefrom" . $tmp;
if (!function_exists($ifunc)) return false;

// Ширина должна быть больше высоты. В случае портретного оригинала, скрипт сам перевернёт превьюшку
if ($width < $height) {$tmp = $height; $height = $width; $width = $tmp;}

// $size[0] ширина оригинала
// $size[1] высота оригинала
// $newx ширина превьюшки
// $newy высота превьюшки
if ($size[1] <= $size[0]) {$newx = $width; $newy = $height;} else {$newx = $height; $newy = $width;}
if ($size[1] < $newy or $size[0] < $newx) return false;

$x_ratio = $newx / $size[0];
$y_ratio = $newy / $size[1];
$ratio   = max($x_ratio, $y_ratio);
$use_x   = ($ratio == $x_ratio);

// Обрезаем исходный файл согласно $ratio
$neww = $use_x  ? $size[0] : floor($newx / $ratio);
$newh = !$use_x ? $size[1] : floor($newy / $ratio);
$newl = $use_x  ? 0 : floor(($size[0] - $neww) / 2);
$newt = !$use_x ? 0 : floor(($size[1] - $newh) / 2);

// Читаем в память image функцию
$source = $ifunc($src);
// Создаем новое изображение
$target = imagecreatetruecolor($newx, $newy);
// Копируем существующее изображение в новое с изменением размера:
imagecopyresampled(
  $target,     // Идентификатор нового изображения
  $source,     // Идентификатор исходного изображения
  0,0,         // Координаты (x,y) верхнего левого угла в новом изображении
  $newl,$newt, // Новые координаты (x,y) верхнего левого угла отцентрированного исходного блока
  $newx,       // Заданная ширина превьюшки
  $newy,       // Заданная высота превьюшки
  $neww,       // Новая ширина исходного блока согласно $ratio
  $newh        // Новая высота исходного блока согласно $ratio
  );

// Вывод
header('Content-Type: image/jpeg');
imagejpeg($target);

// Не забываем
imagedestroy($target);
imagedestroy($source);
}

$src = 'original.jpg'; // Исходный файл
Resize($src);
?>
я конечно не перечитал всех книг по js php sql и flash
но кмк это более правильная и универсальная превьюшка готовая заменить ту что в факе.
эта превьюшка по принципу "скажи что, и я уменьшу" (мне как раз такая и нужна была) а не авто уменьшение всей вашей библиотеки..
подскажите если ктото видит как еще её улучшить (не путать с наворотить)
 

alexblade

Новичок
хотелось бы 16 и 22 строчку както объединить (не потеряв в скорости) чтобы если у нас данн портренный оригинал а размеры превьюшки как раз height>width . у то меня проводится лишния операция туда-обратно.
 

fixxxer

К.О.
Партнер клуба
Эк мой говнокод 12-летней давности мутировал. :)
 

alexblade

Новичок
кажется нашол (по ссылке выше еще не ходил)
(($width > $height and $size[0] >= $size[1]) or ($width < $height and $size[0] <= $size[1])) {$newx = $width; $newy = $height;} else {$newx = $height; $newy = $width;}

fixxxer
ага ) но в лучшую сторону ?
 
Сверху