Autor Zpráva
Lechy
Profil
Ahoj, mám kod na vkládání fotografií, a potřeboval bych dotoho implementovat vytváření miniatur. Miniatura se pouze nahraje na server, nebude se ukládat do databáze. Takže, když nahraju fotku ve finální verzi by to mělo vypadat: 1.jpg a 1miniatura.jpg.
Zde mám kod:
  
             $sql_id = mysql_query("SELECT id FROM gallery_sections ORDER by id DESC");    
                 $row_id = MySQL_Fetch_Array($sql_id);  
              $addid = ($row_id['id']+1);
            if (is_uploaded_file($_FILES["addimg"]["tmp_name"])){
                $path_parts = pathinfo($_FILES["addimg"]["name"]);
              if (in_array(strtolower($path_parts['extension']),
               array('jpg','gif','png'))) {            
             $name= $addid.".".$path_parts['extension'];
          $func_copy = copy($_FILES["addimg"]["tmp_name"], "../images/gallery/sekce/$name");   
              } else { error("Nepovolený formát!"); }               
               }  

Zkoušel sem dosadit několik kodu, nalezené z internetu, ale neumím to tam správně přidat a sprovoznit.
Pietro
Profil
A co přímo chceš? Kód na vytváření zmenšených obrázků?
Lechy
Profil
No kod..ale aby mi dotoho fungoval zkusil sem asi 3 kody, který sem našel na internetu a prostě mi to nešlo udělat nevím jak přesně to udělat dotoho mího kodu.
Pietro
Profil
Za použití ImageMagicku to jde velice lehce:

$sql_id = mysql_query("SELECT id FROM gallery_sections ORDER by id DESC");
$row_id = MySQL_Fetch_Array($sql_id);
$addid = ($row_id['id'] + 1);

if (is_uploaded_file($_FILES["addimg"]["tmp_name"])) {
  $path_parts = pathinfo($_FILES["addimg"]["name"]);
  if (in_array(strtolower($path_parts['extension']), array('jpg', 'gif', 'png'))) {
    $name = $addid . "." . $path_parts['extension'];
    $func_copy = copy($_FILES["addimg"]["tmp_name"], "../images/gallery/sekce/$name");
    // ošetříme, pokud se soubor nezkopíroval
    if (!$func_copy) {
      error('Soubor se nepodařilo zkopírovat');
    } else {
      // soubor se zkopíroval, jdeme vytvářet zmenšeninu
      // nejdříve si vytvoříme instanci ImageMagicku z toho okopírovanýho obrázku
      try {
        $im = new Imagick('../images/gallery/sekce/' . $name);
        // pokud chces zmensit obrazek na maximalni velikost:
        $im->scaleImage(MAX_VYSKA, MAX_SIRKA, true);
        // pokud chces zmensit a oriznout obrazek na velikost, pouzij misto toho toto:
        $im->cropThumbnailImage(PRESNA_VYSKA, PRESNA_SIRKA);

        // a ted uz to jenom ulozime - napriklad do podadresare /nahled
        $im->writeImage('../images/gallery/sekce/nahledy/' . $name);
        $im->clear();
        $im->destroy();
      } catch (ImagickException $e) {
        // pokud se při zpracování vyskytne chyba:
        error('Chyba při úpravě obrázku: ' . $e->getMessage());
      }
    }
  } else {
    error("Nepovolený formát!");
  }
}
Lechy
Profil
Píše mi to chybu:
 Fatal error: Class 'Imagick' not found in /home/free/tym.cz/w/winsome-effect/root/www/admin/modules/gallery.php on line 150
Pietro
Profil
Tak to nemáš na webhostingu nainstalovanej ImageMagick. Silně bych doporučoval změnit webhosting - IC.cz ImageMagick nemá.
Ono asi by to chtělo něco nastudovat o PHP, než se začneš pouštět do větších projektů. Zkus si to přepsat za použití funkcí knihovny GD: http://cz.php.net/manual/en/book.image.php.
Alphard
Profil
[#6] Pietro
Hmm, zrovna kvůli ImageMagick bych hosting asi neměnil.

Lechy:
GD knihovna to zvládne, spolehlivá funkce třeba na http://php.vrana.cz/zmensovani-obrazku.php.
Odkázanou funkci si zkopírujte do vaše scriptu, nebo ji dejte zvlášť a includujte ji, je to jedno.
Za 10. řádek (fce copy()) dejte:
list($width, $height) = image_shrink_size($_FILES["addimg"]["tmp_name"], 200, 150);
image_resize($_FILES["addimg"]["tmp_name"], "../images/gallery/sekce/miniatura_$name", $width, $height);
Lechy
Profil
Alphard:
Děkuji mnohokrát, funguje jak má :)
Pietro
Profil
Alphard:
Hmm, zrovna kvůli ImageMagick bych hosting asi neměnil.

Donedávna jsem všude používal GD. Ale jak jsem zjistil, s imagickem se mnohem lépe a rychleji pracuje a není problém s ním nakreslit takřka cokoliv. Navíc jsem se při zpracování velkých fotek (myslím tím rozměry) setkal s tím, že se mi skript nevlezl do memory_limitu a byl problém.
Ovšem ta instalace do PHP na Windowsu není vůbec jednoduchá. Strávil jsem s tím skoro půlden.

Takže pro mne by to určitě na změnu hostingu bylo.
Alphard
Profil
Pietro:
Donedávna jsem všude používal GD. Ale jak jsem zjistil, s imagickem se mnohem lépe
Ano, GD je dobré používat s nějakou obálkou. Pak se kód pro zmenšení omezí na
Image::fromFile('nette.jpg')->resize(100, 50)->send();
což není špatné.

a není problém s ním nakreslit takřka cokoliv
Běžná stránka nepotřebuje kreslit cokoliv.

setkal s tím, že se mi skript nevlezl do memory_limitu
To je časný problém. Zase na druhou stranu, stejně tak jako hledat hosting s ImageMagick můžu požadovat vyšší memory limit.

V podstatě je asi pravda, že když je ImageMagick k dispozici, je lepší ho použít. Nette má vlastnost $useImageMagick, předpokládám, že tímto je problém vyřešen.
Pietro
Profil
[#10] Alphard
Běžná stránka nepotřebuje kreslit cokoliv.
Pravda, že běžná stránka potřebuje akorát zmenšovat fotky.

požadovat vyšší memory limit.
Potřebnou paměť se dá dopředu spočítat, takže taky se s tím dá popasovat.

V podstatě je asi pravda, že když je ImageMagick k dispozici, je lepší ho použít.
Souhlasím

Nette má vlastnost $useImageMagick, předpokládám, že tímto je problém vyřešen.
Nikdo se tu ale o Nette nebavil.

Opravdu problém od Lechyho je vyřešen, tak už nebudu na toto téma odpovídat. Slibuju ;)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0