scf4u - Оптимизирано вмъкване на изображения

От много време искам да напиша този пост. Все не стига или време, или желание. Е сега явно е ударил часът. Замисляли ли сте се, кои са основните  елементи в дадена страница?

Това са текст, изображения и разбира се стиловите елементи. В тази статия, ще се спрем върху изображенията. Спирам се върху тях, защото това са и често най-грешно използваните елементи. Какво визирам под грешно? Колко от Вас, занимаващи се с изграждане на уеб страници, винаги указват размерите на дадено изображение?

Повечето дизайнери/програмисти смятат, че ако то ще се използва в истинските му размери, т.е. няма да бъде преоразмерявано, няма нужда да му се укажат стойностите на широчина(width) и височина(height). И действително, дори да не ги укажете, всичко се визуализира нормално и Вие решавате “щом работи, няма нужда да се указват”. Е да, ама не.

При зареждането на страницата, ако не са указани размери на изображението, то браузърът по подразбиране задава размери 10×10 и поставя останалите елементи от страница, докато се зареди изображението. В не един и два случая обаче, размерите на изображението се оказват други, те се поправят, и елементите трябва да се пренаредят. Това бави зареждането на страницата, а ние далеч не желаем това.

Ясно е, че е неудобно всеки път, да проверяваме какъв е размера на изображението, което включваме в дадена странца. Защо да не автоматизираме този процес? За целта написах един прост клас scf4u(SimpleClassFunctions4you), с две функции. Ще използвам този клас, като дописвам и други такива функции, които ще видите в следващите статии.

Сега към кода на първата функция:

/**
	 * @desctiption: Simple php function that calculates image's 
	 * width and height. The first parameter is contains 
	 * Image File URL, the second is for image border, and the last 
	 * defines image's alt. 
	 * @based: Based on Hack #9 from PHP Hacks by Jack D(O'Reilly)
	 * @created: 17 May 2008
	 **/
	public function img0($file, $border, $alt){
 
		$clean = array();
		$clean['alt'] = htmlentities($alt, ENT_QUOTES, 'UTF-8');
		if(ctype_digit($border)){
			$clean['border'] = $border;
		}
		else{
			$clean['border'] = 0;
		}
 
		list($width, $height) = getimagesize($file);
		echo( "<img src=\"{$file}\" 
				style=\" width: {$width}; height :{$height};\" 
				border=\"{$clean['border']}\" 
				alt=\"{$clean['alt']}\" 
		/>");
	}

С простата функция img0() задавате пътя до изображенето, рамката, която искате да му приложите и разбира се описанието му(alt). Функцията, започва със създаването на празен масив, в който ще съхраняваме филтрираните данни. С помощта на htmlentities() заместваме всякакви символи, които биха могли да се изпълнят от браузъра с техните HTML заместители. Чрез getimagesize() се определят размерите на изображението и се описват в края на функцията.

Разбира се, често ни се налага и да преоразмеряваме изображенията, които ще използваме в странциата си. Най-добре е това да се прави предварително, за да не се налага потребителският браузър да го прави, но все пак се налага понякога. Ето и функция, идентична като горепосочената, но с два параметъра за широчина(width) и височина(height):

/**
	 * @desctiption: Simple php function. The first parameter is contains 
	 * Image File URL, the second is for image border, and the last 
	 * defines image's alt. 
	 * @based: Based on Hack #9 from PHP Hacks by Jack D(O'Reilly)
	 * @created: 17 May 2008
	 **/
	public function img1($file, $border, $alt, $width, $height){
 
		$clean = array();
		$clean['alt'] = htmlentities($alt, ENT_QUOTES, 'UTF-8');
 
		$nums = array();
		if(!ctype_digit($border) ? $num['border'] = $border : $num['border'] = 0);
		if(!ctype_digit($width) ? $num['width'] = $height : $num['width'] = 0);
		if(!ctype_digit($height) ? $num['height'] = $height : $num['height'] = 0);
 
 
		list($width, $height) = getimagesize($file);
		echo( "<img src=\"{$file}\" 
 
				style=\" width: {$num['width']}; height :{$num['height']};\" 
				border=\"{$num['border']}\" 
				alt=\"{$clean['alt']}\" 
		/>");
	}

Обединявам двете функции в един клас - scf4u(SimpleClassFunctions4you). Ще има следващи прости, но полезни функции, които ще дописвам в него. В следващата статия мисля, да засегна хеширането на стрингове, но приемам и идеи.

Държа да отбележа, че идеята за тези функции, дойде от книгата “PHP Хакове” - O’Reilly. В книгата е указано, че при използване на съвсем малки части от кода, то те не претендират за собственост върху тях и дори не е задължително да бъдат указани като източник, все пак държа да го отбележа.

Можете да свалите класа от тук:
[Download scf4u - tar.bz2 (11.4KB)]
[Download scf4u - rar        (12.5KB)]

Класът се разпространява под GNU General Public License version 3 или по-нова


5 Responses to “scf4u - Оптимизирано вмъкване на изображения

  • 1
    Мъро
    August 20th, 2008 09:46

    Да видим дали правилно сме разбрали… предлагаш при всяка визуализация на снимка да отваряме изображението с PHP, да му вземем размерите и да го изплюем тогава в xhtml-а заедно с генерираната style дефиниция?

    Говорейки за оптимизация… ;)

  • 2
    Кирил Владимиров - NetCutter
    August 20th, 2008 17:42

    Говоря за изображения, които ще бъдат вмъкнати динамично. Ако изображенията биват използвани в темплейта, то е по-логично да им бъдат взети размерите ръчно и да бъдат посочени.
    А едно отваряне и взимане на размерите на изображение, не товари сървъра толкова, колкото товари потребителската машина определянето на размерите от браузъра :)

  • 3
    Мъро
    August 24th, 2008 00:19

    Хм, не съм особено съгласен. User agent-а (браузера) така или иначе взима параметрите на всички изображения - включително и широчината и височината. Та в случай, че изрично не си посочил размерите на изображението, той слага автоматично тези, които са заложени във файла. Т.е. при нареждането на обектите в уеб-страницата разликата дали ти ще му подадеш размерите на изображението на браузера или той ще си ги вземе е… незначителна, ако ще и да си секрет в носната кухина на костенурка.
    От друга гледна точка трупаме излишни бази данни с размерите на изображенията (защото до колкото разбрах това ти е идеята), което при един по-сериозен сайт прави и заявките малко по-сложни за обхождане, пък и взимаме данни от 2 полета повече. ОК, не чак кой-знае колко, но със сигурност повече, отколкото натоварването на потребителския браузер да прочете width и height на вече дръпнатото изображение :)

  • 4
    Кирил Владимиров - NetCutter
    August 30th, 2008 13:36

    Мъро, има само един начин да разбереш. Намери или си направи някакъв тежък дизайн. Примерно нарязан с Фотошоп. без да определяш големината на изображенията го отвори.
    В началото всяко изображение е малка клетчица 10×10…след което със зареждане на всяка се преоразмеряват. След което изтрий кеша и им укажи на всяко едно големината.

    За засичането използвай адони, като Web Developer за Firefox. И засечи, при кой случай страницата се е заредила по-бързо.
    Ще останеш учуден ;)

Leave a Reply



TopBloglog image