Определение размера превью в зависимости от формата фото

novikov

Новичок
Здравствуйте, я пишу фотогалерею для сайта. Все стандартно: мелкие превью по клику открывают большие фото. Проблема в том, что формат фотографий очень разный (горизонтальные, вертикальные, квадратные).

Хочется, чтоб превью нормально укладывались в строку, поэтому подумал о написании скрипта, который будет сам анализировать количество и формат фото и генерировать превью таких размеров, чтобы они хорошо укладывались в строки на сайте. Если еще не поняли о чем я, посмотрите как это сделано В Контакте.

Вопрос: по какому алгоритму вычислять необходимые размеры превью =)?

P. S. Возможно это было бы проще написать на javascript, но я в нем не силен. Хотя если есть уже готовая библиотека, прошу дать ссылку.
 

WMix

герр M:)ller
Партнер клуба
кстати прикольная штучка, идейка простенькая, но оч удобно...!
 

novikov

Новичок
Не совсем то, что В Контакте, но это мне помогло понять принцип по которому высчитываются размеры изображений. В итоге написал что-то подобное на PHP. Вот пример работы: kiralao.com/vizhuals/

Если кому интересно, вот исходный код (писал для себя, так что прошу не ругать за читаемость):

PHP:
<?php 

function savethumb ($path, $image, $size) {

	if (!is_file($path)) {
		list($width, $height)=getimagesize($image);
		$original=imagecreatefromjpeg($image);
		$thumb=imagecreatetruecolor($size['width'], $size['height']);
		imagecopyresampled($thumb, $original, 0, 0, 0, 0, $size['width'], $size['height'], $width, $height);
		imagejpeg($thumb, $path, 100);
		
		echo 'Создано изображение '.$path.', шириной '.$size['width'].' и высотой '.$size['height'].' пикселей.<br />';
	}
	return $path;
	
}

function makethumbs ($files, $params=false) {
	
	// $files - массив с адресами фото. В Интернете или на диске
	
	if(!is_array($params)) $params=array(
			'height'=>200, // Минимальная высота строки
			'width'=>850, // Ширина колонки
			'margin'=>1, // Расстояние между фотографиями
			'folder'=>'thumbs/' // Папка, в которую будут записаны миниатюры. С слешем в конце
			);
		
	foreach($files as $file) {
		list($images[$file]['width'], $images[$file]['height'])=getimagesize($file);
	}
	
	$i=0;
	foreach($images as $file=>$image){
		if (($str_width+($width=$image['width']*$params['height']/$image['height']))>=$params['width']) {
			$strings[$i]['height'] = $params['height']*($params['width']-$params['margin']*count($strings[$i]['files'])+$params['margin'])/($str_width-$params['margin']*count($strings[$i]['files']));
			$str_width=$width+$params['margin'];
			$i++;
		} else $str_width+=$params['margin']+$width;
		$strings[$i]['files'][$file]=$image;
		
	}
	$strings[$i]['height']=$params['height']*($params['width']-$params['margin']*count($strings[$i]['files'])+$params['margin'])/($str_width-$params['margin']*count($strings[$i]['files']));
	
	foreach ($strings as $key=>$string) {
		$str_width=0;
		foreach($string['files'] as $file=>$image) $str_width+=round($string['height']/$images[$file]['height']*$images[$file]['width'])+$params['margin'];
		$strings[$key]['width']=$params['width']-($str_width-$params['margin']);
	}
	
	$i=1;
	foreach ($strings as $key=>$string) {
		$files_counter=count($string['files']);
		foreach($string['files'] as $file=>$image) {
			$img_width=$string['height']/$images[$file]['height']*$images[$file]['width'];
			savethumb($params['folder'].$i++.'.jpg', $file, array('width'=>round($img_width+(($string['width']>0)?ceil($string['width']/$files_counter):floor($string['width']/$files_counter))), 'height'=>round($string['height']))).'<br />';
			//echo '<img style="display: block; margin-right: '.$params['margin'].'px; float: left" src="'.savethumb($params['folder'].$i++.'.jpg', $file, array('width'=>round($img_width+(($string['width']>0)?ceil($string['width']/$files_counter):floor($string['width']/$files_counter))), 'height'=>round($string['height']))).'" />';
			$string['width']-=(($string['width']>0)?ceil($string['width']/$files_counter):floor($string['width']/$files_counter));
			$files_counter--;
		} //echo '<div style="clear: both; height: '.$params['margin'].'px; font-size: 0%"></div>';
	}
	
}


?>
 
Сверху