Obrázky

Snažim se vytvořit script na zmešení obrázků na polovinu, vypsání z databáze ve dvou řádcích po čtyřech. Mám tohle, funguje to, ale bere rozměry jen z prvního obrázku, nedaří se mi nastavit to tak , aby si to bralo míry z toho spávného obrázku. Díky

$spojeni = MySQL_Connect($server, $uzivatel, $heslo);
$sql = "SELECT * FROM tabulka ORDER BY id DESC limit 8";
$vypis = MySQL_DB_Query($database, $sql, $spojeni);
while ($zaznam = MySQL_fetch_array($vypis)):

for($i;$i<=$zaznam['foto'];$i++){
$size = getimagesize($zaznam['foto']);
$viska = $size[1];
$sirka = $size[0];
$width = $sirka / 2;
$height = $viska / 2;
}

echo '<div align=center><table width=90%><tr><td class=\"nov\" align=\"center\">';
echo "<a class=\"nov\" href=\"index.php?str=detail&id=$zaznam[id]\">".$zaznam[nadpis]."<br /><br /><img src=\"".$zaznam[foto]."\" width=\"$width\" height=\"$height\" alt=\"".$zaznam[nadpis]."\" border=0></a></td>";
for ($i=1;$i<4;$i++){
if ($zaznam = MySQL_fetch_array($vypis))
echo "<td class=\"nov\" align=\"center\"><a class=\"nov\" href=\"index.php?str=detail&id=$zaznam[id]\">".$zaznam[nadpis]."<br /><br /><img src=\"".$zaznam[foto]."\" width=\"$width\" height=\"$height\" alt=\"".$zaznam[nadpis]."\" border=0></a></td>";
else break;
}

echo '</tr></div>';

endwhile;
No sice si nemyslím, že "zmenšení obrázků na polovinu" je vhodné udělat tím, že tagu img nastavíš width a hight, ale budiž. Uživatelé budou zbytečně déle stahovat.

Řekl bych, že problém bude v tom, že v tom druhém cyklu

for ($i=1;$i<4;$i++){

už nezjišťuješ velikost každého obrázku, ale použiješ proměnné $width a $height odněkud dříve.
<ot>nevím jestli je horší zmenšovat obrázky tím, že nastaví width a height, nebo používat proměnnou $viska LOL </ot>
Tak mě ukamenujte, jestli nevíte nic jiného než kritizovat mojí snahu, tak nevím co tady děláte. Nevím co se ti nelíbí na proměnné $viska a $sirka. Jestli vás to obtěžuje tak si udělejte nějaké fórum pro profíky, aby vás lamy neobtěžovali hloupými dotazy.
hele hele... ;-)
zbi ti výše nijak neubližoval, ne? já jen že se píše "výška"... na první pohled mi nějak nebylo jasné co to je za slovo a jakým to je jazykem. Tak se hned neurážej...

ale jak tak na to koukám:
máš tam sql dotaz, pak cyklus while. Pro každý záznam z výpisu potom máš cyklus for, ve kterém zjišťuješ výšku a šířku obrázku $zaznam['foto']. Upřímně řečeno mi uniká smysl toho cyklu, ale možná tomu jen nerozumím.

spíš by to ale mělo být nějak jako:

sql dotaz - to je jak máš
while ($zaznam = MySQL_fetch_array($vypis)) {
$size = getimagesize($zaznam['foto']);
$viska = $size[1];
$sirka = $size[0];
$width = $sirka / 2;
$height = $viska / 2;
echo "..." // tady je ten html kód v echu
}
tím se ti v každém cyklu while, tj. pro každý záznam z výpisu, spočítá poloviční výška a šířka z jeho rozměrů.
Ten cyklus to byl jen zřejmě nefunkční pokus o cyklus.
Takhle jsem to taky zkoušel, ale problém je, ale jak to zkombinovat s tím druhým cyklem který řadí obrázky po čtyřech.
Rada od dis byla správná. Výšku a šířku si zjisti až těsně před tím, než zobrazíš ten obrázek tagem img. Tj. dej to dovnitř cyklu, který řádkuje fotky.
co se týče řazení obrázků po čtyřech - možná existují elegantnější řešení, ale napadá mě tohle (přiznám se že se mi nechce zkoumat tvůj html kód, zkusím to nějak jednoduše):

