PHP foto

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
malidian
Mírně pokročilý
Mírně pokročilý
Registrován: 14. led 2006

PHP foto

Příspěvek od malidian »

Poradí mi prosím někdo, jak upravit foto galerii pomocí php? Když už jsem ty stránky umístil na web, tak bych to potřeboval udělat hned, ale php téměř neumím a teď momentálně nemám čas se ho začít ani učit... (A s HTML a CSS si na fotogalerii nevystačím)
Takže doufám, že se tu někdo najde, kdo mi napíše pěkně polopatě tohle vlož sem, tohle sem, tady udělej tohle a je to. Prosím, aby kód byl pokud možno co nejjednodušší a nejkratší.

http://malidian.greenstudio.cz/

Takže, o co mi vlastně jde,
Potřebuji, aby se načítaly jenom náhledy obrázků a pokud možno, tak i ve zhoršené kvalitě jinak ale bych rád, aby vzhled fotogalerie zůstal takový, jaký je. (Alespoň prozatím)
Thank you for your help...

ps: Něco jsem našel tady, ale nějak, no asi nevím, jak na to. :)
http://forum.pctuning.cz/viewtopic.php?t=78919 (Upraven, odkaz, původně jsem odkazoval na něco jiného! :oops: )
Poslední věc, která mě zajímá, jsou PC. Časy se hold mění. :-)
Lamicz
Začátečník
Začátečník
Uživatelský avatar
Registrován: 30. kvě 2005
Bydliště: In a galaxy far away...
Kontaktovat uživatele:

Příspěvek od Lamicz »

Mno, tak dobre...
a) misto

Kód: Vybrat vše

<img src=...>
se odkazes na PHP script, kde jako parametr das napr. nazev daneho obr. Priklad:

Kód: Vybrat vše

<?php echo "<img src=\"generuj_nahled.php?soubor=123456.jpg\">\n"; ?>
b) v tom souboru generuj_nahled.php si napises script pro nacteni, popr. zmenseni daneho obr. a za pomoci manipulace s hlavickou ho zobrazis, napr. muj script na me jedne WWW:

Kód: Vybrat vše

<?php
header("Content-type:image/jpeg");

$orig_path = "photos"; // adr s obrazky
$thumb_width = 120; // max sirka nahledu

if(is_file("".$orig_path."/".$_GET['file']."")){

  $orig_img = "".$orig_path."/".$_GET['file']."";
  $orig_dimensions = getimagesize($orig_img); 
  $height = ($thumb_width / $orig_dimensions[0]) * $orig_dimensions[1];
  $new_img = imagecreatetruecolor($thumb_width, $height);
  
  $f_type = strtolower(substr($_GET['file'], -4));
  
  if($f_type == '.jpg'){
    $img = imagecreatefromjpeg($orig_img);   
  }elseif($f_type == '.gif'){
    $img = imagecreatefromgif($orig_img);
  }elseif($f_type == '.png'){
    $img = imagecreatefrompng($orig_img);
  }
  
  imagecopyresampled($new_img, $img, 0, 0, 0, 0, $thumb_width + 1, $height + 1, $orig_dimensions[0], $orig_dimensions[1]); 
  
  imagejpeg($new_img, "", 100);
  imagedestroy($new_img);

}else{  

  $new_img = imagecreatetruecolor(90, 90);
  imagejpeg($new_img, "", 10);
  imagedestroy($new_img);

}
?>
No a to je v podstate vse... Zkratka ty volas pokazde tento script a pres parametr mu menis soubor. Jestli to chces mit rychlejsi, tak vygenerovany nahledy si ukladej na HDD a zobraz az je. Toto je sice pomalejsi, nicmene nezabiras si misto na HDD ;)

P.S. Kvalitu vygenerovaneho obr stanovuje fce

Kód: Vybrat vše

imagejpeg($new_img, "", 100);
poslednim parametrem (zde je max - 100 procent)

Lamicz
:: DESKA :: Asus A8V-XE (VIA K8T890) :: CPU :: AMD Athlon 64 3700+ :: VGA :: ATI Asus GF7600 512MB - passive solution :: RAM :: 4x 256MB Samsung :: HDD :: 80GB Maxtor PATA ::
malidian
Mírně pokročilý
Mírně pokročilý
Registrován: 14. led 2006

