Сен 23
Делаем миниатюры из картинки
Расскажу немного о том, как сделать миниатюры из изображений средствами php, а если подробнее то с помощью библиотеки GD.
Моей целью было получать из фотографии миниатюру размером 150×100.
Мой код знает о существовании двух подводных камней, которые возникают при уменьшении изображений.
- Если высота больше ширины. Взять к примеру фото главного тренера Арсенала.

Как видите фото с мсье Арсеном вертикальное, и чтобы его не портить, я высчитываю сколько я должен взять с верху пикселов чтобы изображение получилось красивым. - Если ширина значительно больше высоты. Возьмем клубное фото Арсенала:
В этом случае я позиционирую миниатюру по центру изображения 150×100.

Исходник. Функция поддерживает jpg,png,gif изображения.
function create_thumbnail($in_name,$out_file,$thumb_width,$thumb_height){
$ret = false;
// если файл не существует, выходим
if( !file_exists($in_name) ) return $ret;
$info = getimagesize($in_name);
// если инфы о картинке нет, выходим
if( empty($info) ) return $ret;
if( 'image/jpeg' == $info['mime'] ){
//открываем рисунок в формате JPEG
$img = imagecreatefromjpeg($in_name);
if( !$img ) return $ret;
}
else if( 'image/gif' == $info['mime'] ){
//открываем рисунок в формате GIF
$img = imagecreatefromgif($in_name);
if( !$img ) return $ret;
}
else if( 'image/png' == $info['mime'] ){
//открываем рисунок в формате PNG
$img = imagecreatefrompng($in_name);
if( !$img ) return $ret;
}
else{
// Если формат не известен выходим
return $ret;
}
if( $thumb = imagecreatetruecolor($thumb_width,$thumb_height) ){
$new_height = @round(($thumb_width*$info[1])/$info[0]);
// Сколько взять по Y от оригинала
$y_proportion = @round($info[1]*$thumb_height/$new_height);
// С какой координаты по Y выводить тумбу
$dst_y = $new_height < $thumb_height ? ($thumb_height-$new_height)/2 : 0;
imagecopyresampled($thumb,$img,0,$dst_y,0,0,$thumb_width,$thumb_height,$info[0],$y_proportion);
// Если изображение сильно вытянуто по горизонтали, заливаем верх и низ белым
if( $dst_y ){
// Заливаем верх белым
imagefill($thumb,0,0,0xFFFFFF);
// Заливаем низ белым
imagefill($thumb,0,$thumb_height-1,0xFFFFFF);
}
// Сохраняем в файл
$ret = imagejpeg($thumb,$out_file,85); //сохраняем рисунок в формате JPEG
//освобождаем память и закрываем изображение
imagedestroy($thumb);
}
//освобождаем память и закрываем изображение
imagedestroy($img);
return $ret;
}
Другие статьи автора


перепишу я эту статейку, многое изменил когда встраивал в rybalka.tv
а этот код можно заюзать чтобы делать строго квадратные миниатюры типа 100*100 ?
Конечно
тааак, посмотрим, если использую, скажу где