Imagecopyresampled pakt niet het midden (Opgelost)
renebati - 17/03/2009 13:09 (laatste wijziging 17/03/2009 13:15)
Nieuw 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?
<?php
function upload_image($src, $dest, $destWidth, $destHeight) {
list($srcWidth, $srcHeight, $type) = getimagesize($src);
$ratioWidth = $destWidth / $srcWidth;
$ratioHeight = $destHeight / $srcHeight;
$ratio = max(($destWidth / $srcWidth), ($destHeight / $srcHeight));
switch ($type) {
case 1:
$im = imagecreatefromgif($src);
break;
case 2:
$im = imagecreatefromjpeg($src);
break;
case 3:
$im = imagecreatefrompng($src);
break;
}
$newIm = imagecreatetruecolor($destWidth, $destHeight);
$newSrcHeight = round($srcHeight * $ratio);
$newSrcWidth = round($srcWidth * $ratio);
$beginX = round(($newSrcWidth - $destWidth) / 2);
$beginY = round(($newSrcHeight - $destHeight) / 2);
imagecopyresampled($newIm, $im, 0, 0, $beginX, $beginY, $newSrcWidth, $newSrcHeight, $srcWidth, $srcHeight);
imagejpeg($newIm, $dest.'.jpg', 80);
imagedestroy($newIm);
imagedestroy($im);
}
?>
<?php
function upload_image( $src , $dest , $destWidth , $destHeight ) {
$ratioWidth = $destWidth / $srcWidth ;
$ratioHeight = $destHeight / $srcHeight ;
$ratio = max ( ( $destWidth / $srcWidth ) , ( $destHeight / $srcHeight ) ) ;
switch ( $type ) {
case 1 :
$im = imagecreatefromgif( $src ) ;
break ;
case 2 :
$im = imagecreatefromjpeg( $src ) ;
break ;
case 3 :
$im = imagecreatefrompng( $src ) ;
break ;
}
$newIm = imagecreatetruecolor( $destWidth , $destHeight ) ;
$newSrcHeight = round ( $srcHeight * $ratio ) ; $newSrcWidth = round ( $srcWidth * $ratio ) ; $beginX = round ( ( $newSrcWidth - $destWidth ) / 2 ) ; $beginY = round ( ( $newSrcHeight - $destHeight ) / 2 ) ; imagecopyresampled( $newIm , $im , 0 , 0 , $beginX , $beginY , $newSrcWidth , $newSrcHeight , $srcWidth , $srcHeight ) ;
imagejpeg( $newIm , $dest . '.jpg' , 80 ) ;
imagedestroy( $newIm ) ;
imagedestroy( $im ) ;
}
?>
4 antwoorden
Gesponsorde links
renebati - 17/03/2009 13:48 (laatste wijziging 17/03/2009 16:04)
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.
renebati - 17/03/2009 17:14
Nieuw lid
Ah, ik heb het weten op te lossen. Inderdaad met 2x een imagecopyresampled gebruiken.
$newSrcHeight = round($srcHeight * $ratio);
$newSrcWidth = round($srcWidth * $ratio);
$beginX = round(($newSrcWidth - $destWidth) / 2);
$beginY = round(($newSrcHeight - $destHeight) / 2);
$newIm2 = imagecreatetruecolor($newSrcWidth, $newSrcHeight);
imagecopyresampled($newIm2, $im, 0, 0, 0, 0, $newSrcWidth, $newSrcHeight, $srcWidth, $srcHeight);
$newIm = imagecreatetruecolor($destWidth, $destHeight);
imagecopyresampled($newIm, $newIm2, 0, 0, $beginX, $beginY, $newSrcWidth, $newSrcHeight, $newSrcWidth, $newSrcHeight);
$newSrcHeight = round ( $srcHeight * $ratio ) ; $newSrcWidth = round ( $srcWidth * $ratio ) ; $beginX = round ( ( $newSrcWidth - $destWidth ) / 2 ) ; $beginY = round ( ( $newSrcHeight - $destHeight ) / 2 ) ;
$newIm2 = imagecreatetruecolor( $newSrcWidth , $newSrcHeight ) ;
imagecopyresampled( $newIm2 , $im , 0 , 0 , 0 , 0 , $newSrcWidth , $newSrcHeight , $srcWidth , $srcHeight ) ;
$newIm = imagecreatetruecolor( $destWidth , $destHeight ) ;
imagecopyresampled( $newIm , $newIm2 , 0 , 0 , $beginX , $beginY , $newSrcWidth , $newSrcHeight , $newSrcWidth , $newSrcHeight ) ;
Gesponsorde links
Dit onderwerp is gesloten .