Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Скрипт показа уменьшеных изображений (https://javascript.ru/forum/project/3308-skript-pokaza-umenshenykh-izobrazhenijj.html)

greatilya 06.04.2009 11:20

Скрипт показа уменьшеных изображений
 
Хотелось бы поделиться своей доработкой одного из скриптов:
Скрипт для создания превьюшек изображений

<?
function thumb($path,$x=0,$y=0,$f=0)
    {
    if($x == 0 and $y == 0 and $f==1) $f = 0;
	$t=getimagesize ($path) or die('Unknown type of image'); 
    $width=$t[0];
    $height=$t[1];
	if($x == 0 and $y == 0) { $x = $width; $y = $height; }
    switch ($t[2]) 
        {
        case 1:
        $type='GIF';
        $img=imagecreatefromgif($path); 
        break;
        case 2:
        $type='JPEG';
        $img=imagecreatefromjpeg($path);
        break;
        case 3:
        $type='PNG';
        $img=imagecreatefrompng($path);
        break;
        }
	if($x > 0 and $y > 0 and $f == 0) 
	{
		$x_tmp=$y*($width/$height);
		$y_tmp=$x*($height/$width);
		if($y_tmp < $y) $y = $y_tmp; else $x = $x_tmp;
	}
	if($x == 0) $x=$y*($width/$height);
    if($y == 0) $y=$x*($height/$width);
	
    header("Content-type: image/".$type);
    if($f == 1)
	{
		$thumb=imagecreatetruecolor($x,$y);
		imagecopyresampled($thumb,$img,0,0,0,0,$x,$y,$width,$height);
	}
	else
	{
		if($width>$x) 
		{ 
			$thumb=imagecreatetruecolor($x,$y);
			imagecopyresampled($thumb,$img,0,0,0,0,$x,$y,$width,$height);
		}
		else 
		{
			$thumb=imagecreatetruecolor($width,$height);
			imagecopyresampled($thumb,$img,0,0,0,0,$width,$height,$width,$height);
		}
	}
    $thumb=imagejpeg($thumb);
        return $thumb;
    }
if($_GET['name'])
{
	if($_GET['w']>0) $w = (int)$_GET['w']; else $w = 0;
	if($_GET['h']>0) $h = (int)$_GET['h']; else $h = 0;
	if(isset($_GET['forcibly'])) $forcibly = 1; else $forcibly = 0;  //принудительно
	//if($w == 0 and $h == 0) $w = 150; //значение ширины по умолчанию, если не заданы параметры
	echo thumb($_GET['name'], $w, $h, $forcibly);
}    
?>


Пример использования:
<img src="view_pic.php?name=files/6383.jpg&w=150&h=100&forcibly" border="0" />

где:
view_pic.php - имя файла с этим скриптом
files/6383.jpg - имя изображения относительно данного файла
w=150 - задаем ширину в 150px
h=100 - задаем высоту в 100px
forcibly - в переводе с англ. "принудительно" - если написать данный параметр, то размер изображения измениться, игнорируя соблюдение пропорций
все параметры кроме имени изображения являются не обязательными

greatilya 06.04.2009 11:24

Тут же размещу небольшой вопросик по данному скрипту:
Если изображение большое, к примеру: 3000х3000 800kb, тогда возникает следующая ошибка:
Цитата:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 2548 bytes) in C:\xampp\htdocs\view_pic.php on line 17
С небольшими изображениями работает исправно. Буду рад услышать замечания и критику по данному скрипту.

Kolyaj 06.04.2009 12:19

Писал такое как-то, только еще с наложением водяного знака.

Gvozd 06.04.2009 23:49

ошибка в общем-то как понятно из ее описания в нехватке памяти.
рисунок указаных вами размеров в TRUECOLOR режиме должен занимать не менее 27 метров в памяти.
остальная сожратая память, мне непонятна, но либо это какая-то дополнительная память выделяемая под рисунок, либо какой-то глюк getimagesize()
единственно возможное лечение в данном случае-либо не работать со столь большими рисунками, либо выделять больше памяти под PHP
а вообще, лучше ИМХО превьюшки делать не на лету, а заранее на ненагруженной машине, выделив необходимую память скриптам спокойно наделать превьюшек во временные папки, например.ну или типо того

greatilya 07.04.2009 03:51

Gvozd
С этим полностью согласен) но когда допустим нужно вывести всего 1 картику на экран, то скрипт в этом случае, именно то что нужно. Также подобные превьюшки актуальны для CMS, т.к. пользователь может загрузить тысячу фото. После он вставит каждую фотку в страницу, и о них забывает, следовательно превьюшки в будущем не понадабятся) Так зачем занимать лишнее место? ) Зато предлагаемый вами способ очень актален на сайтах, т.к. наплыв посетителей громадный, и если на каждое фото ждать обработчик, то лимит загрузки ЦП у хостера вскоре будет достигнут.
P.S.: Ну и мысли... еще не проснулся


Часовой пояс GMT +3, время: 10:27.