Avatar billede Slettet bruger
09. oktober 2004 - 11:39 Der er 8 kommentarer og
1 løsning

GDLIB - thumbnails uden at miste proportioner

Jeg har en mappe for hvert medlem på min hjemmeside.
Alle medlemmer har sin egen mappe, hvori de kan uploade grafik.

Når en eller anden går ind på hjemmesiden, og ønsker at se de billeder brugeren har uploaded, skulle de gerne få en thumbnail-oversigt over de billeder der ligger i brugerens mappe.

Jeg mangler en funktion der kan gå ned og hente de billeder der er i brugerens mappe, samt lave thumbnails af disse (proportionerne skal være rigtige).

Anyone?
Avatar billede Slettet bruger
09. oktober 2004 - 11:39 #1
Alle brugerens billeder er .jpg
Avatar billede detox Nybegynder
09. oktober 2004 - 12:25 #2
Jeg har et eksempel her, som du måske kan bruge:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Thumbs</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<style type="text/css">
body {
    background: #d0f0ff;
}
#x {
    text-align: center;
}
</style>
</head>
<body>
<div id="x">
<?php
$dir = "img";                    // Mappe med original billeder
$thumbs = "thumbs";                // Mappe til thumbnails
$size = 120;                    // Max bredde (pixler)
$out = "";
$d = dir($dir);
while (false !== ($pic = $d->read())) {
    $navn = explode(".", $pic);
    $ext = array_pop($navn);
    if ($ext == 'jpg' || $ext == 'jpeg') {
        $navn = "$dir/$thumbs/".implode(".", $navn)."_thumb.".$ext;
        $sti = "$dir/$pic";
        if (!file_exists($navn)) Thumb($sti, $navn, $size);
        $out .= "<a href='".$sti."'><img src='".$navn."' /></a>";
    }
}
$d->close();
echo $out;

function Thumb($sourcefile, $targetfile, $size) {
    $source_id = imageCreateFromJPEG($sourcefile);
    $source_x = imagesx($source_id);
    $source_y = imagesy($source_id);
    $delta = $size/$source_x;
    $dest_x = round($source_x*$delta);
    $dest_y = round($source_y*$delta);
    $target_id=imagecreatetruecolor($dest_x, $dest_y);
    imagecopyresampled($target_id,$source_id,0,0,0,0, $dest_x,$dest_y, $source_x,$source_y);
    imagejpeg($target_id,$targetfile, 100);
}
?>
</div>
</body>
</html>
Avatar billede Slettet bruger
09. oktober 2004 - 18:21 #3
Detox...> Har kun et enkelt problem der ikke bliver taget højde for.

Det er fint nok at kunne angive max bredde, men jeg har også brug for at kunne angive max højde.

På siden vil billederne blive vist i en tabel-opstilling i et felt hvori der er plads til et billede med maks højde og bredde på 100 px.

Hvordan gøres det?
Avatar billede detox Nybegynder
09. oktober 2004 - 18:58 #4
Ret:

$delta = $size/$source_x;

til:

$delta = $size/max($source_x,$source_y);
Avatar billede detox Nybegynder
09. oktober 2004 - 19:00 #5
Og selvfølgelig:

$size = 120;                    // Max bredde (pixler)

til:

$size = 100;                    // Max bredde/højde (pixler)
Avatar billede Slettet bruger
09. oktober 2004 - 21:43 #6
Kanon, det virker.

Læg et svar og pointene er dine :o)

Et par sidespørgsmål:
Jeg er ikke en kæmpe php-haj, så kunne du kort forklare hvad/hvordan $d->close() fungerer???

Såfremt jeg gerne vil have height og width i min html-kode, hvordan gør jeg så lige det?
Avatar billede Slettet bruger
09. oktober 2004 - 21:48 #7
Mht. $d->close() så er det i det hele taget brugen af $d ($d->read og i den dur), jeg ikke fatter.
Avatar billede detox Nybegynder
09. oktober 2004 - 23:15 #8
Mht.: $d->read og $d->close er der et eksempel her:
http://dk2.php.net/manual/en/class.dir.php

getimagesize() returnerer et array hvor index 3 indeholder en streng med width og height til brug i et img tag (hvis det er det du skal bruge):
http://dk2.php.net/manual/en/function.getimagesize.php

Her er koden rettet lidt til:

<?php
$dir = "img";                    // Mappe med original billeder
$thumbs = "thumbs";                // Mappe til thumbnails
$size = 100;                    // Max bredde/højde (pixler)

function Thumb($sourcefile, $targetfile, $size) {
    $source_id = imageCreateFromJPEG($sourcefile);
    $source_x = imagesx($source_id);
    $source_y = imagesy($source_id);
    $delta = $size/max($source_x,$source_y);
    $dest_x = round($source_x*$delta);
    $dest_y = round($source_y*$delta);
    $target_id=imagecreatetruecolor($dest_x, $dest_y);
    imagecopyresampled($target_id,$source_id,0,0,0,0, $dest_x,$dest_y, $source_x,$source_y);
    imagejpeg($target_id,$targetfile, 100);
}

$out = "";
$d = dir($dir);
while (false !== ($pic = $d->read())) {
    $navn = explode(".", $pic);
    $ext = array_pop($navn);
    if ($ext == 'jpg' || $ext == 'jpeg') {
        $navn = "$dir/$thumbs/".implode(".", $navn)."_thumb.".$ext;
        $sti = "$dir/$pic";
        if (!file_exists($navn)) Thumb($sti, $navn, $size);
        $img_size = getimagesize($navn);
        $out .= "<a href='".$sti."'><img style='border: thin solid blue' src='".$navn."' alt='$pic' title='$pic' $img_size[3] /></a>\n";
    }
}
$d->close();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Thumbs</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<style type="text/css">
body {
    background: #d0f0ff;
}
#x {
    text-align: center;
}
</style>
</head>
<body>
<div id="x"><?php echo $out;?></div>
</body>
</html>
Avatar billede Slettet bruger
10. oktober 2004 - 10:07 #9
Kanon, problem solved :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester