[php] Foto resize (maar in het midden uitsnijden)

Pagina: 1
Acties:
  • 51 views sinds 30-01-2008

  • kokorico
  • Registratie: Januari 2004
  • Laatst online: 07:51
Hoi,

ik heb al een tijdje een resize script voor foto's die members uploaden.
Nu wil ik er voor zorgen dat de verhoudingen niet veranderd worden. Anders vervomd de foto.


vb (thumb moet 60 x 30 px zijn):

1) member upload foto van 600 x 300px => foto wordt niet vervormd (verhoudingen kloppen)

2) member upload foto van 60 x 80 px => foto wordt heel veel vervormd (verhoudingen kloppen niet)

Nu heb ik op sommige site gezien dat bij foto's uit het onderstaande geval er niet geresized wordt maar gewoon het middelste deel (dus van 60 x 30 px) genomen wordt. (www.lexa.nl doet dit - thumbs uit zoekpagina vergelijken met profielfoto)

Hoe doen ze dit?

Mijn code die ik nu gebruik:

code:
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
29
30
$map        = $fotoalbum_big;        // dir waar de foto's staan
$map_thumb    = $fotoalbum_th;        // dir waar de thumbnails komen
$nwidth     = "75";            // nieuwe breedte
$nheight     = "90";                // nieuwe hoogte
$maxwidth     = "800000";            // maximale breedte
$maxheight    = "600000";            // maximale hoogte

$handle = opendir("$map");

//uitlezen van de dir
       
              
     $file = $map ."/". $bestandsnaam;

     list($width, $height) = getimagesize("$file");  
     
            
     //opnieuw aanmaken en opslaan over het orgineel heen
     $pic        =    ImageCreateTrueColor($nwidth, $nheight);
     $cpyImage    =     ImageCreateFromJPEG($file);
     $file_nw    =     $map_thumb ."/". $bestandsnaam;
    
        imagecopyresampled
        ($pic,$cpyImage,0,0,0,0, $nwidth,$nheight,$width, $height);
        ImageJPEG($pic,$file_nw);
       
    

// en de dir weer sluiten voor de netheid
closedir($handle);

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 22-05 21:28

MBV

ik doe het iets anders:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function makethumb($img, $cache)
{
//geef grootte van het origineel
  $picsize=getimagesize("$img");
  $source_x = $picsize[0];
  $source_y  = $picsize[1];
    if ($source_x==0 || $source_y==0){
      echo "$img is geen geldig jpg bestand ";
        return;
    }
//geef grootte thumbnail
  $verhouding=($source_x/$source_y);
$dest_x=($verhouding> 1)?90:90*$verhouding;
$dest_y=($verhouding<=1)?90:90/$verhouding;
//    echo ("verhouding=$verhouding, dest=$dest_x,$dest_y");                
//resize
  $source_id = imagecreatefromjpeg($img);
  $target_id = imagecreatetruecolor($dest_x, $dest_y);
  imagecopyresampled($target_id,$source_id,0,0,0,0,$dest_x,$dest_y,$source_x,$source_y);
imageinterlace($target_id, 1);
  imagejpeg($target_id, $cache);    //schrijf naar bestand images/cache/path/filename
//sluiten
  imagedestroy($target_id);
}


dit maakt een thumbnail die maximaal de opgegeven breedte en hoogte geeft, in het originele formaat. Misschien kan je na een beetje knutselen het principe iets veranderen, zodat hij het 'te groot' pakt zeg maar :)

edit:
ik zie dat het nog niet echt variabel is ;) Max = 90*90.

$dest_x=($verhouding> 1)?90:90*$verhouding; //als hij te breed is wordt dit 90
//anders wordt 90*verhouding gepakt
$dest_y=($verhouding<=1)?90:90/$verhouding; //als hij te hoog is wordt dit 90
//anders wordt 90*verhouding gepakt

[ Voor 17% gewijzigd door MBV op 23-08-2004 00:01 ]


  • kokorico
  • Registratie: Januari 2004
  • Laatst online: 07:51
MBV schreef op 22 augustus 2004 @ 23:59:
ik doe het iets anders:
code:
1
2
3
4
5
6
7
8
[edit] ik zie dat het nog niet echt variabel is ;) Max = 90*90.

$dest_x=($verhouding> 1)?90:90*$verhouding; //als hij te breed is wordt dit 90
                              //anders wordt 90*verhouding gepakt
$dest_y=($verhouding<=1)?90:90/$verhouding; //als hij te hoog is wordt dit 90
                              //anders wordt 90*verhouding gepakt

[/edit]
Dit snap ik niet :s

Verwijderd

Macro's: Als () waar is: doe wat na ? staat anders wat na : staat

  • kokorico
  • Registratie: Januari 2004
  • Laatst online: 07:51
Kan er iemand die verhouding aanpassen naar mijn geval ?

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 22-05 21:28

MBV

if-then kort geschreven, zie http://nl3.php.net/operators.comparison bij 'ternary' operator

edit:
enige zelfwerkzaamheid wordt wel verwacht op dit forum. En dan ben ik al zo lief geweest om je niet zelf naar php.net te sturen ;)

[ Voor 48% gewijzigd door MBV op 23-08-2004 00:11 ]


Verwijderd

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
29
30
31
<?
//nieuwe breedte
$nwidth     = "75";
//nieuwe hoogte;     
$nheight     = "90";        

//orignele bestand openen
$file = 'test.jpg';
//breedte en hoogte opvragen en bewaren in $width en $height
list($width, $height) = getimagesize($file);
//het wordt bepaald wat de linkerkant van het nieuwe plaatje is ten opzicht van het orgineel
$left= floor(($width - $nwidth)/2);
//het wordt bepaald wat de bovenkant van het nieuwe plaatje is ten opzicht van het orgineel
$top = floor(($height - $nheight)/2);
//aanmaken nieuwe plaatje
$pic        =    ImageCreateTrueColor($nwidth, $nheight);
//orignele plaatje openen
$cpyImage    =     ImageCreateFromJPEG($file); 
//bestandsnaam van het nieuwe plaatje
$file_nw = 'thumb_'.$file;

//hier wordt de thumbnail aangemaakt.  je ziet dat het nieuwe plaatje linksboven en rechtsboven bij 0 begint. verder wordt er een stuk gekopieerd vanaf de nieuwe linker en rechterkant $top en $left
imagecopy($pic,$cpyImage,0,0,$left,$top,$width, $height);
//aanmaken jpg
ImageJPEG($pic,$file_nw);
//memory clearen
imagedestroy($cpyImage);
//memory cleaten
imagedestroy($pic);

?>


Code getest en deze werkt.
Let op regel 12 en 14 voor de berekening
Regel 23 maakt de nieuwe thumbnail aan.

Getest met GD2.

[ Voor 12% gewijzigd door Verwijderd op 23-08-2004 01:10 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

:/

Zo wordt het wel een redelijk schaamteloos: "Wie kan dit voor mij maken"

En daar doen we niet aan in Programming & Webscripting. Oftewel, dicht :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1

Dit topic is gesloten.