Autor Zpráva
kachnak
Profil
Zdravím,

Je možné otočiť obrázok o 90° príkazom ale tak, že zostane zachovaná presná veľkosť aj kvalita obrázku?
napr: otočil by aj 7MB fotku 6000x3000 px na fotku 3000x6000 px pričom by zostala veľkosť obrázku stále 7MB do posledného bitu v nezmenej kvalite?
funkcia http://sk.php.net/imagerotate nato nieje podľa mňa vhodná, pretože sa tam používa imagecreatetruecolor(), čo vlastne vytvorí nový obrázok. a ja chcem len otočiť existujúci na servery.

Vďaka
Darker
Profil
K tomu abys obrázek otočil ho musíš vždycky nějak parsovat. Pokud se štítíš funkcí v PHP, můžeš si nastudovat dokumentace jednotlivých formátů a udělat funkci která bude pracovat se surovými daty.
Keeehi
Profil
kachnak:
O 90° to půjde. Vytvoříš si nový obrázek imagecreatetruecolor() a původní obrázek prolezeš pixel po pixelu po řádcích a do nového obrázku budeš ty pixely malovat ve sloupcích. Hlavně je to pak potřeba uložit v bezztrátovém formátu třeba png. Jiné než pravé a přímé úhly jsou problém. Na to už jsou potřeba znalosti lineární algebry. Klidně můžeš vytvořit vlastní funkce na otáčení, ale nevěřím, že by tvůj algoritmus byl lepší.

Ztráty budou skoro vždy, je to však součin dílčích problémů. Největší problém nastává při ukládání. Pokud však zvolíš bezztrátový formát, velmi tím problém zminimalizuješ.
Borius
Profil
kachnak:
Není nezbytné vytvářet nový obrázek – můžeš načíst již existující:
//Načtení obrázku
$obrazek=imagecreatefromjpeg($cesta, );
//Jinak je postup stejný
$otoceni=imagerotate($obrazek, 90, 0);
imagejpeg($otoceni);
Davex
Profil
kachnak:
Pokud ti jde o otočení formátu JPEG, tak ten umí otočit bezztrátově pouze specializované programy. Zkus hledat "jpeg lossless rotation". Knihovna GD ani ImageMagick to neumí.
kachnak
Profil
Ono to vykresluje otočený obrázok pekne ale ako ho potom uložím?
Chcel by som aby mi nahradilo zdrojový obrázok po otočení na serveri, alebo aspon vyrobilo obrazok "b.jpg" vedľa "a.jpg".
toto mi nefunguje nieco tam je zle:
  $imageA='a.jpg';
  $imageB='b.jpg';       
  $source=imagecreatefromjpeg($imageA);
  $rotate=imagerotate($source,180,0);
  $newfile=imagejpeg($rotate);
  copy($newfile, $imageB);
neviete poradiť? vďaka
Alphard
Profil
Funkce imagejpeg přijímá v druhém parametru cestu, kam má obrázek uložit.
juriad
Profil
Druhý parametr funkce imagejpg je cesta, kam ten obrázek uložit. V tvém případě to bude $imageB.
kachnak
Profil
diky moc :)
Juraj Hajdúch
Profil
kachnak:
otočil by aj 7MB fotku 6000x3000 px
Všetko záleží na nastavení serveru (php.ini -> memory_limit), avšak pochybujem, že by mal nejaký produkčný hosting nastavený tanto limit na menej ako 32 mega (ja mám 128), a to na uvedenú rotáciu v pohode postačuje.
Alphard
Profil
Juraj Hajdúch:
(ja mám 128), a to na uvedenú rotáciu v pohode postačuje.
No, to bych zas tak netvrdil. Při rotaci barevného obrazu o velikosti 6000x3000 px pomocí GD knihovny bude potřeba asi 185 mega paměti.
Juraj Hajdúch
Profil
Alphard:

No mne vyšlo iné:
6k * 3K = 18M záznamov o farbe pixelov. jeden záznam má 3B, čiže 18MB * 3 = 56MB
ak tam máme fcie imagecreatefromjpeg a imagecreatetruecolor, tak je to 2 * 56MB tj. cca 112MB
plus nejaká tá réžia
podľa mňa to cez 128 megabytov ísť nemôže
Ani mi nevyhodilo chybu

Ak je tu na to nejaký odborník, nech sa vyjadrí, je možné, že sa mýlim.

EDIT: Podľa online kalkulátoru www.dotsamazing.com/en/labs/phpmemorylimit to naozaj vychádza 185MB, ale potom nechápem, prečo mi nevyhodilo chybu pri memory_limit = 128MB. :-o
Alphard_
Profil *
Mně padlo do oka to „v pohodě“, hned po přečtení se mi zdálo, že to musí být dost na hraně a ne v pohodě :-)
Ten váš základní výpočet asi bude cca sedět, tweak faktor 1.8, kterým to násobí ten kalkulátor, zohledňuje nějaké režie a nepřesnosti a je značně nadsazený, přesně to nelze říct. Oni sami píší že v praxi je 1.5 ok a vychází mi, že s 1.2 by se to vešlo do 128 mega.

Pokud by bylo možné použít ImagicK, je to samozřejmě lepší, na něj se PHP limit nevztahuje.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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