[php] probleem met image (thumbnail) functie

Pagina: 1
Acties:
  • 164 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mitsah
  • Registratie: Februari 2002
  • Laatst online: 09-10-2024
Ik heb onderstaande code geschreven om een plaatje te verkleinen en als thumbnail te laten zien. Opzich werkt ie wel, maar de uitvoer is nogal bacher. Ik heb al verschillende waardes geprobeerd, maar zelf belachelijk grote waardes worden niet mooi (en natuurlijk wordt de file stinkend groot).

Kan iemand mij aangeven wat ik moet / kan veranderen of verbeteren?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//thumbnail max size
$new_w=100; 
$new_h=100; 

//where are the images?
$jpegdir = 'images';

$jpeg = $jpegdir .'/'. $HTTP_GET_VARS['img'];

if(getimagesize($jpeg)){

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

    $dst = ImageCreate($new_w,$new_h); 
    $src = imagecreatefromjpeg($jpeg);

    ImageCopyResized($dst,$src,0,0,0,0,$new_w,$new_h,ImageSX($src),ImageSY($src)); 

    imagejpeg($dst);
    imagedestroy($dst);
    imagedestroy($src);
}

Acties:
  • 0 Henk 'm!

Verwijderd

Het mooiste is dan ook de thumbnails te maken met een programma als Photoshop. Als je zelf voor alle content zorgt, dan kun je eerst eens wat proberen, en dan een batch maken die aan jouw persoonlijke eisen voldoet.

Is het zo dat ook andere gebruikers plaatjes kunnen posten, zoals op een forum of iets dergelijks, dan zit je gewoon vast aan tooltjes die op de server kunnen draaien. En nee, de GD library is ook niet ideaal. In dit geval lijkt het mij dat er geen echt goede oplossing voor is.

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Als je gebruik kan maken van GD2.0.1, dan kan je beter imagecopyresampled() gebruiken

[edit]
ik weet niet wat je bedoeld met 'waardes geprobeerd', maar je kan in imagejpeg() aangeven wat de quality van je image moet zijn..

[ Voor 36% gewijzigd door thomaske op 13-12-2002 13:46 ]

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

Verwijderd

zorg ervoor dat de vorm hetzelfde blijft 600X400 -> 150X100.

maar de GD-Library werkt niet perfect. kijk bv. maar een op http://www.scoutingwoezik.nl/fotoboek.php?cat=jota2002

ik heb ze eerst met een script naar 640X480 verkleind, en daarna thumbnails gemaakt.
Je ziet dat er vervorming optreed

Acties:
  • 0 Henk 'm!

  • MrData
  • Registratie: Februari 2000
  • Laatst online: 25-07-2022
Jorisor: gebruik jij imagecopyresampled() en imagecreatetruecolor()? Daarmee moet je toch mooie thumbnails kunnen maken. Ik heb zelf ook een thumbnail systeem gemaakt, maar helaas heeft de server geen GD 2 of hoger. Wat inderdaad goed is om te onthouden dat als je plaatjes gaat verkleinen je de goede hoogte en breedte berekent van de thumbnail (dus niet vaststelt), aan de hand van de originele image.

"We set sail on this new sea because there is new knowledge to be gained and new rights to be won." - John F. Kennedy - USS Valiant NCC-74210 dedication plaque


Acties:
  • 0 Henk 'm!

Verwijderd

mijn thumbnail functie

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$thumb_size = "100";

function create_thumb ($file,$dir) {
        global $thumb_size;
        if ($dir != "." || !$dir) $imagefile = "$dir/$file";
        else $imagefile = "$file";

        if (substr($file,0,2) != "th") {
                $size = @getimagesize ("$imagefile");
                @list ($tmpw, $tmph) = split (" ", $size[3]);
                @list ($junk1, $real_w, $junk2) = split ("\"", $tmpw);
                @list ($junk1, $real_h, $junk2) = split ("\"", $tmph);

                $percent = ($thumb_size / $real_w);
                $new_w = ($real_w * $percent);
                $new_h = ($real_h * $percent);
        
                $src_img = @imagecreatefromjpeg($imagefile);
                $dst_img = @imagecreate($new_w,$new_h);
                $dst_img_name = "$dir/th$file";
                $img_cp = @imagecopyresized($dst_img,$src_img,0,0,0,0,$new_w,$new_h,imagesx($src_img),imagesy($src_img));
                $img_jpg = @imagejpeg($dst_img, "$dst_img_name");
                
                if (!$img_cp || !$img_jpg) return false;
                else return true;
        }
        else return false;
}


Ik zal even kijken naar mijn phpinfo();

[ Voor 9% gewijzigd door Verwijderd op 13-12-2002 14:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

phpinfo() laat het volgende zien

GD Support enabled
GD Version 1.6.2 or higher ????

ik denk maar dat ik het gewoon probeer, ik zie dan wel

Acties:
  • 0 Henk 'm!

  • MrData
  • Registratie: Februari 2000
  • Laatst online: 25-07-2022
Staat er bij mij ook, dus waarschijnlijk heb je geen nieuwe versie van GD en kun je ook geen gebruik maken van resamplen en true color.

"We set sail on this new sea because there is new knowledge to be gained and new rights to be won." - John F. Kennedy - USS Valiant NCC-74210 dedication plaque


Acties:
  • 0 Henk 'm!

  • Mitsah
  • Registratie: Februari 2002
  • Laatst online: 09-10-2024
Jongens, alvast bedankt voor jullie hulp en code. Ik ga dit uitproberen. Laat jullie na het weekend weten of dit geholpen heeft!!

Acties:
  • 0 Henk 'm!

  • Mitsah
  • Registratie: Februari 2002
  • Laatst online: 09-10-2024
Nou jongens bedankt voor jullie hulp. Het is gelukt. Het waren maar een paar kleine wijzigingen die ik hieronder zal posten. Nu heb ik gelukkig wel een GD library versie 2.0 or higher tot mijn beschikking dus weet ik niet of dit script voor anderen ook goed werkt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//thumbnail max size
$new_w=150; 
$new_h=100; 

//where are the images?
$jpegdir = 'images';

$jpeg = $jpegdir .'/'. $HTTP_GET_VARS['img'];

if(getimagesize($jpeg)){

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

    $dst = imagecreatetruecolor($new_w,$new_h); 
    $src = imagecreatefromjpeg($jpeg);

    imagecopyresampled($dst,$src,0,0,0,0,$new_w,$new_h,ImageSX($src),ImageSY($src)); 

    imagejpeg($dst);
    imagedestroy($dst);
    imagedestroy($src);
}


De belangrijkste wijziging was bij mij het gebruik van "imagecreatetruecolor".

Nogmaals bedankt!

Acties:
  • 0 Henk 'm!

Verwijderd

Excuses voor de topickick.

Ik wou Mitsah nog even bedanken voor zijn stukje code. Ik had problemen met lelijke foto's en dankzij dit stukje code opgelost. Ik had imagecopyresized ipv imagecopyresampled gebruikt waardoor de foto's echt ongelooflijk lelijk werden.

Thx!

Acties:
  • 0 Henk 'm!

Verwijderd

Even om ook te reageren:
Is het niet slimmer om de thumbnail te maken zodra je het upload?
Als je het via php upload kun je makkelijk dit erbij proppen en dan in een andere map (thumbs ofzo) zetten.
Nu moet php steeds voor elk plaatje opnieuw de thumbnail maken, en dit neemt laadtijd in beslag.

Voor het opslaan met goede kwaliteit even dit stukje doorlezen:
http://nl.php.net/imagejpeg

staat duidelijk uitgelegd hoe je dat het beste kan doen :)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Verwijderd schreef op 25 april 2004 @ 09:31:
Even om ook te reageren:
Is het niet slimmer om de thumbnail te maken zodra je het upload?
Als je het via php upload kun je makkelijk dit erbij proppen en dan in een andere map (thumbs ofzo) zetten.
Nu moet php steeds voor elk plaatje opnieuw de thumbnail maken, en dit neemt laadtijd in beslag.

Voor het opslaan met goede kwaliteit even dit stukje doorlezen:
http://nl.php.net/imagejpeg

staat duidelijk uitgelegd hoe je dat het beste kan doen :)
Cachen. Is er eenmaal een plaatje gemaak, dan sla je het op en maak je het niet opnieuw, natuurlijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 25 april 2004 @ 09:31:
Even om ook te reageren:
Is het niet slimmer om de thumbnail te maken zodra je het upload?
Dat doe ik ook, ik heb een functie gemaakt die ik aanroep met een aantal parameters. Ik wil bv. op dit moment dat als er een foto geupload wordt dat er 2 foto's uitkomen.
Bv. er wordt een 640x480 foto geupload. Ik maak er dan eerst een thumbnail van 100x75 van en daarna een iets grotere van bv. 200x150. De originele foto laat ik dan links liggen, die boeit me niet. Voordeel is dat je maar 1x hoeft te uploaden, formaat maakt niet uit (640x480/1026x768/1600x1200/etc) en er komen altijd exact dezelfde plaatjes vanaf.

Erg makkelijk al zeg ik het zelf :)

Acties:
  • 0 Henk 'm!

Verwijderd

Skaah schreef op 25 april 2004 @ 11:35:
[...]

Cachen. Is er eenmaal een plaatje gemaak, dan sla je het op en maak je het niet opnieuw, natuurlijk.
Dat is niet helemaal waar, ik sla plaatjes wel 2x op om de snelheid te vergroten. Ik wil echte thumbnails en niet Afbeeldingslocatie: http://bla.jpg hebben bv. Dat is een stuk trager dan echte thumbnails. Zowiezo wat kost een thumbnail nou, bij mijn zijn ze < 10 kb per stuk dus kan er heel wat uploaden voor ik aan de 100 MB schijfruimte zit :)

Acties:
  • 0 Henk 'm!

  • xces
  • Registratie: Juli 2001
  • Laatst online: 08-09 17:20

xces

To got or not to got..

en dan te bedenken dat je zoals je het nu doet een stuk minder bandbreedte gebruikt

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18-09 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Xces schreef op 26 april 2004 @ 16:42:
en dan te bedenken dat je zoals je het nu doet een stuk minder bandbreedte gebruikt
Sterker nog, een andere methodiek (clientside resizen), kost alleen gruwelijk veel bandbreedte en kost een gigantisch lange laadtijd voor bijvoorbeeld een fotoboek.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Verwijderd schreef op 26 april 2004 @ 16:39:
[...]


Dat is niet helemaal waar, ik sla plaatjes wel 2x op om de snelheid te vergroten. Ik wil echte thumbnails en niet Afbeeldingslocatie: http://bla.jpg hebben bv. Dat is een stuk trager dan echte thumbnails. Zowiezo wat kost een thumbnail nou, bij mijn zijn ze < 10 kb per stuk dus kan er heel wat uploaden voor ik aan de 100 MB schijfruimte zit :)
Dat bedoelde ik ook. Is een thumbnail eenmaal gemaakt, dan plaats je die in je cache folder.
PHP:
1
2
3
4
5
6
7
8
9
10
$fastname  = $_FRIENDLY['command'].'-'.$_FRIENDLY['id'].'-';
$fastname .= $_FRIENDLY['maxwidth'].'x'.$_FRIENDLY['maxheight'].'.jpg';
if (!file_exists(PHOTO_CACHE_FOLDER.'/'.$fastname))
{
// maak thumbnail
}
else
{
// toon plaatje uit cache
}

[ Voor 9% gewijzigd door Skaah op 26-04-2004 16:55 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18-09 17:06

gorgi_19

Kruimeltjes zijn weer op :9

Hmmm.. Een eigen cache folder.. :) Ik ben wel benieuwd; hoe regel je dat dan met het 'verlopen' van de cache?

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1