Thumbnail

Итак, сегодня поговорим о такой вещи как thumbnail. Что же это такое? Все  пользователи ос windows видели в проводнике режим "эскизы страниц", который делает предпросмотр в случае с фото. Так вот как раз уменьшеная картинка это и есть thumbnail, в переводе на русский - миниатюра.

При создании web-страниц thumbnail встречается очень часто, достаточно посмотреть любую фотогалерею. Можно конечно сделать миниатюру задав размеры прямо в теге "img", но это плохое решение - фото будет загружаться все равно в полном размере, и размер его будет уменьшать браузер. Такой thumbnail делает загрузку страницы медленной, да и выглядит некрасиво. Так как же собственно быть - не загружать же на сайт изображения 2 раза, сначала оригинал, а потом thumbnail? Конечно же нет - есть много решений для такой манипуляции, приведу пример одного из них, которое я использовал на практике. Написано оно на php и уменьшает изображения форматов gif,jpg,png - всех что используются на web-сайтах. Решение использует библиотеку GD - но она по умолчанию доступна у всех хостеров.

Итак наше решение будет сжимать изображение с сохранением пропорций, используя 2 параметра - максимальные размеры сторон в пикселах. Функция принимает адрес изображения в качестве параметра. В моем случае она работала совместно с формой отсылки анкетных данных пользователя на сервер. Файл отправлялся методом POST а на выходе мы имели 2 изображения - thumbnail и исходное, сохранялись они в каталоге "regmail". Одно служило ссылкой-предпросмотром, второе отображалось в отдельном окне при клике на ссылке.

Для создания thumbnail использовалась следующая функция:

function create_mini($kartinka)
 {
  $kartinka = str_replace( 'http://www.sitename.ru', '.', $kartinka);
  if ((is_file($kartinka) && !is_file(str_replace(basename($kartinka), '', $kartinka)."mini_".$kartinka))&&(strpos($kartinka,"mini_")===false)) // файл есть, он не является миникартинкой, миникартинки нет
 {
        $width = 150;
	$height = 150;
	//Инизиализируем ширину и высоту для thumbnail
	$e=basename($kartinka);
	$filename = './regmail/'.$e;
	$filename2 = './regmail/mini_'.$e;
 
	// Создаем изображение
 
	if(strpos($e,".jpg")!==false) {$img = imagecreatefromjpeg($filename);}
	if(strpos($e,".gif")!==false) {$img = imagecreatefromgif($filename);} 
	if(strpos($e,".png")!==false) {$img = imagecreatefrompng($filename);}
 
	if ($img) 
	{
	// Получаем размер исходного изображения и соотношение сторон
	list($width_orig, $height_orig) = getimagesize($filename);	
	$ratio_orig = $width_orig/$height_orig;
 
	if ($width/$height > $ratio_orig) {
    $width = floor($height*$ratio_orig);
    } else {
    $height = floor($width/$ratio_orig);
    }
	$image_p = imagecreatetruecolor($width, $height);
	imagecopyresampled($image_p, $img, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
        //новое thumbnail создано
	}
 
// Output
if(strpos($e,".jpg")!==false) {imagejpeg($image_p, $filename2, 75);}
if(strpos($e,".gif")!==false) {imagegif($image_p, $filename2, 75);}
if(strpos($e,".png")!==false) {imagepng($image_p, $filename2, 75);}
//рисунок thumbnail сохранен в каталоге - очищаем память
imagedestroy($image_p);
imagedestroy($img);
 }
 }

Данная функция может быть использована не только для создания thumbnail, но и с целью просто уменьшить рисунок. Сложности могут возникать в том, что процесс очень требователен к памяти - в процессе обработки изображение преобразуется в несжатое - а там размер памяти пропорционален размеру в пикселах. Потому если возникают проблемы на больших изображениях - нужно либо увеличить лимит памяти в настройках, либо ограничить размер входящих изображений. Ну вот и все тонкости. В дальнейшем можно использовать полученные thumbnail по вашему усмотрению.

До скорой встречи!