Сен 23

Делаем миниатюры из картинки

Рубрики: Php, Новости Метки: ,  Количество просмотров: 1 658

Расскажу немного о том, как сделать миниатюры из изображений средствами php, а если подробнее то с помощью библиотеки GD.

Моей целью было получать из фотографии миниатюру размером 150×100.
Мой код знает о существовании двух подводных камней, которые возникают при уменьшении изображений.

  1. Если высота больше ширины. Взять к примеру фото главного тренера Арсенала.
     

    Как видите фото с мсье Арсеном вертикальное, и чтобы его не портить, я высчитываю сколько я должен взять с верху пикселов чтобы изображение получилось красивым.
  2. Если ширина значительно больше высоты. Возьмем клубное фото Арсенала:
     
    В этом случае я позиционирую миниатюру по центру изображения 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;
}
Другие статьи автора

Комментарии

  1. Цитировать admin

    перепишу я эту статейку, многое изменил когда встраивал в rybalka.tv

  2. Цитировать blazg

    а этот код можно заюзать чтобы делать строго квадратные миниатюры типа 100*100 ?

  3. Цитировать alexander

    тааак, посмотрим, если использую, скажу где

Добавить комментарий