Příspěvek od malidian »

Díky Ti moc, večer nebo zítra se na to podívám... :)
Poslední věc, která mě zajímá, jsou PC. Časy se hold mění. :-)
malidian
Mírně pokročilý
Mírně pokročilý
Registrován: 14. led 2006

Příspěvek od malidian »

Tak jsem si přečetl základy PHP a konečně se na to podíval. Deset minut mi trvalo, než jsem přišel na to, že ?soubor je proměnná a vlastně tedy místo soubor má být napsáno file, aby to souhlasilo :) No, po dalších deseti minutách se mi to podařilo dovést až do následujícího stavu. V podstatě to generuje náhled, ale tohle by to určitě dělat nemělo. :) Zatím jsem to zkoušel jen na té první kytičce, pod nadpisem mixture. :) Takže prosím help a díky...
http://malidian.greenstudio.cz/foto.php
PS: Kam se ukládají ty vygenerované náhledy? Na disk, do vyrovnávací paměti nebo jak? :oops:
//Odesílá něco, dříve, než-li hlavičku...

// !Už funguje!
Poslední věc, která mě zajímá, jsou PC. Časy se hold mění. :-)
sovicka
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 17. pro 2003
Bydliště: východní prágl
Kontaktovat uživatele:

Příspěvek od sovicka »

Jak mírně naznačoval lamicz, dost to zatěžuje server (přecijenom GD knihovna není zrovna skromná komponenta) + prodlužuje načítání stránek na úkor úspory prostoru. Na některých hostingzích (? to je slovo) za to dokonce i ruší účty - dal bych si na to tedy pozor.

Navrhoval bych řešení načítání obrázku přes php skript jako je teď, avšak ten by jen zjistil zda náhled existuje (např. v nějaké podsložce) a následně by ho zobrazil, nebo by vytvořil nový a zobrazil až ten. Z tohoto řešení by vyplynula menší zátěž serveru na úkor pár MB prostoru.

Samozřejmě není ideální volat jeden skript natisíckrát, takže by nebylo možná od věci to rozdělit na skript pro čtení náhledů pro výstup [vezme všechny náhled co má a vypíše je na stránku] a na skript pro generování náhledů pro nové soubory [který by byl spouštěn manuálně]. Tímto by se to trochu zkomplikovalo, ale z hlediska estetického se mi jeví nejpěkněji...

a ad tvá otázka: obrázek si načte, zmenší, odešle prohlížeči a následně smaže - to vše probíhá v RAM

//jo, není problém napsat, pokusím se na to nezapomenout, ale kdybych přecijenom zapoměl tak se připomeň třeba po SZ ;)
Naposledy upravil(a) sovicka dne ned 10. pro 2006, 21:34, celkem upraveno 2 x.
Francie ... sladká Francie
malidian
Mírně pokročilý
Mírně pokročilý
Registrován: 14. led 2006

Příspěvek od malidian »

sovicka píše: Samozřejmě není ideální volat jeden skript natisíckrát, takže by nebylo možná od věci to rozdělit na skript pro čtení náhledů pro výstup [vezme všechny náhled co má a vypíše je na stránku] a na skript pro generování náhledů pro nové soubory [který by byl spouštěn manuálně]. Tímto by se to trochu zkomplikovalo, ale z hlediska estetického se mi jeví nejpěkněji...
Myslím, že jsem jasně naznačoval, že jsem PHP lama, takže toto zatím nepřichází v úvahu. :(
sovicka píše: Navrhoval bych řešení načítání obrázku přes php skript jako je teď, avšak ten by jen zjistil zda náhled existuje (např. v nějaké podsložce) a následně by ho zobrazil, nebo by vytvořil nový a zobrazil až ten. Z tohoto řešení by vyplynula menší zátěž serveru na úkor pár MB prostoru.
Ano, nad něčím, co by méně zatěžovalo server jsem taky přemýšlel, ale opět platí to, že nemám tušení, jak na to. Náhledy v nějaké podsložce, proč ne, není problém (náhledy mají asi 3KB), ale jak? Náhledy bych si musel vytvořit sám (doufám že ne) nebo by je za mě vytvořil script, který by je natrvalo uložil do oné podsložky?

Pokud na to máš nějaký jednoduchý script a hlavně mi řekneš, jak ho použít, bylo by to fajn a rád to předělám... Díky alespoň za odpověď.
Poslední věc, která mě zajímá, jsou PC. Časy se hold mění. :-)
sovicka
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 17. pro 2003
Bydliště: východní prágl
Kontaktovat uživatele:

Příspěvek od sovicka »

Tak jsem přeci jenom nezapoměl ;)

Tohle si umísti na začátek stánky, kde budeš chtít náhledy používat:

Kód: Vybrat vše

<?php include "generator.php"; ?>
A tímto potom vyvoláš náhled obrázku:

Kód: Vybrat vše

<?php ShowImage("obrazek.jpg"); ?>
Zde je kód souboru generator.php:

Kód: Vybrat vše

<?php 

function ShowImage($file) {

$orig_path = "photos"; // adresar s obrazky
$thumb_path = "thumb"; // adresar s nahledy
$thumb_height = 200; // max vyska nahledu
$quality = 100; // nastaveni kvality jpeg souboru (0-100) 

$orig_img = "".$orig_path."/".$file."";
$thumb_img = "".$thumb_path."/".$file."";  

if(is_file($orig_img)) { //existuje vubec soubor?

  $orig_dimensions = getimagesize($orig_img); 

  if(is_file($thumb_img)) {  //nemame uz nahled hotovy?
    echo "<img src=\"".$thumb_img."\" alt=\"\">\n";
  }
  else {  //kdyz ne tak si ho vytvorime
  
    $expl = explode(".",$file); //rozdelime si nazev a priponu
    $ext = $expl[1]; //vezmeme si priponu
    switch ($ext) {  //podle pripony pouzijeme funkci
      case "jpg":
      case "jpeg":
        $big = imagecreatefromjpeg($orig_img); break;
      case "png":
        $big = imagecreatefrompng($orig_img); break;
      case "gif":
        $big = imagecreatefromgif($orig_img); break;
    }
    
    $bw = imagesx($big);
    $bh = imagesy($big);
    $ratio = $bw / $bh;  //spocitame si pomer stran
    
    $sw = $thumb_height * $ratio; //zjistime sirku maleho obrazku
    $sh = $thumb_height;
      
    $small = imagecreatetruecolor($sw,$sh);  //vytvorime si truecolor sablonu
    imagecopyresampled($small,$big,0,0,0,0,$sw,$sh,$bw,$bh);  //zmensime obrazek
    imagejpeg($small,$thumb_img,$quality);  //ulozime obrazek
      
    ImageDestroy($small);  //uvolnime misto v pameti
    ImageDestroy($big);
    
    echo "<img src=\"".$thumb_img."\" alt=\"\">\n";
  }
}

else {  
  echo "Nenalezeno!\n";
} 
}
?>
Má to pár nastavení (vrchní řádky), ale taky dost neodladěností se kterými se mi nechtělo camrat:
-veškeré soubory se převedou na jpeg formát a proto např. png nebo gif ztratí průhlednost (stejně jako u minulého skriptu)
-soubory menší než maximální rozměr se zvětší na jeho velikost (dtto)
-pokud změníš obrázek, musíš smazat i jeho náhled, aby se taky změnil (to není chyba, to je featura)
-jelikož nyní budeš zapisovat soubory, dej si pozor na nastavení správných práv (CHMOD 777) na FTP k adresáři, do kterého chceš náhledy ukládat

A pár vylepšení oproti starému skriptu:
-menší zátěž (skript je volán jen jednou a poté se provádí jen jeho vnořená funkce) + (skript si odkládá náhledy, pokud už náhled existuje, nový nevytváří = menší zátěž serveru)
-nastavuje se max výška a ne šířka (většinou ti strukturu stránky rozbije soubor moc vysoký než moc široký)
-místo černého čtverce o při nenalezeném souboru vypíše "nenalezeno!" - dá se vyměnit třeba za defultní obázek - viz konec skriptu.
-příponu nezjišťuje z posledních tří znaků, ale z textu za tečkou - takže už můžeš používat .jpg i .jpeg (jak je to správně neDOSově), ale na oplátku nesmíš ve jménech souborů používat tečku, jinak se vystavuješ riziku chyby...
Francie ... sladká Francie
malidian
Mírně pokročilý
Mírně pokročilý
Registrován: 14. led 2006

