Jak lze zapsat náhled do exifu, abych ho mohl později vyvolat pomocí exif_thumbnail() ? V manuálu jsem to nenašel/nepochopil:
http://mirrors.inway.cz/manual/cs/function.exif-thumbnail.php
Zdá se mi šikovné, že náhled může být uchovaný přímo v obrázku a tím odpadá starost o to, kam náhled uložit a kam uložit cestu k němu. Jenomže nezatíží to server podobně jako kdybych náhledy tvořil dynamicky?
Našel jsem toto:
http://pel.sourceforge.net/
Zatím jsem to do detailů nečetl, hlavně proto, že to potřebuje PHP 5, kerá na wz.cz není. Nicméně má s tím někdo zkušenost?
jen vím, že náhled do souboru ukládá automaticky PhotoShop
(nedají se nastavit rozměry)
Když jsem před časem dělal dynamickou fotogalerii, taky mě napadlo využít náhledy přímo z thumbnailu z JPG. Připadalo mi to super elegantní řešení.
Strávil jsem nad tím spoustu času, zkoušel jsem nejrůznější skripty, hledal jsem informace, studoval formát EXIFu, ale nakonec jsem to vzdal. Nedokázal jsem přes PHP vytvořit v PHP thumbnail (ani standardní, ani s vlastními parametry). A tak používám ve fotogalerii dvě fotky: malou jako náhled a velkou, tady žádný hi-tech :-).
Jsem zvědavý, k čemu dojdete vy.
Asi dopadnu stejně :o( maximálně ten náhled detekuju a když tam už bude tak ho použiju, když né tak uložím nový standardně někam do adresáře.
Jsem na to přišel :o) Zítra se pochlubím s výsledkem. Musím to ještě napsat a otestovat.
S EXIF daty jsem v PHP nikdy nepracoval, ale na nahledy pouzivam tenhle skript
<?php
// toto je soubor image.php
// Pr. pouziti: <img src='fotky.php?file=fotka1' alt='nahled fotky' />
// ze souboru fotky/fotka1.jpg udela nahled o velikost $sirka a $vyska
// Adresar, ve kterem jsou umisteny fotky-velke originaly (bez / na konci)
$slozka = 'fotky';
// parametry vysledneho thumbnailu
$sirka = 100;
$vyska = 67;
Header("Content-type: Image/JPEG");
$soubor = "$slozka/$_GET[file].jpg";
$imageinfo = getimagesize($soubor);
$novy_obrazek = ImageCreateTrueColor($sirka, $vyska);
$stary_obrazek = ImageCreateFromJPEG($soubor);
ImageCopyResized($novy_obrazek,$stary_obrazek,0,0,0,0,
$sirka, $vyska,
ImageSX($stary_obrazek),ImageSY($stary_obrazek));
ImageJPEG($novy_obrazek);
Destroy($novy_obrazek);
Destroy($stary_obrazek);
?>
Ano, tohle řešení je přesně to, čemu se chceme vyhnout :o)
Nedaří se mi následující skript na generování obrázku z uložených dat. Soubor test.dat je jpg obrázek se změněnou příponou.
http://pytlak.chytrak.cz/test/custom_img.php
<?php
$filename = "./test.dat";
if(File_Exists($filename))
{
$contents = File_Get_Contents($filename);
}
else
{
echo "soubor $filename neexistuje";
}
if ($img = ImageCreateFromString($contents))
{
header('Content-Type: image/jpeg');
ImageJPG($img);
}
else
{
echo "selhalo ImageCreateFromString()";
}
?>
*
Jsem to ale pako :o) Ta funkce má být ImageJPEG() a ne ImageJPG() a já myslel, že tu chybu hlásí ImageCreateFromString() a vono to bylo tohle. Už to funguje.
A abych shrnul svojí myšlenku funkce přidání obrázku do galerie:
0.) přijmout obrázek od uživatele poslaného přes formulář
1.) zjistit jestli je náhled v exifu
2.) když není, vytvořit pomocí GD náhled, načíst ho do řetězce a pak smazat
3.) náhled uložit kamkoliv do exifu jako string.
4.) náhled vyvolat originálně z exifu a pokud tam není tak pomocí ImageCreateFromString() odjinud, kam jsme jej uložili.
Nevýhody:
Na uložení vlastního náhledu obětujeme místo v exifu, které slouží pro něco jiného. Není to tedy patrně podle specifikace exifu a jinde než na našich stránkách to bude ten exif zobrazovat divně (ty jpeg data jako text). Náhled nebude tam kde by ho jiné aplikace očekávaly.
Tož, rok se z rokem sešel a dobral jsem se k fungujícímu skriptu (ne že bych to řešil rok :o)
Funguje to zhruba tak, jak jsem popsal v minulém příspěvku. Zatím je to zbastlená prasárna, ale dělá to co má:
0.) přijmout obrázek od uživatele poslaného přes HTTP.
1.) vytvořit pomocí GD2 náhled.
3.) uložit náhled kamsi do exifu.
4.) náhled vyvolat z exifu a odeslat s hlavičkou obrázku do prohlížeče.
Pokud to někoho zajímá a chce mi s tím pomoct to dotáhnout na fungující galerii s náhledy v exifech - pošlete mi mejl.