$vypis = mysql_query("SELECT...");
$counter = 1;
echo "<table><tr>";
while ($zaznam=mysql_fetch_array($vypis)) {
// nastavíš si dle libosti tu výšku a šířku
echo "<td><img src.../><td>"; // obrázek v buňce, doplň si odkaz nebo cokoli v html podle potřeby
if ($counter%4=0) echo "</tr><tr>"; // neboli po každý čtvrtý fotce ukončíš řádek tabulky a začneš novej
$counter++;
}
echo "</tr></table>";

jo chtělo by to dopracovat - doplnit prázdný buňky za poslední fotkou, když celkovej počet není dělitelnej čtyřma, a zrušit poslední řádek, pokud naopak je ten počet dělitelnej čtyřma.. ale to už jsou drobnosti, ne? :-)
Já už to uděla takhle a šlape to.

$sql = "SELECT * FROM tabulka ORDER BY id DESC limit 8";
$vypis = MySQL_DB_Query($database, $sql, $spojeni);
while ($zaznam = MySQL_fetch_array($vypis)):
$size = getimagesize($zaznam['foto']);
$viska = $size[1];
$sirka = $size[0];
$width = $sirka / 2;
$height = $viska / 2;
echo '<div align=center><table width=90%><tr>';
echo "<td class=\"nov\" align=\"center\"><a class=\"nov\" href=\"index.php?str=detail&id=$zaznam[id]\">".$zaznam['nadpis']."<br /><br /><img src=\"".$zaznam[foto]."\" width=\"$width\" height=\"$height\" alt=\"".$zaznam[nadpis]."\" border=0></a></td>";
for ($i=1;$i<4;$i++){
if ($zaznam = MySQL_fetch_array($vypis))
$size = getimagesize($zaznam['foto']);
$viska = $size[1];
$sirka = $size[0];
$width = $sirka / 2;
$height = $viska / 2;
echo "<td class=\"nov\" align=\"center\"><a class=\"nov\" href=\"index.php?str=detail&id=$zaznam[id]\">".$zaznam[nadpis]."<br /><br /><img src=\"".$zaznam[foto]."\" width=\"$width\" height=\"$height\" alt=\"".$zaznam[nadpis]."\" border=0></a></td>";
}
echo '</tr></div>';
endwhile;

Nevím jestli je to pravé ořechové, ale ten nápad s nastavením v tagu pomocí width a hight, jsem našel v manuálu. Každopádně Všem děkuji za spolupráci. To s tím zbytkem po dělení je dobrý, to vyzkouším. Díky
Tak to je fajn, že ti to funguje.

S tím width a hight to funguje. Akorát musíš brát v úvahu, že ve skutečnosti přenášíš původní velké fotky, které až u uživatele zmenšíš v prohlížeči = delší načítání (+ lehce zhoršená kvalita; myslím, že prohlížeče zmenšují fotky méně kvalitním algoritmem resize, než by sis mohl udělat sám resample, ale to je detail). Hlavně ta rychlost a náročnost na přenesená data, obzvlášť v případě fotogalerií.
Tak nastiň jak bys to řešil? Já jsem hledal nějaké funkce pro image v manuálu a tohle bylo nejednoduší, abych nemusel dělat dvoje obrázky. Ale já si myslím že je to takhle úplně stejné jako bych tam natvrdo zadal rozměry obrázku, ta funkce co jsem spáchal, vlastně jen zjistí skutečné rozměry obrázku a vydělí dvěma, výsledek uloží do proměnných $šířka a $výška které se dosadí do obrázku.
Radek: je dobrý že ti to funguje, ale nemůžu se zbavit dojmu, že řádek
if ($zaznam = MySQL_fetch_array($vypis))
tam máš zbytečně, ne? jednak za tou podmínkou nic nenásleduje (muselo by tam být něco na tom stejném řádku, nebo ve složených závorkách, nebo mezi dvojtečkou a endif - a nic takového tam nevidím). Nehledě na to, že význam samotné podmínky $zaznam = MySQL_fetch_array($vypis) mi není zcela jasný. Myslím že ti to funguje jen náhodou: ta podmínka se projde v tom cyklu čtyřikrát; nefunguje tam jako podmínka, ale prostě se provede $zaznam = mysql_fetch_array($vypis), čímž se načte další záznam z proměnné $vypis.