Příspěvek od malidian »

:worship: Díky mooooc, funguje to.
Poslední věc, která mě zajímá, jsou PC. Časy se hold mění. :-)
Drom
Začátečník
Začátečník
Uživatelský avatar
Registrován: 18. zář 2005
Bydliště: Kdyne
Kontaktovat uživatele:

Příspěvek od Drom »

Hm, tak nejak...

Kód: Vybrat vše

// licence: GNU/GPL v2
// copyright: (c) 2004-2006 Lucas Lommer

function gdImagePreview ($imgSource, $sizeX, $sizeY, $imgDest) {
	// Existuje uz nahled?
	if (!File_Exists($imgDest)) {

				// Nactu si nejen rozmery puvodniho obrazku, ale i jeho typ, lepsi nez dle pripony
				$curSize = getimagesize ($imgSource);

				// Prizpusobeni rozmeru
				if (($sizeX/$sizeY) > ($curSize[0]/$curSize[1])) $sizeX = ($curSize[0]/($curSize[1]/$sizeY));
				if (($sizeX/$sizeY) < ($curSize[0]/$curSize[1])) $sizeY = ($curSize[1]/($curSize[0]/$sizeX));	
				$newSize[0] = round($sizeX);
				$newSize[1] = round($sizeY);

				// Vytvorit objekt
				$newImage = ImageCreateTrueColor($newSize[0],$newSize[1]);

				// Je-li obrazek GIF
				if ($curSize[2] == 1) {
						$oldImage = imagecreatefromgif($imgSource);
						imagecopyresized($newImage, $oldImage, 0, 0, 0, 0, $newSize[0], $newSize[1], $curSize[0], $curSize[1]);
						imagegif($newImage, $imgDest);	
						}
				// Je-li obrazek JPEG
				if ($curSize[2] == 2) {
						$oldImage = imagecreatefromjpeg($imgSource);
						imagecopyresized($newImage, $oldImage, 0, 0, 0, 0, $newSize[0], $newSize[1], $curSize[0], $curSize[1]);
						imagejpeg($newImage, $imgDest);
						}
				// Je-li obrazek PNG
				if ($curSize[2] == 3) {
						$oldImage = imagecreatefrompng($imgSource);
						imagecopyresized($newImage, $oldImage, 0, 0, 0, 0, $newSize[0], $newSize[1], $curSize[0], $curSize[1]);
						imagepng($newImage, $imgDest);	
						}
				// Je-li obrazek wBMP
				if ($curSize[2] == 15) {
						$oldImage = imagecreatefromwbmp($imgSource);
						imagecopyresized($newImage, $oldImage, 0, 0, 0, 0, $newSize[0], $newSize[1], $curSize[0], $curSize[1]);
						imagewbmp($newImage, $imgDest);	
						}
				// Je-li obrazek xbm
				if ($curSize[2] == 16) {
						$oldImage = imagecreatefromxbm($imgSource);
						imagecopyresized($newImage, $oldImage, 0, 0, 0, 0, $newSize[0], $newSize[0], $curSize[0], $curSize[1]);
						imagexbm($newImage, $imgDest);	
						}

				// Vyprazdnit pamet
				ImageDestroy($oldImage);
				ImageDestroy($newImage);
				}
	return $imgDest;
	}
// No snad jsem nic nezapomel
$imgSource == puvodni obrazek
$sizeX == jakou chces sirku u nahledu
$sizeY == jakou chces vysku u nahledu
$imgDest == cesta k nahledu obrazku (bud existuje nebo ho funkce vytvori)
malidian
Mírně pokročilý
Mírně pokročilý
Registrován: 14. led 2006

Příspěvek od malidian »

To Drom:
Script od sovicky funguje imho dobře, toto má nějaké výhody nebo něco? Díky :?
Poslední věc, která mě zajímá, jsou PC. Časy se hold mění. :-)
Drom
Začátečník
Začátečník
Uživatelský avatar
Registrován: 18. zář 2005
Bydliště: Kdyne
Kontaktovat uživatele:

Příspěvek od Drom »

verntom píše:To Drom:
Script od sovicky funguje imho dobře, toto má nějaké výhody nebo něco? Díky :?
Jen jsem vyhrabal neco, co jsem kdysi sesmolil.
Odpovědět

Zpět na „Programování a web“