Zmenšení obrázku v PHP (vhodné například pro náhledy v galeriích (tzv. thumbnaily nebo miniatury))

Rychlou představu toho, co myslím pod pojmen thumbnail, získáte, pokud si ve WindowsXP v nějaké složce změníte způsob zobrazování (v anglické verzi View -> Thumbnails, v české myslím Zobrazit -> Miniatury )

Pokud chcete dávat na web obrázky i s náhledy (thumbnail), měli byste na server ukládat jejich zmenšené verze právě pro účely thumbnailů. Je sice pravda, že když chcete na stránce zobrazit zmenšený obrázek, můžete jeho rozměry upravit atributy width a height tagu img (které byste měli vždy uvádět), popř. jejich obdobou v CSS skriptu třeba takhle

img { width: 80px; height: 80px; }

Tím sice dosáhnete toho, že se na stránce zobrazí obrázek zmenšený a ušetříte tak místo, ale prohlížeč nejdřív musí stáhnout obrázek v plné velikosti než ho bude moct zmenšený zobrazit. A to může trvat velmi dlouho, pokud máte už jen pár obrázků v řádu stovek kb.

Zmenšené obrázky si můžete vytvořit sami (třeba pomocí IrfanView nebo Photoshopu) a na server vždy umísťovat obě verze - zmenšenou i plnou. Při větším počtu obrázků to ale začne být otrava a pokud chcete, aby obrázky vkládali vaši uživatelé, většina z nich pravděpodobně ani nepochopí, co po nich chcete, nebo se jim nebude chtít, něco takového dělat.

Pokud používáte PHP, můžete použít funkci obdobnou této. Podotýkám, že na serveru, na kterém PHP běží, musí být také funkční GD knihovna (to zjistíte např. funkcí php_info(); - pokud je knihovna funkční, zobrazí se pro ni kolonka). Naštěstí už je dnes na hostinzích GD knihovna víceméně standard.

Pokud používáte ASP.NET, můžete si návod pro zmenšování obrázků přečíst v mém dalším článku: Zmenšování obrázků v ASP.NET

<? function Resizer( $filename, //cesta k souboru, ktery chcete zmensit $copypath, //cesta, kam zmenseny soubor ulozit $MaxWidth, //maximalni sirka zmenseneho obrazku $MaxHeight) //maximalni vyska zmenseneho obrazku { //zjistime puvodni velikost obrazku list($OrigWidth, $OrigHeight) = getimagesize($filename); //hodnota 0 v parametrech MaxWidth resp. MaxHeight znamena, //ze sirka resp. vyska vysledku muze byt libovolna if ($MaxWidth == 0) $MaxWidth = $OrigWidth; if ($MaxHeight == 0) $MaxHeight = $OrigHeight; //nyni vypocitam pomer zmenseni $pw = $OrigWidth / $MaxWidth; $ph = $OrigHeight / $MaxHeight; if ($pw > $ph) $p = $pw; else $p = $ph; if ($p < 1) $p = 1; //v p ted mame pomer pro zmenseni //vypocitame vysku a sirku zmenseneho obrazku $NewWidth = (int)$OrigWidth / $p; $NewHeight = (int)$OrigHeight / $p; //vytvorime novy obrazek pozadovane vysky a sirky $image_p = imagecreatetruecolor($NewWidth, $NewHeight); //otevreme puvodni obrazek se souboru $image = imagecreatefromjpeg($filename); //a okopirujeme zmenseny puvodni obrazek do noveho imagecopyresampled($image_p, $image, 0, 0, 0, 0, $NewWidth, $NewHeight, $OrigWidth, $OrigHeight); //a ulozime imagejpeg($image_p, $copypath, 100); } ?>


Ohodnoťte prosím užitečnost článku




248
 
36
 
34
 
29
 
32
 
 
Vložit komentář:
 

 



 

 

Nepoužívejte žádné html ani texy značky, odřádkování se zachová. Pokud uvádíte zdrojový kód, můžete ho vložit mezi značky
<syntax jazyk="PHP">...</syntax>,
bude potom zformátován. Jako atribut můžete uvést PHP, C#, HTML, CSS a mnoho dalších.


opiste cislo Opište číslo:

 

4/1/2006 12:55:26 PM
[1] (peta)
r odpovědět
tes
4/24/2006 4:32:16 PM
[2] (CrazyDog (crazydoga(at)gmail.com))
Dotaz odpovědět
Moc se mi to hodi, ale nezda se mi to uplne. Nejak jsem nepochopil, jak vyvolat obrazek :-/ Mohli by jste to dodelat a nebo nejaky nahled na urcitym obrazku treba ke stazeni v *.zip ? Diky
8/28/2006 1:06:42 PM
[3] (Dave)
Jo odpovědět
S tim naprosto souhlasim...
8/30/2006 11:11:44 AM
[4] (Jo)
Jo odpovědět
Uz vim. Hlavni skript uloz do resize.php a do souboru obrazek.php dej tenhle skript:

<? require "resize.php"; Resizer("a.JPG","b.JPG",100,100); ?> <html> <head> </head> <body> <img src="b.JPG"> </body> </html>
10/3/2006 2:26:43 PM
[5] (Johnyz (intl.man(at)seznam.cz))
vzdaleny server odpovědět
ahoj,
chci se zeptat jak to bude fungovat, kdyz do filename napisu takovouto cestu k obrázku:
http://vzdaleny_server/img.asp?id_produktu=4560
Jde o to ze obrázek na vzdáleném serveru je uložen v nějaké databázi a oni jej volají přes img skript tím, že zadají proměnnou id_produktu.
No a mě zajímá, jestli pochopí, že tohle je obrázek a zavolá si to, anebo zhavaruje a hodí chybu.
10/5/2006 11:18:15 PM
[6] (Trupik (jakub.maly(at)atlas.cz)) www
Re: Vzdaleny server odpovědět
K pristupu k obrazku se vola funkce imagecreatefromjpeg a o te se pise v manualu:
imagecreatefromjpeg -- Create a new image from file or URL. Takze by to fungovat melo, i kdyz jsem to nezkousel. Predana URL ale musi byt primo URL obrazku (ne treba URL stranky, na ktere je obrazek zobrazen). Vyzkousejte a napiste vysledek:).
10/8/2006 10:28:05 AM
[7] (Johnyz)
.... odpovědět
Konečně jsem se dostal k otestování, měl jsem tam drobnou chybu, ale je to jak říkáš:

zpracuje: přímý název souboru (obrazek.gif), relativní cestu k souboru(../neco/obrazek.gif), také absolutní cestu k souboru (http://neco.cz/obrazek.gif).
Nezpracuje cestu k obrázku ze skriptu (http://www.neco.cz/obrazek.php?id=123456).
10/8/2006 10:29:41 AM
[8] (Johnyz)
.. odpovědět
já si to pletl tak trochu s funkcí File_exists, protože právě tam nedokáže pracovat se souborama ze vzdáleného serveru.
10/9/2006 9:10:03 PM
[9] (Trupik (jakub.maly(at)atlas.cz)) www
Re: ... odpovědět
Obrazek ze skriptu by podle mne melo zpracovat take, pokud url skutecne vraci obrazek, nevidim zpusob, jak by php rozlisilo, jestli je obrazek generovan skriptem nebo ulozen v souboru.
10/19/2006 4:20:50 PM
[10] (radek)
navrh na korekci odpovědět
Diky za kod, hledal jsem nejakou rychlou hotovku :-). Jeste bych to upravil takle, potom to bude chodit i pro zvetsovani. Deleni $origWidth, $origHeight necht si kazdy osetri podle chuti :-)

function resizer( $filename, //cesta k souboru, ktery chcete zmensit $copypath, //cesta, kam zmenseny soubor ulozit $MaxWidth, //maximalni sirka zmenseneho obrazku $MaxHeight)//maximalni vyska zmenseneho obrazku { //zjistime puvodni velikost obrazku list($OrigWidth, $OrigHeight) = getimagesize($filename); //hodnota 0 v parametrech MaxWidth resp. MaxHeight znamena, //ze sirka resp. vyska vysledku muze byt libovolna if ($MaxWidth == 0) $MaxWidth = $OrigWidth; if ($MaxHeight == 0) $MaxHeight = $OrigHeight; //nyni vypocitam pomer zmenseni $pw = $MaxWidth / $OrigWidth; $ph = $MaxHeight / $OrigHeight; $p = max($pw, $ph); //vypocitame vysku a sirku zmenseneho obrazku $NewWidth = (int)$OrigWidth * $p; $NewHeight = (int)$OrigHeight * $p; //vytvorime novy obrazek pozadovane vysky a sirky $image_p = imagecreatetruecolor($NewWidth, $NewHeight); //otevreme puvodni obrazek se souboru $image = imagecreatefrompng($filename); //a okopirujeme zmenseny puvodni obrazek do noveho imagecopyresampled($image_p, $image, 0, 0, 0, 0, $NewWidth, $NewHeight, $OrigWidth, $OrigHeight); //a ulozime imagepng($image_p, $copypath); }
10/22/2006 3:13:55 PM
[11] (ZIMINIX (ziminix(at)seznam.cz))
Super odpovědět
Přesně to jsem hledal. Moc dík
11/27/2006 6:35:16 PM
[12] (Unknown89 (name89(at)seznam.cz))
:-) odpovědět
Presne tohle jsem hledal -> vyborny clanek, tak jen, aby mi to fungovalo :-)
4/11/2007 5:20:41 PM
[13] (cod (cod.xf(at)seznam.cz))
vodoznak odpovědět
poradi mi prosím někdo? Potřebuji obrázek zmenšit např na 500px a do něj vložit vodoznak. díval jsem se na oba návody, dával je dohromady, ale vůbec to nejde. Nemohli byste prosím někdo napsat ten kód jak má být a poslat na email.
5/15/2007 8:27:46 PM
[14] (Qnik)
Dobrý odpovědět
jo..vypadá to logicky, ale řekněte mě proč mě to nejde, i když ty knihovny jedou?!...
7/15/2007 7:02:55 PM
[15] (Karol (aion(at)atlas.sk)) www
Ladenie odpovědět
V príklade nezabudnite vo funkcii imagejpeg($image_p,$copypath,100) pridať aj názov nového obrázku. Napríklad $copypath =."novy.jpg"
Zároveň nezabudnite nastaviť prístupové práva na cieľový adresár na 777 aby ste mohli nový obrázok zapísať.
Inak, ďakujem za príklad. Pomohol mi.
7/23/2007 10:21:19 PM
[16] (Ax)
dik odpovědět
me take pomohl, dik
8/7/2007 9:51:34 PM
[17] (wasil (petr.kramar(at)gmail.com))
Kde je chyba?? odpovědět
Ahoj zkouším to na localhostu a vypíše mi to adresu jako obrázek localhost/galerie.php nevíte co s tím?
php_gd.dll zapnuty je tak nevim kde je problem :(
4/24/2008 6:29:08 PM
[18] (nevím (mmmm(at)mmm.mm))
Další funkce obrázku odpovědět


http://us2.php.net/gd
2/1/2009 3:20:13 AM
[19] (peci1 (peci1(at)seznam.cz))
Pamet a cas odpovědět
Ahoj, nenarazi tady PHP na limity pameti ci casu? Mam silny pocit, ze u dnes uz beznych 6MPix fotografii ten problem bude celkem aktualni. GD si obrazek musi natahnout cely do pameti, ne? Pokud vim, default limit je 64MB, coz urcite nestaci. A pokud by clovek takhle psal nedejboze batchove zmensovani, 30 sekund ho urcite zabije. Nebo se mylim? Sam bych se rad dozvedel o necem, co tyhle limity nema... Jiste... ImageMagick... Ale maloktery hosting ho podporuje (aspon co mam zkusenosti).
8/6/2009 4:36:09 PM
[20] (Sebastian (sbusek(at)email.cz))
Super, jen bych potřeboval pomoc s upravou odpovědět
Ahoj, super skript, přesně tohle jsem hledal!
Teda až na jednu malou drobnost a to, že bych potřeboval ještě zmenšený obrázek posunout.
Přesneji, vytvoři nové bílé plátno s rozmery š/v: 100/95 a zmenšený obrázek posunout do středu.
tzn: (100 / 2) - (šířka_thumbnailu / 2) = bod, kam vložit pravý horní roh, jenže nevím fci, která zajistí posunutí obrázku. V manualu (http://www.php.net/manual/en/book.image.php) se mi to nedari najit... Můžeš mi prosímtě poradit? :)
Díky moc :)
8/6/2009 11:34:33 PM
[21] (Sebastian (sbusek(at)email.cz))
Re: Super, jen bych potřeboval pomoc s upravou odpovědět
[20] tak jsem to vyresil:

uprava v kodu:
//v p ted mame pomer pro zmenseni
//vypocitame vysku a sirku zmenseneho obrazku
$NewWidth = (int)$OrigWidth / $p;
$NewHeight = (int)$OrigHeight / $p;
//vytvorime novy obrazek pozadovane vysky a sirky
//$image_p = imagecreatetruecolor($NewWidth, $NewHeight);
$image_p = imagecreatetruecolor(100, 90);
//otevreme puvodni obrazek se souboru
$image = imagecreatefromjpeg($filename);

// Uprava zacina tady:

//a okopirujeme zmenseny puvodni obrazek do noveho
$NewPointX = 50 - ( $NewWidth / 2 );
$NewPointY = 45 - ( $NewHeight / 2 );
//jeste nastavim bod, kam se ma obrazek posunout
imagecopyresampled($image_p, $image, $NewPointX , $NewPointY, 0, 0, $NewWidth, $NewHeight, $OrigWidth, $OrigHeight);

// a konci tady

//a ulozime
imagejpeg($image_p, $copypath, 100);
8/6/2009 11:39:43 PM
[22] (Sebastian (sbusek(at)email.cz))
Re: Re: Super, jen bych potřeboval pomoc s upravou odpovědět
[21] ooohp, stara verze, kresli s cerny pozadi...
mno nevadi, proste misto radku:
$image_p = imagecreatetruecolor(100, 90);

ma byt:
$image_p = imagecreate(100, 90);
8/20/2009 11:40:30 AM
[23] (tomas)
Pochvala odpovědět
Super, presne taketo nieco som hladal,
Diky moc!!
3/30/2011 5:25:44 PM
[24] (Pavel Láhner (lahnerpavel(at)centrum.cz)) www
Vsadit, oříznout odpovědět
Teď už si jen rozmyslet jestli chci obrázek vsadit nebo oříznout na požadované rozměry...
 

TOPlist