Autor Zpráva
Fisak
Profil
Dobrý den. Potřeboval bych vymyslet výpočet pro napozicování obrázku mapy v php. Mám $vel = "velikost_ctverce"

$vel = 112;

for ($i = 0; $i <= 209; $i++) { 
    
    
    
    $sirka = $vel * $i;
    
    $vyska_i = ceil($i / 19); 
    $vyska = $vel * $vyska_i;
    
    $url = "./../../images/textures/".$_GET["p".$i].".jpg";

    $image = imageCreateFromjpeg($url);

    imageCopyMerge($im, $image, $sirka, $vyska, 0, 0, $vel, $vel, 100);
    
}
zde mam výpis obrázků z adresy.. adresa je v tomhle sty /?p1=voda&p2=zem&p3=voda.....&p209=zem
Takhle mam v url 209 obrázků nadefinovanejch. Potřeboval bych u proměnných $vyska a $sirka vymyslet nějaký výpočet aby se mi ty čtvercové obrázky ředili vedle sebe tzn. po $vel = "112"; a po každém 19. čtverci by se udělal nový řádek ...takhle by bylo celkem 11 řádků protože 11 * 19 = 209 čtverců.. a dostal bych takto velký obrázek. Předem děkuji za odpovědi..
DJ Miky
Profil
Když pominu předávání parametrů v URL a jejich neošetření... Je to celkem jednoduchá matematika. Pokud máš 19 dlaždic na řádek, spočítáš číslo řádku jako floor($i / 19) a číslo sloupce jako $i % 19 (obojí indexováno od nuly).

Mimochodem, cyklus od 0 do 209 vyprodukuje 210 hodnot.

A pro výrazné zvýšení výkonu bys neměl otevírat obrázky pořád dokola. Pokud si obrázky podle typů uložíš do pole, při 209 dlaždicích vody ti bude stačit jen jedno otevření souboru místo 209.
Fisak
Profil
DJ Miky:
A pro výrazné zvýšení výkonu bys neměl otevírat obrázky pořád dokola. Pokud si obrázky podle typů uložíš do pole, při 209 dlaždicích vody ti bude stačit jen jedno otevření souboru místo 209.
mohu se zeptat jak tohoto docílit ?? určitě by mi to hodně pomohlo :-) .. a já to nakonec vyřešil takto:

$vel = 112;

$p = 1;

for ($a = 0; $a <= 980; $a+=$vel) {        //výška

for ($i = 0; $i <= 1920; $i+=$vel) {        //šířka

    $p++;
    
    $p <= 209;
    
    $url = "./../../images/textures/".$_GET["p".$p].".jpg";

    $image = imageCreateFromjpeg($url);
    
    imageCopyMerge($im, $image, $i, $a, 0, 0, $vel, $vel, 100);
}

} 
A mohu se tedy zeptat jak bude vypadat kód tak aby se mi např. voda otevřela jen jednou ?
Joker
Profil
Fisak:
Viz DJ Miky a ještě připomenu, že by bylo dobré vymyslet efektivnější způsob těch parametrů.
Například Internet Explorer má limit délky GET části URL 2048 znaků a celé URL 2083 znaků.

Jestli dobře počítám a maximální délka hodnoty je 4 znaky („voda“), samotná data mapy mohou zabrat až 1982 znaků. Čili na všechno ostatní už moc znaků nezbývá.

Přitom jestli jsou jen dvě hodnoty („voda“ a „zem“), dalo by se napsat kódování, které by těch 209 políček uložilo do 35 znaků.
Fisak
Profil
Joker:
No bohužel to neni jen voda a zem .. mám zde textury které jse jmenují "trava_s_cestou" apod.
tiso
Profil
Fisak: je nejaký dôvod prečo v url predávaš všetky tie obrázky miesto súradnice stredu mapy alebo súradníc dvoch protiľahlých rokov mapy?
Fisak
Profil
tiso:
ano protože je vše nadefinované v DB a bohužel když chci poskládat v php obrázek tak tam nemůžu používat sql..
Joker
Profil
Fisak:
Tak tím spíš je potřeba vymyslet nějaké efektivní kódování, protože už 120 políček „trava_s_cestou“ by vyčerpalo celou délku GET části URL.
Fisak
Profil
Joker:
Vymslím to ale nejprve bych rád udělal to aby když v getu bude např. deset krát "voda" tak aby se v
$url = "./../../images/textures/".$_GET["p".$p].".jpg";
 
    $image = imageCreateFromjpeg($url);
načetla pouze jednou.. nevěděl by si prosím někdo rady ?


šlo by to např. nějak pomocí http://php.net/manual/en/function.array-unique.php ??
Joker
Profil
Fisak:
Na tom není potřeba nic až tak vymýšlet, ne?
Pokud existuje pole["název"], použij jeho obsah
jinak načti soubor, použij ho a ulož do pole["název"]
Fisak
Profil
Joker:
No moc nevím jak můžete mi prosím dát příklad nebo nějaký odkaz jak bych to měl udělat?
a upravil jsem ten get.. teď vypadát takto /?p=n;voda;zem;voda;.....;zem
a vypisuje se to takto:
$vel = 112;

$p = 1;

$pieces_obr = explode(";", $_GET['p']);