a k těm zmenšeninám - pokud nechceš mít dvoje obrázky, pak to asi jinak nepůjde. Ale běžnější je, že máš od každého obrázku miniaturu, která je odkazem na velký obrázek. Když vezmu tu tvou polovinu šířky a výšky, tak čistě teoreticky obrázek, který má třeba 1 MB, by zmenšený mohl mít 250 kB; ty ale musíš nasosat celý to 1 MB, akorát ten obrázek ve výsledku zdrcneš na míň pixelů. Pokud mluvíme o velikosti souborů v desítkách kB, tak je to asi fuk; pokud jde o MB, je to horší.
pravo som dorobil podobny system. ale robil som kompletny galeriovy system. mam kniznicu na zmensenie obrazkov do pozadovanej velkosti + generovanie thumbnailu. musis vsak mat k dispozicii gd2. pokial to chces robit len pomocou width a height anie pomocou resamplovania tak by bolo este dobre vypocitat priblizku velkost obrazka a tento width a height umiestnit do elementu img lebo zmensovat obrazky a nezachovaat original aspect ration nie je velmi dobry napad. jasom to niekedy robit napriklad takto:

// php code
function set_image_size($image)
{
$max_width = 350;

list($width, $height, $type, $attr) = getimagesize($image);

while ($width > $max_width)
{
$width = floor($width * 0.9);
$height = floor($height * 0.9);
}

return $size = array('x' => $width, 'y' => $height);
}
tato funkcia ma definovane ze maximalna sirka moze byt 350 pixelov.
ty si vsak mozes nastavit $max_width taku aka ty vyhovuje. fukcia potom na zaklade toho vypocita priblizne aspect ration.

// php code
$size = set_image_size('test.jpg');
$width = $size['x'];
$height = $size['y'];

takto jednoducho vypocitas velkost pre width a height pre element img.
Obrázky mají tak okolo 30kb
Pokud tvé obrázky v plné velikosti mají 30 kB, tak metoda width a height je rozumně použita. Obecně máš 3 možnosti, jak pracovat s obrázky ve fotogalerii:

1. To cos použil ty je nejjednodušší.
Výhoda: jednoduchost
Nevýhoda: velký přenos data a pomalost (přenášíš originál)

2. Mít dvě fotky. Malou a velkou (já to tak většinou řeším). Do náhledu dáš malou a uděláš z ní link na velkou.
Výhoda: jednoduchá práce s fotkami, rychlost, resamplované náhledy jsou hezčí
Nevýhoda: víc zabraného místa na serveru (někoho to trápí - limity, jiného ne; malé fotky moc místa nezaberou), nutnost při vkládání vytvořit náhled kadé fotce a mít systém ve fotkách, aby se ti nepomíchaly

3. Resamplovat tu fotku při náhledu. Na serveru máš uložen jen originál fotky a náhled generuješ jen pro zobrazení (neukládáš na disk).
Výhoda: úspora místa na serveru, kvalitní resamplované náhledy
Nevýhoda: zátěž serveru při generování fotek (nedokážu posoudit, jak moc to server zatěžuje a tudíž zpomaluje generování stránky)
Kdybych dělal fotogalerii tak bych samozřejmě pouzi variantu s dvojími obrázky, ale tohle jsou jen ilustrační fotky ke článkům. Teď ale řeším už něco jiného, když ukládam něco do cookies, tak asi nejde vymazat jen něco z toho co je tam uloženo, to se vlastně maže tím že se pošle cookies jen se jménem bez hodnoty. To bych asi musel jednotlivé prvky pole ukládat do databáze a tahat a mazat to z ní, co?