Третий параметр в приорететах: "Не более указанных размеров", чтобы миниатюра вписывалсь в указанные ограничения по ширине и высоте. Без обрезания картинки(код 2-мя постами выше). Тут можно генерировать имниатюру с фоном, чтобы не добавлять лишние DIV'ы в страницу, но можно и без него.
Четвертый: образование миниатюры "Кропом", как в первом посте у Kort, урезая их до заданного соотношения сторон.
Первые 2 лучше оставить для поддержки старых сайтов.
И раз уж будет правится эта функция:
то в начало тела этой функции предлагаю добавить конструкцию типа:
Это даст возможность кому необходимо создать свои функции создания миниатюр не хакая ядро. По аналогии с парсингом.
И, если добавлять в транк эти новшества, думаю имеет смысл их добавить в Genoa 0.6.11 - в очередную версию джижка, не откладывая до Siena.
Добавлено 25 дней спустя:
Вот так решил вопрос с генерацией миниатюр так, чтобы они не выходили за указанные размеры. Также предлагаемые ниже код уменьшает загружаемое изображение до заданных размеров и ставит "водяной знак".
Для этого в файл system/functions.custom.php добавить следующий код
/**
* Creates image thumbnail
*
* @param string $img_big Original image path
* @param string $img_small Thumbnail path
* @param int $small_x Thumbnail width
* @param int $small_y Thumbnail height
* @param string $extension Image type
* @param string $bgcolor Background color
* @param int $bordersize Border thickness
* @param int $jpegquality JPEG quality in %
* @param boolean $thumb_filled Превью полность заполняет указанные размеры?
* @param string $dim_priority Resize priority dimension
* @param res $source рессурс, указывающий на загруженное изображение
* использовать только если это изображение было загружено ранее
* чтобы не грузить его вновь в память из файла
*/
/**
* Use 4 thumb creation modes:
1 - Height priority
2 - Width priority
3 - Stay within specified thumb dimensions
*/
function portal30_createthumb($img_big, $img_small, $small_x, $small_y, $extension, $bgcolor, $bordersize, $jpegquality, $dim_priority="Width", $thumb_filled = false, &$source = NULL){
$dim_priority = 3; // by Alex - не выходим за указанные размеры
if (!function_exists('gd_info'))
{ return; }
$gd_supported = array('jpg', 'jpeg', 'png', 'gif');
$todestroy = false;
if (!$source){
switch($extension)
{
case 'gif':
$source = imagecreatefromgif($img_big);
break;
case 'png':
$source = imagecreatefrompng($img_big);
break;
default:
$source = imagecreatefromjpeg($img_big);
break;
}
$todestroy = true;
}
$big_x = imagesx($source);
$big_y = imagesy($source);
// расчет размеров превьюхи
if ($dim_priority=="Width")
{
$thumb_x = $small_x;
$thumb_y = floor($big_y * ($small_x / $big_x));
}
elseif ($dim_priority=="Height")
{
$thumb_x = floor($big_x * ($small_y / $big_y));
$thumb_y = $small_y;
}
elseif ($dim_priority==3) // by Alex
{
if ($big_x == $big_y){
$thumb_x = $small_x - $bordersize*2;
$thumb_y = $small_y - $bordersize*2;
}elseif ($big_x > $big_y){
$thumb_x = $small_x - $bordersize*2;
$thumb_y = floor($big_y * ($small_x / $big_x)) - $bordersize*2;
}elseif ($big_x < $big_y){
$thumb_x = floor($big_x * ($small_y / $big_y))+4 - $bordersize*2;
$thumb_y = $small_y - $bordersize*2;
}
}
// Создаем превьюху
if ($thumb_filled){
if ($cfg['th_amode']=='GD1'){
$new = imagecreate($small_x, $small_y);
}else{
$new = imagecreatetruecolor($small_x, $small_y);
}
$border_color = imagecolorallocate ($new, 153, 153, 153);
imagefilledrectangle ($new, 0,0, $small_x, $small_y, $border_color);
$background_color = imagecolorallocate ($new, $bgcolor[0], $bgcolor[1] ,$bgcolor[2]);
imagefilledrectangle ($new, $bordersize, $bordersize, $small_x - $bordersize -1, $small_y - $bordersize - 1, $background_color);
$dst_x = ( $small_x - $thumb_x ) / 2;
$dst_y = ( $small_y - $thumb_y ) / 2;
if ($cfg['th_amode']=='GD1'){
imagecopyresized($new, $source, $dst_x ,$dst_y, 0, 0, $thumb_x, $thumb_y, $big_x, $big_y);
}else{
imagecopyresampled($new, $source, $dst_x ,$dst_y, 0, 0, $thumb_x, $thumb_y, $big_x, $big_y);
}
}else{
if ($cfg['th_amode']=='GD1')
{ $new = imagecreate($thumb_x+$bordersize*2, $thumb_y+$bordersize*2); }
else
{ $new = imagecreatetruecolor($thumb_x+$bordersize*2, $thumb_y+$bordersize*2); }
$background_color = imagecolorallocate ($new, $bgcolor[0], $bgcolor[1] ,$bgcolor[2]);
imagefilledrectangle ($new, 0,0, $thumb_x+$bordersize*2, $thumb_y+$bordersize*2, $background_color);
if ($cfg['th_amode']=='GD1')
{ imagecopyresized($new, $source, $bordersize, $bordersize, 0, 0, $thumb_x, $thumb_y, $big_x, $big_y); }
else
{ imagecopyresampled($new, $source, $bordersize, $bordersize, 0, 0, $thumb_x, $thumb_y, $big_x, $big_y); }
}
switch($extension)
{
case 'gif':
imagegif($new, $img_small);
break;
case 'png':
imagepng($new, $img_small);
break;
default:
imagejpeg($new, $img_small, $jpegquality);
break;
}
imagedestroy($new);
if ($todestroy) imagedestroy($source);
}
/**
* Уменьшаем изображение и ставим водяной знак
* @param string $source_f Путь и имя файла исходного изображения
* @param int $width Предельная ширина изображения
* @param int $height предельная высота изображения. Она имеет приоретет
* @param int $extension тип изображения (расширение) 'jpg', 'jpeg', 'png', 'gif'
* @param string $watermark Путь и имя файла водяного знака
* @param boolean $create_thumb Создавать ли превьюху. Это действие заменит стандартный процесс
* создания превьюх
* @param string $thumb_f Путь и имя файла создаваемой превьюхи
*/
$p30_img_width = 950;
$p30_img_heght = 520;
$p30_watermark = './skins/alex-natty-2/img/watermark.png'; // пока только PNG
$p30_jpegquality = 80;
$p30_thumb_filled = true; // Превью полность заполняет указанные размеры?
function process_uploaded_imgage($source_f, $width, $height, $extension, $jpegquality = 80, $watermark = '', $create_thumb = false, $thumb_f = ''){
global $cfg, $p30_thumb_filled;
if (!function_exists('gd_info'))
{ return; }
$gd_supported = array('jpg', 'jpeg', 'png', 'gif');
switch($extension)
{
case 'gif':
$source = imagecreatefromgif($source_f);
break;
case 'png':
$source = imagecreatefrompng($source_f);
break;
default:
$source = imagecreatefromjpeg($source_f);
break;
}
// Создаем превью
if($create_thumb){
$th_colorbg = array(hexdec(substr($cfg['th_colorbg'],0,2)), hexdec(substr($cfg['th_colorbg'],2,2)), hexdec(substr($cfg['th_colorbg'],4,2)));
portal30_createthumb($source_f, $thumb_f, $cfg['th_x'],$cfg['th_y'], $extension, $th_colorbg, $cfg['th_border'], $cfg['th_jpeg_quality'], $cfg['th_dimpriority'], $p30_thumb_filled, $source);
}
$big_x = imagesx($source);
$big_y = imagesy($source);
if ( ($big_x > $width) || ($big_y > $height)){
if ($big_x == $big_y){
$new_x = $height;
$new_y = $height;
}else{
$new_x = floor($big_x * ($height / $big_y))+4;
$new_y = $height;
}
if ($new_y > $height){
$new_x = floor($new_x*($height / $new_y));
$new_y = $height;
}
if ($new_x > $width){
$new_y = floor($new_y*($width / $new_x));
$new_x = $width;
}
}else{
$new_x = $big_x;
$new_y = $big_y;
}
$new_img = imagecreatetruecolor($new_x, $new_y);
imagecopyresampled($new_img, $source, 0 ,0, 0, 0, $new_x, $new_y, $big_x, $big_y);
if ($watermark != ''){
list($watm_x, $watm_y) = getimagesize($watermark);
if ( ($watm_x + 60) < $new_x && ($watm_y + 40) < $new_y ){
$watm = imagecreatefrompng($watermark);
imagecopy($new_img, $watm, $new_x - $watm_x - 30 , $new_y - $watm_y - 20, 0, 0, $watm_x, $watm_y);
imagedestroy($watm);
}
}
unlink($source_f);
switch($extension)
{
case 'gif':
imagegif($new_img, $source_f);
break;
case 'png':
imagepng($new_img, $source_f);
break;
default:
imagejpeg($new_img, $source_f, $jpegquality);
break;
}
imagedestroy($new_img);
imagedestroy($source);
} // process_uploaded_imgage
Есть миры, не здесь, там, где небеса горят, и моря засыпают, и реки дремлют; люди сделаны из дыма, а города – из песен. Где-то опасность, где-то несправедливость, даже где-то остыл чай. Идем Эйс, у нас много работы!...
...Sorry for my english...
Бесплатные расширения для Cotonti: https://lily-software.com/free-scripts/
This post was edited by Alex300 (2010-10-28 06:06, 14 years ago)