for ($a = 0; $a <= 980; $a+=$vel) {        //výška

for ($i = 0; $i <= 2575; $i+=$vel) {        //šířka

    $p++;
    
    $p <= 209;
    
    $url = "./../../images/textures/".$pieces_obr[$p].".jpg";

    $image = imageCreateFromjpeg($url);
    
    imageCopyMerge($im, $image, $i, $a, 0, 0, $vel, $vel, 100);
}

}  
Joker
Profil
Fisak:
můžete mi prosím dát příklad
OK, tak v kódu výše se $image nahradí na $images[$pieces_obr[$p]] a řádek 17 se bude dělat jen pokud daná položka není ještě načtená:
if(empty($images[$pieces_obr[$p]])) $images[$pieces_obr[$p]] =  imageCreateFromjpeg($url);
Plus by bylo dobré si před cyklem deklarovat pole: $images = array();
Fisak
Profil
Joker:
bohužel toto nefunguje :-/
$vel = 112;

$p = 1;

$pieces_obr = explode(";", $_GET['p']);

$images = array();

for ($a = 0; $a <= 1080; $a+=$vel) {        //výška

for ($i = 0; $i <= 1920; $i+=$vel) {        //šířka

    $p++;
    
    $p <= 209;
    
    $url = "./../../images/textures/".$pieces_obr[$p].".jpg";

    if(empty($images[$pieces_obr[$p]])) $images[$pieces_obr[$p]] =  imageCreateFromjpeg($url);
    
    imageCopyMerge($im, $image, $i, $a, 0, 0, $vel, $vel, 100);
}

}   
tiso
Profil
[#7] Fisak
1. nerozumiem prečo by si tam nemohol použiť sql
2. čo potom robíš s tým vygenerovaným obrázkom? Nestačí ti poskladať ho až v prehliadači z tých malých?
Fisak
Profil
tiso:
1. prostě nejde použít sql ve skládání obrázku .. nevím proč to nejde ale nejde
2. nestačí. Chci si z toho udělat background...


co třeba něco takového ( i když mi to bohužel nefunguje):
$vel = 112;

$p = 1;

$pieces_obr = explode(";", $_GET['p']);  


for ($a = 0; $a <= 11; $a++) {        //výška

for ($i = 0; $i <= 19; $i++) {        //šířka

    $p++;
    
    $p <= 209;
    
    $vyska = $vel * $a;
    
    $sirka = $vel * $i;
    
    $url = "./../../images/textures/".$pieces_obr[$p]."..jpg";

    static $pieces_obr[$p] = false; 
    if($pieces_obr[$p] === false) $images = imageCreateFromjpeg($url);

    
    imageCopyMerge($im, $images, $sirka, $vyska, 0, 0, $vel, $vel, 100);
}

}   
Joker
Profil
Fisak [#13]:
bohužel toto nefunguje :-/
Samozřejmě že to nefunguje, když na řádku 21 pořád zůstalo $image.
Dál řádek 15 neudělá nic. Co má dělat?

Úpravy v [#15] nedávají žádný smysl a ani nechápu jejich motivaci.
1Pupik1989
Profil
Fisak:
ano protože je vše nadefinované v DB a bohužel když chci poskládat v php obrázek tak tam nemůžu používat sql..

V tom případě se ale nabízí otázka. Kde zjistíte ty typy polí, když z DB nejdou vyčíst? Hledal bych spíš chybu tam, než vymýšlet nesmyslné předávání parametrů.
Fisak
Profil
Takhle to nefunguje..
<?php
$im = imagecreatetruecolor(2352, 1456);
//$im = imagecreatetruecolor(1500, 900);

$white = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $white);
//End Canvas

$vel = 112;

$p = 0;

$pieces_obr = explode(";", $_GET['p']); 

$images = array();

for ($y = 1; $y <= 11; $y++) {        //výška

for ($x = 1; $x <= 19; $x++) {        //šířka

    $p++;;
    
    $sirka = $vel * $x;
    
    $vyska = $vel * $y;

    //$images = imageCreateFromjpeg("./../../images/textures/".$pieces_obr[$p].".jpg");
    
    if(empty($images[$pieces_obr[$p]])) $images[$pieces_obr[$p]] =  imageCreateFromjpeg("./../../images/textures/".$pieces_obr[$p].".jpg");
    
    imageCopyMerge($im, $images, $sirka, $vyska, 0, 0, $vel, $vel, 100);
}

}   

////-----------------------------------------------///////////////////

Header ("Content-type: image/jpeg"); 

//This will create the image!
Imagejpeg ($im);

ImageDestroy($images);        



přitom když místo
if(empty($images[$pieces_obr[$p]])) $images[$pieces_obr[$p]] = imageCreateFromjpeg("./../../images/textures/".$pieces_obr[$p].".jpg");
dám
$images = imageCreateFromjpeg("./../../images/textures/".$pieces_obr[$p].".jpg");
tak to funguje bohužel pomalu jelikož se všechny obrázky načítaj dokola..
Joker
Profil
Fisak:
Je špatně pořád to stejné, co jsem psal v [#16].

Doporučuji si nastudovat alespoň základy PHP, protože bych řekl, že prostě náhodně měníte kusy kódu za jiné kusy kódu bez nějakého povědomí o tom, co se tam vlastně děje.
Fisak
Profil
Joker:
no ani když odstraním to $p <= 209; tak to stejně nefunguje .. Bohužel už nevím kde by mohla být chyba :-/

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: