Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Функция создания превью
Glorious  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 64
Пользователь №: 28794
На форуме: 6 лет, 7 дней
Карма:




Есть функция, которая создает превью из изображений.

Проблема заключается в том, что если у превью масштаб не 1 к 1, а, напимер, 240 на 200, то у широких изображений превью получается сплюснутым по высоте.

За это отвечает этот код.
if( $image[0] > $image[1] ) {
// For landscape images
$x_offset = ($image[0] - $image[1]) / 2;
$y_offset = 0;
$square_size = $image[0] - ($x_offset * 2);
}


Помогите пожалуйста переписать его, чтобы превью не было сплюснутым.

Полная функция:
function createThumb($src_image, $dest_image, $thumb_width, $thumb_height, $jpg_quality = 90) {
// Get dimensions of existing image
$image = getimagesize($src_image);
// Check for valid dimensions
if( $image[0] <= 0 || $image[1] <= 0 ) return false;
// Determine format from MIME-Type
$image['format'] = strtolower(preg_replace('/^.*?\//', '', $image['mime']));
// Import image
switch( $image['format'] ) {
case 'jpg':
case 'jpeg':
$image_data = imagecreatefromjpeg($src_image);
break;
case 'png':
$image_data = imagecreatefrompng($src_image);
break;
case 'gif':
$image_data = imagecreatefromgif($src_image);
break;
default:
// Unsupported format
return false;
break;
}
// Verify import
if( $image_data == false ) return false;
// Calculate measurements
if( $image[0] > $image[1] ) {
// For landscape images
$x_offset = ($image[0] - $image[1]) / 2;
$y_offset = 0;
$square_size = $image[0] - ($x_offset * 2.2);
} else {
// For portrait and square images
$x_offset = 0;
$y_offset = ($image[1] - $image[0]) / 2;
$square_size = $image[1] - ($y_offset * 2);
}
// Resize and crop
$canvas = imagecreatetruecolor($thumb_width, $thumb_height);
if( imagecopyresampled($canvas, $image_data, 0, 0, $x_offset, $y_offset, $thumb_width, $thumb_height, $square_size, $square_size )) {
// Create thumbnail
switch( strtolower(preg_replace('/^.*\./', '', $dest_image)) ) {
case 'jpg':
case 'jpeg':
return imagejpeg($canvas, $dest_image, $jpg_quality);
break;
case 'png':
return imagepng($canvas, $dest_image);
break;
case 'gif':
return imagegif($canvas, $dest_image);
break;
default:
// Unsupported format
return false;
break;
}
}
else {
return false;
}
}




Спустя 4 минуты, 35 секунд (13.01.2012 - 16:54) nugle написал(а):
Цитата
Помогите пожалуйста переписать его, чтобы превью не было сплюснутым.

а какое оно по-твоему должно быть если 1 к 1?

Спустя 3 минуты, 42 секунды (13.01.2012 - 16:58) Glorious написал(а):
1 к 1, это когда ширина равна высоте — 100x100, 150x150 и т.д.
Квадратные превью создаются правильно.

А вот превью с разрешением 240x200 получаются сплюснутыми по высоте.

Спустя 30 минут, 13 секунд (13.01.2012 - 17:28) nugle написал(а):
они и будут сплюснуту, как иначе то ты хочешь?
если чтобы просто уменьшались, то уменьшай по ширине, а высоте поставь height:auto;

Спустя 13 часов, 3 минуты, 46 секунд (14.01.2012 - 06:32) Glorious написал(а):
Переделал функцию, теперь нормально работает с непропорциональными превью.

Может кому пригодиться.

Вызов: createThumb('current.jpg', 'thumb.jpg', ширина, высота, качество);

function createThumb($src_image, $dest_image, $thumb_width, $thumb_height, $jpg_quality = 90) {
// Get dimensions of existing image
$image = getimagesize($src_image);
// Check for valid dimensions
if( $image[0] <= 0 || $image[1] <= 0 ) return false;
// Determine format from MIME-Type
$image['format'] = strtolower(preg_replace('/^.*?\//', '', $image['mime']));
// Import image
switch( $image['format'] ) {
case 'jpg':
case 'jpeg':
$image_data = imagecreatefromjpeg($src_image);
break;
case 'png':
$image_data = imagecreatefrompng($src_image);
break;
case 'gif':
$image_data = imagecreatefromgif($src_image);
break;
default:
// Unsupported format
return false;
break;
}
// Verify import
if( $image_data == false ) return false;
// Calculate measurements
if( $image[0] > $image[1] ) {
// For landscape images
$x_offset = ($image[0] - $image[1]) / 2;
if($thumb_width == $thumb_height) {
$y_offset = 0;
} else {
$y_offset = $image[1] / 10;
}
$square_size = $image[0] - ($x_offset * 2);
} else {
// For portrait and square images
$x_offset = 0;
$y_offset = ($image[1] - $image[0]) / 2;
$square_size = $image[1] - ($y_offset * 2);
}
// Resize and crop
$canvas = imagecreatetruecolor($thumb_width, $thumb_height);
if( imagecopyresampled($canvas, $image_data, 0, 0, $x_offset, $y_offset, $thumb_width, $thumb_width, $square_size, $square_size )) {
// Create thumbnail
switch( strtolower(preg_replace('/^.*\./', '', $dest_image)) ) {
case 'jpg':
case 'jpeg':
return imagejpeg($canvas, $dest_image, $jpg_quality);
break;
case 'png':
return imagepng($canvas, $dest_image);
break;
case 'gif':
return imagegif($canvas, $dest_image);
break;
default:
// Unsupported format
return false;
break;
}
}
else {
return false;
}
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса