ugrás a tartalomhoz

Oldalarányt megtartó méretezés PHP-ben, GD-vel

methode · 2007. Jún. 8. (P), 18.35
Hello,

Egy most indult kep-kiszolgalo webmestere vagyok es van egy kisebb problemam a GD library-val: az altala letrehozott thumbnail-ok mindig adott meretuek. Vagyis en megadom elore a meretet es a GD-konyvtar az adott meretu kepet hozza letre.

De, ezaltal a kepek mindig, mondjuk ugy furcsan neznek ki. Erre az en megoldasom, sajat velemenyem szerint az lenne hogy szazalekban adjam meg a meretet.
Viszont nem tudom hogy hogy fogjak bele, es egyaltalan meg lehet-e ezt tenni a GD-vel.

Elore is koszonom.
 
1

hasonló

breakline · 2007. Jún. 8. (P), 18.53
Szia

pl. php.net-en találsz példakódokat a GD-hez:

http://hu2.php.net/manual/en/function.imagecopyresampled.php

<?php
// The file
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, null, 100);
?> 
üdv
BL
2

re

methode · 2007. Jún. 8. (P), 21.56
Kosz a valaszt...

De szerinted a %-os megoldas jo otlet? Azt fogom elerni vele amit akarok, vagyis hogy ne legyenek a thumbnail-ok furcsak, vagy ez csak egy alom?
3

furcsa???

monghuz · 2007. Jún. 8. (P), 22.14
Szia!

Mit értesz azon, hogy furcsán néznek ki??
Torzak?
Ha igen, akkor az lehet a probléma, hogy a képek magasság - szélesség aránya eltér, te viszont fix méretet adsz meg mind a magasságra mind a szélességre.
Nekem egy batch fileos volt, ami mérettartó volt, de szerintem GD-ben is van erre megoldás.
4

re

methode · 2007. Jún. 9. (Szo), 13.16
Igen, a legtobje torz.

Peldaul ha egy 1280x768 Jpeg file-t 200*200-asra konvertalom akkor egy igen torz kepet kapok.
Ezert gondoltam hogy egy %-os megoldas jo otlet lenne. Csak azt nem tudom hogy jo otlet lenne-e...

A batch-file-os megoldas nemhiszem hogy jo otlet mivel jelenleg php/gd-vel vannak kezelve a kepek es hogy ugyanazokat a funkciokat batch-el tegye meg a szerver, ujra kene irjam az egesz oldalt/engine-t. Es valoszinuleg tobb rendszeridot es memoriat is hasznalna ami egy imagehost eseteben nem a legjobb otlet...

Kosz a hozzaszolast.
5

arányok

gex · 2007. Jún. 9. (Szo), 14.12

<?php
$width = 1280;
$height = 768;

$maxWidth = 200;
$maxHeight = 200;

if ($maxWidth < $width || $maxHeight < $height) {
    $ratio = ($maxWidth / $width) < ($maxHeight / $height) ? ($maxWidth / $width) : ($maxHeight / $height);
    // 200/1280 < 200/768, tehát az eredmény 200/1280 = 5/32 = 0,15625-ed részre kell kicsinyítenünk

    $tnWidth = floor($width * $ratio);
    // 1280*0,15625 = 200

    $thHeight = floor($height * ratio);
    // 768*0,15625 = 120

    // ezek után elkészíted a $tnWidth x $tnHeight méretű kis képet
}
else {
    // nem kell kicsinyíteni
}
?>
off:
egyébként meg hadd kérdezzem már meg, hogy minek is csinálsz te imagehostingot, ha egy ilyen minimális logikát és matekot igénylő kicsinyítést nem bírsz egyedül megalkotni?
ne haragudj, csak elég furcsának találom, hogy újabban elszaporodtak az "itt van az oldalam, amivel hirdetem magam, mint webfejlesztő, de ezt meg ezt nem tudom megoldani, csináljátok már meg helyettem" típusú problémák mind html-css, mind php témában.
6

Re:off

methode · 2007. Jún. 9. (Szo), 20.36
Webmestert mondok azert mert mar megterveztem tobb tiz oldalt amik kitunoen mukodnek sok ideje, nemelyik evek ota... Sajat oldalam pedig nincs, amin hirdetnem magam es nem is csinalok masnak oldalakat, mert az ilyen jellegu ajanlatokkal telitett a piac. Minden oldalam ingyenes, vagyis megcsak penzt sem szedek ki az emberekbol. Most valoszinuleg szamaritanusnak fogsz hivni, gondolom...

Az imagehost eredetileg egy eleg nagy, tobb mint egy millio felhasznalot katalogizalt forumnak keszult, hogy legyen egy megbizhato es stabil kep-kiszolgaloja. Ez egy uj projektem, ami nem kis fejfajast okozott mivel meg soha nem hasznaltam kep processzorokat. Es az en koromban mar nem tanul konnyen az ember ;). Ezert kellett a segitseg es koszonom a tipped, valoban egyszerubb a dolog mint gondoltam.
7

bocsánat

gex · 2007. Jún. 10. (V), 09.24
oké, lehet hogy pont rosszkor írtam ezt, csak újabban elég sok olyan téma van, amikor valaki belinkel egy oldalt, hogy itt meg itt rossz, a fejléc pedig "honlapok készítése". általában ezek minimális kereséssel megoldhatóak, mint ahogy a te problémád megoldásához sem kellett volna sokat keresni a google-ön.
(és ez még mind semmi, mert van olyan ember is itt a fórumon, aki szerintem szinte az összes munkáját itt oldatja meg, főleg a html, css részt, mert még mindig nem tud összerakni egy több hasábos oldalt...)
és amikor azt írtad, hogy imagehost, az újabban egyre jobban szaporodó képfeltöltős oldalak lebegtek a szemem előtt (amiken mellesleg kismillió reklám van), és azt feltételeztem - rosszul -, hogy te is egy hasonló szolgáltatást akarsz indítani.

sok sikert az oldalhoz, és azt javaslom, hogy nézz utána pár parancssorból is használható képmanipuláló eszköznek is, mint pl az imagemagick, mert ezek nem hiszem, hogy jobban terhelnék a szervert.
10

re:

methode · 2007. Jún. 10. (V), 16.34
en is szoktam segiteni egy amerikai oldalon ahol pont az altalad elmeselt jellegu problemakkal kuzkodo embernek kell/kene biztositani megoldast. Es oszinten szolva meg is lepodtem amikor ramformedtel azert megy egy bizonyos funkciohoz kertem segitseget, nem pedig egy hagyomanyos HTML/CSS problemahoz. A google-t probaltam, mint tobb mas forumot is, ahol olyan kod-megoldasokat ajnlottak amik nem voltak megfeleloek a szamomra. Mint mar mondtam a kepprocesszorok nem az erossegem.

Egyebkent pedig azt a megoldast hasznaltam amit te ajanlottal, megpedig igy:
$new_w = 200;
$new_h = 200;

                                      if ($new_w < $old_x || $new_h < $old_y) {
                                         $ratio = ($new_w / $old_x) < ($new_h / $old_y) ? ($new_w / $old_x) : ($new_h / $old_y);

                                         $thumb_w = floor($old_x * $ratio);

                                         $thumb_h = floor($old_y * $ratio);

					 $dst_img = ImageCreateTrueColor($thumb_w,$thumb_h);



                                                  if(!dst_img){

						               $remove_thumb = true;

					          }else{

						        if(!imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y)){

							$remove_thumb = true;

						        }else{


                                                              if ($extension == "png"){

								imagepng($dst_img,$filename);

						              }else{

								imagejpeg($dst_img,$filename);

						                    }



						          imagedestroy($dst_img);

						          imagedestroy($src_img);

						}

					}

				}else {$dst_img = ImageCreateTrueColor($old_x,$oldy);



                                                  if(!dst_img){

						               $remove_thumb = true;

					          }else{

						        if(!imagecopyresampled($dst_img,$src_img,0,0,0,0,$old_x,$old_y,$old_x,$old_y)){

							$remove_thumb = true;

						        }else{


                                                              if ($extension == "png"){

								imagepng($dst_img,$filename);

						              }else{

								imagejpeg($dst_img,$filename);

						                    }



						          imagedestroy($dst_img);

						          imagedestroy($src_img);

						}

					}

			}
Termeszetesen ez csak egy darabja a teljes kodnak.

Nagyon szepen koszonom,
11

manual

gex · 2007. Jún. 10. (V), 16.50
most rákerestem direkt a dologra, de a google-ig el sem jutottam, mert magában a manuálban benne van a megoldás...

a "rádförmedés" pedig - mint mondtam - nem csak neked szólt, miután elmondtad a célod pedig egyáltalán nem.
12

fölösleges imagecopy

vbence · 2007. Jún. 10. (V), 17.09
Ha nincs átméretezés (második blokk), akkor miért imagecopyzol? Elég lenne a feltöltött fájlt elmenteni, vagy legvégső esetben az imagepng / imagejpeg -et a $src_img-vel meghívi.

Ha már itt tartunk, az eredeti képre is lehetne nyomni egy síma (mérettartó) konvertálást, így védeni a felhasználókat a prepartált képektől. Ugyanígy maximálni is lehetne a méretet (ha pl. valaki felnyomja a digi gépéről a 6mpixeles képet).
13

preparálás = ?

Marcell · 2007. Jún. 11. (H), 14.17
Mit értesz preprálás alatt?
14

= buherálás

vbence · 2007. Jún. 11. (H), 18.45
gonosz képeket

pl
http://www.google.com/search?hl=en&client=opera&rls=en&hs=vom&q=windows+gif+exploit&btnG=Search
vagy
http://www.google.com/search?hl=en&client=opera&rls=en&hs=AAS&q=explorer+jpg+exploit&btnG=Search
15

konkrét hibaüzenet

Marcell · 2007. Szep. 26. (Sze), 19.28
imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 224 extraneous bytes before marker 0xd9
Ennek lehet valami köze hozzá? Vagy csak "simán" rossz a kép? (kinézetre nem)
8

resample

vbence · 2007. Jún. 10. (V), 09.25
Csak egy tanács: sokan (számomra érthetetlenül) abba a hibába esnek, hogy imagecopyresized-ot használnak imagecopyresampled helyett. Természetsen a második a preferált.
9

a százalékot itt felejtsd el

Thom · 2007. Jún. 10. (V), 10.22
>szerinted a %-os megoldas jo otlet
Azt, hogy GD-vel olyan képfájlt generálsz, aminek a méretei %-osan vannak megadva (ha jól értem), felejtsd el, mert ez így nem értelmezett. A százalék, relatív értékmegadás, csak akkor értelmezhető. ha megvan, hogy mihez képest. Ez egy html kódban megvan (a befoglaló helyhez képest), de egy önálló képfájlban, ami bárhol megjelenhet, ott nem. Ha ebbe logikusan belegondolsz, magad is rájössz.
Okszerűen nem is lehet ilyen képet generálni - nekem még eszembe nem jutott kipróbálni, de valószínű hibát fog dobni.

Én így oldottam meg: definiáltam egy max. befoglaló méretet, amiből nem lóghat ki pl: width=100px, height=100px. Ha a tumbkép kicsinyített mérete ennél nagyobb lenne, oldalarányosan(!) határozom meg a valódi tumbméretet.
Pl: eredeti méret: 600x200px, oldalarány: 3/1, korrigált tumbméret: 100x33px.
Az oldalarányos meghatározáshoz egy egyszerű aránypárt kell állítani, néhány sor az egész.
Ne felejtsük el azt a helyzetet sem lekezelni, ha az egyik méretre float jönne ki - képméretnek csak integer adható meg.