Problém s funkcí imagecopyresampled() – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s funkcí imagecopyresampled() – PHP – Fórum – Programujte.comProblém s funkcí imagecopyresampled() – PHP – Fórum – Programujte.com

 

lukas
~ Anonymní uživatel
301 příspěvků
12. 9. 2007   #1
-
0
-

Ahoj:-)

Potřeboval bych poradit s funkcí imagecopyresampled(). Snažím se udělat si funkci na vytvoření náhledů obrázků(zmenšenin). Mám požadavek aby se obrázek vždy vešel do rozměrů 150x150 px. Když zmenšuji obrázek s rozměry: šířka > výška, je vše v pořádku. Použiji funkci:



$pomer = $šířka/$výška;
imagecopyresampled($obr, $image, 0, 0, 0, 0, 150, $150/$pomer, $rozmery[0], $rozmery[1]);


Problém nastane když je šířka < výška (např. 500x800 -->po zmenšení 150x240) rozměry jsou tedy nevyhovující.
Vytvořil jsem tedy podmínku, která rozděluje obrázky podle poměru a těm, které mají výšku větší než šířku jsem upravil funkci:



$pomer = $šířka/$výška;
imagecopyresampled($obr, $image, 0, 0, 0, 0, 150*$pomer, 150, $rozmery[0], $rozmery[1]);


Já si myslím že matematicky je to správně a musím se přiznat že už si s tím nevím rady, asi jsem něco nepochopil nebo přehlížím nějakou maličkost, protože výsledek obrázku z této funkce vypadá tak, že vytvoří černý obrázek o rozměrech:

150 x výška/$pomer a uvnitř tohoto obrázku je další obrázek, který odpovídá správným rozměrům(tedy těm, co jsem si myslel, že by měl mít).

Už si nevím rady, přivítal bych každou pomoc.
Díky

Nahlásit jako SPAM
IP: ...–
Zelenáč0
Posthunter
12. 9. 2007   #2
-
0
-



$max = 150;

if($width > $height){
$pomer = $max / $width;
$new_width = $max;
$new_height = $height * $pomer;
} else{
$pomer = $max / $height;
$new_height = $max;
$new_width = $width * $pomer;
}

Nahlásit jako SPAM
IP: 62.24.71.–
Prog.
~ Anonymní uživatel
398 příspěvků
12. 9. 2007   #3
-
0
-

Matematika vyzera byt OK.

Všimol som si tam navyse znak $ (dolar):

$pomer = $šířka/$výška;

imagecopyresampled($obr, $image, 0, 0, 0, 0, 150, [podtrzene]$[/podtrzene]150/$pomer, $rozmery[0], $rozmery[1]);



Napada ma, či ti tam nechýba nejaka konštrukčná zátvorka podmienky alebo... proste, či sa ti náhodou nevykonávajú oba resamply na jednom obrázku.

[podtrzene]Moj algor:[/podtrzene]
Vstup:

w_o = original width
h_o = original height
w_m = max width zmenseneho obrazku
h_m = max height zmenseneho obrazku

Vystup:
w_t = width zmenseneho
h_t = height zmenseneho

1. pomer stran originalu a zmenseneho musi sediet:
p1 = w_o / h_o = w_t / h_t

2. rozmery _t musia byt mensie, nanajvys rovne rozmerom _m
w_t <= w_m && h_t <= h_m

3. pomer stran oblasti do ktorej sa musi vojst:
p2 = w_m / h_m // v tvojom pripade p2 = 1
...ak je pomer==1 => stvorec, ak je pomer > 1, znamena to ze w>h (leziaci obdlznik), ak je pomer z (0,1) => w<h (stojaci obdlznik)
...pozn.: pozor na delenie nulou!
Ak je [podtrzene]pomer stran(w/h) obrazku[/podtrzene] vacsi ako [podtrzene]pomer rozmerov(w/h) oblasti[/podtrzene] do ktorej ho chces strcit, znamena to ze obrazok je viac leziaci obdlznik ako oblast, takze musis dat w_t = w_m, a w_h dopocitat. Ak je menší, tak h_t = h_max a w_t dopočitať.
if (p1 > p2) 

{

w_t = w_m;
h_t = h_o * w_m / w_o;

} else {

w_t = w_o * h_m / h_o;
h_t = h_m;

}




V tvojom prípade to pasuješ stále do štvorca (150x150), takže p2 = 1. Čiže nemusíš počítať p1, p2.


list($w_o, $h_o) = getimagesize('subor.jpg');

if ($w_o > $h_o)
{

$w_t = 150
$h_t = $h_o * 150 / $w_o;

} else {

$w_t = w_o * 150 / $h_o
$h_t = 150;

}

$img_o = imagecreatefromjpeg( 'subor.jpg' );
$img_t = imagecreatetruecolor( $w_t , $h_t );
imagecopyresampled($img_t, $img_o, 0, 0, 0, 0, $w_t, $h_t, $w_o, $h_o);
imagejpeg($img_t);

Nahlásit jako SPAM
IP: ...–
lukas
~ Anonymní uživatel
301 příspěvků
12. 9. 2007   #4
-
0
-

To Zelenáč:Velice děkuji za pomoc! Nakonec jsem zjistil, že problém nebyl v zadaných parametrech new_width a new_height, ty byly správné(tedy odpovídaly těm tvým). Já jsem si nevšiml, že mimo funkci imagecopyresampled() jsem ještě neupravil funkci imagecreatetruecolor(), ve který jsem samozřejmě musel parametry přispůsobit taky. To způsobovalo, že se obrázek vytvořil větší. Prostě úplně triviální chyba, které si člověk nevšimne:-)

I přesto ještě jednou děkuji.

Nahlásit jako SPAM
IP: ...–
lukas
~ Anonymní uživatel
301 příspěvků
12. 9. 2007   #5
-
0
-

To Prog.:

No za tak vyčerpávající odpověď musím poděkovat i Prog(raději to nechci skloňovat:D). Jak jsem již psal, problém je vyřešen.
Ale díky. Možná bys mohl napsat nějaký článek o práci s obrázky nebo něco takového, protože tohle byl vážně dopodrobna rozpitvaný problém. Na tohle forum musím chodit častěji.

Takže ještě jednou díky!

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Problém s funkcí — založil mistr jirka

Problém s funkcí — založil mistr jirka

Problem s funkci mkdir(); — založil mORb

Problem s funkci isdigit() — založil Lukas

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý