login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Imagecopyresampled pakt niet het midden (Opgelost)

Offline renebati - 17/03/2009 13:09 (laatste wijziging 17/03/2009 13:15)
Avatar van renebatiNieuw lid Hallo allemaal,

Ik heb een script waarmee ik foto's kan verkleinen tot een vierkantje van bijvoorbeeld 200x200 pixels ($destWidth en $destHeight).

Nu wil ik het origineel van 800x600 dus verkleinen tot het vierkant, maar wat overlapt wil ik er aan beide kanten evenveel afsnijden.
Dus ik wil de afbeelding croppen vanuit het midden, en dus niet standaard vanaf de linkerkant. Maar dat werkt dus niet helemaal goed.

Stel ik upload een foto van 800 x 600. Dan verkleint hij deze eerst tot 267 x 200 pixels. Dat doet hij goed.
De foto is dan nog 67 pixels te breedt voor in het vierkant.
Dus laat ik hem met $beginX (= de helft van 67 = 34 pixels) uit de kant beginnen. Maar om 1 of andere reden pakt hij dus niet die 34 pixels uit de kant, maar ongeveer 10 pixels. Doe ik iets verkeerd in mijn script hieronder?

  1. <?php
  2. function upload_image($src, $dest, $destWidth, $destHeight) {
  3.  
  4. list($srcWidth, $srcHeight, $type) = getimagesize($src);
  5.  
  6. $ratioWidth = $destWidth / $srcWidth;
  7. $ratioHeight = $destHeight / $srcHeight;
  8. $ratio = max(($destWidth / $srcWidth), ($destHeight / $srcHeight));
  9.  
  10. switch ($type) {
  11. case 1:
  12. $im = imagecreatefromgif($src);
  13. break;
  14. case 2:
  15. $im = imagecreatefromjpeg($src);
  16. break;
  17. case 3:
  18. $im = imagecreatefrompng($src);
  19. break;
  20. }
  21.  
  22. $newIm = imagecreatetruecolor($destWidth, $destHeight);
  23.  
  24. $newSrcHeight = round($srcHeight * $ratio);
  25. $newSrcWidth = round($srcWidth * $ratio);
  26. $beginX = round(($newSrcWidth - $destWidth) / 2);
  27. $beginY = round(($newSrcHeight - $destHeight) / 2);
  28. imagecopyresampled($newIm, $im, 0, 0, $beginX, $beginY, $newSrcWidth, $newSrcHeight, $srcWidth, $srcHeight);
  29.  
  30.  
  31. imagejpeg($newIm, $dest.'.jpg', 80);
  32. imagedestroy($newIm);
  33. imagedestroy($im);
  34.  
  35. }
  36. ?>

4 antwoorden

Gesponsorde links
Offline Rik - 17/03/2009 13:36
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Ik heb je code getest met een 523x327 foto en hij neemt keurig het midden en ik krijg dan 200x200 terug. Vreemd dat het bij jou niet lukte.

Je kunt eens alle variabelen echoén en kijken of er vreemde getallen uitkomen.
Offline renebati - 17/03/2009 13:48 (laatste wijziging 17/03/2009 16:04)
Avatar van renebati Nieuw lid Weet je het zeker?
Ik heb nu namelijk een afbeelding geupload naar 90x90 pixels.
In photoshop heb ik de gemaakte geplakt op het origineel en dan in grayscale zodat je ziet welke gedeelte eruit is gehaald.

zie :

http://www.veghelinbedrijf.nl/voorbeeld.jpg

Dat is echt niet het midden.
Ik heb al een keer de waarden bekeken, maar daar zie ik niets vreemds in.
Offline Rik - 17/03/2009 16:08 (laatste wijziging 17/03/2009 16:21)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Ik heb er even naar gekeken en het lijkt erop dat er eerst geknipt wordt en dan pas op geresized.

Want als ik een 800x600 afbeelding heb met in het midden een stip, komt die stip in de 200x200 precies op 120 van links en wel 100 van boven.

Nu nog een oplossing bedenken...

Edit:
Je kunt eerst resizen en dan het midden er uit halen door twee keer achter elkaar imagecopyresampled te gebruiken.
Offline renebati - 17/03/2009 17:14
Avatar van renebati Nieuw lid Ah, ik heb het weten op te lossen. Inderdaad met 2x een imagecopyresampled gebruiken.

  1. $newSrcHeight = round($srcHeight * $ratio);
  2. $newSrcWidth = round($srcWidth * $ratio);
  3. $beginX = round(($newSrcWidth - $destWidth) / 2);
  4. $beginY = round(($newSrcHeight - $destHeight) / 2);
  5.  
  6. $newIm2 = imagecreatetruecolor($newSrcWidth, $newSrcHeight);
  7. imagecopyresampled($newIm2, $im, 0, 0, 0, 0, $newSrcWidth, $newSrcHeight, $srcWidth, $srcHeight);
  8.  
  9. $newIm = imagecreatetruecolor($destWidth, $destHeight);
  10. imagecopyresampled($newIm, $newIm2, 0, 0, $beginX, $beginY, $newSrcWidth, $newSrcHeight, $newSrcWidth, $newSrcHeight);
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.24s