Ik heb plaatjes van verschillende afmetingen.
kleine en grote.
Ik heb een vast formaat namelijk 531 breed en 550 hoog.

Ik wil een plaatje maken, en als van het originele plaatje de hoogte groter is als 531, dan moet hij hem rationeel verkleinen naar maximaal 531. Als dat de breedte ook groter is als 550 hetzelfde verhaal.
Ik wil de ratio houden, maar ze moeten alle2 passen in het vlak en dan ook nog gecentreerd.
Als een plaatje bij 100px hoog is, moet deze niet aan de top vastzitten, maar verticaal aligned worden.
De code hieronder doet het wel aardig, alleen als het originele plaatje een zwarte kleur heeft en ik maak het vaste vlak als een plaatje met een witte achtergrond(255, 255, 255), dan maakt hij het zwart in het plaatje ook lelijk wit. Ziet er niet meer uit.

Weet iemand hoe is dit het best kan bereiken? Het liefst zonder imagick.




 $newWidth = 531;
    $newHeight = 550;

$url = 'D:\websites\jakarta-eventsnew\images\events\1\indobuildtech-expo-2020.jpg';
$destdir = 'D:\websites\jakarta-eventsnew\images\events\1\braakwater.jpg';
    // download and create gd image
    $image = ImageCreateFromString(file_get_contents($url));
    $width = ImageSX($image);
    $height = ImageSY($image);

    $coefficient =  $newHeight / $height;

    if ( $width > $newWidth) {
        $coefficient = $newWidth / $width;
    } else 
	    if ($height > $newHeight ) {
        $coefficient = $newHeight / $height;
    }
	
// if (($target_width / $width) > $coefficient) { $coefficient = $target_width / $width; } 
    // create image
    $output = imagecreatetruecolor($newWidth, $newHeight);
    imagecopyresampled($output, $image, 0, $height * $coefficient, 0, 0, $width * $coefficient, $height * $coefficient, $width, $height);
     $bg_color = imagecolorallocate ($output, 255, 255, 255);
     imagefill($output, 0, 0, $bg_color);
   // save image
   imagejpeg($output, $destdir, 100); 
Zelf gebruik ik voor resizedoeleinden de uploadclass van verot.net. Een paar voordelen:

- Scheelt het wiel opnieuw uit te vinden.
- Veel bestaande software-pakketten gebruiken deze ook.
- Heel veel handige methods voor diverse bewerkingen.
- Ruime ondersteuning

Misschien is het een idee om naar te kijken.

Ik doe het zo
<?php
$f='mijn volledig pad naar de foto';
$mtc = mime_content_type($f);
$ok = false;
switch ($mtc) {
case 'image/jpeg':
header("Content-Type: image/jpeg");
$im = imagecreatefromjpeg($f);
$ok = true;
break;
case 'image/png':
header("Content-Type: image/png");
$im = @imagecreatefrompng($f);
$ok = true;
break;
case 'image/gif':
header("Content-Type: image/gif");
$im = imagecreatefromgif($f);
$ok = true;
break;
case 'image/bmp':
header("Content-Type: image/bmp");
$im = imagecreatefrombmp($f);
$ok = true;
break;
case 'image/x-ms-bmp':
header("Content-Type: image/x-ms-bmp");
$im = imagecreatefrombmp($f);
$ok = true;
break;
}
list($width, $height) = getimagesize($f);
$bgc=imagecolorallocate($im, 255, 255, 255);
$tc=imagecolorallocate($im, 0, 0, 0);
$newheight = 50;

$procent = $width / $height;
$newwidth=$newheight*$procent;
$thumb =imagecreatetruecolor($newwidth, $newheight);
imageCopyResized($thumb, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagepng($thumb);
imagedestroy($im);
imagedestroy($thumb);
return $thumb;
?>
wel natuurlijk $newheight aanpassen aan jouw eisen
Eventueel verder controleren of alle types ondersteunt worden welke je aanvaard.

Jan
Maar in de code van @JanR gebeuren een aantal dingen die niet nodig zijn als je puur een afbeelding wilt opslaan, en de code kan waarschijnlijk wel wat korter, en er kan ook wel wat meer foutafhandeling in. Die $ok doet trouwens niets?

Simpelweg omdat iets werkt, maakt het nog niet juist.
Ik verwees naar de uploadclass van verot.net wat werkte.
Thomas van den Heuvel op 10/04/2020 23:05:21

en de code kan waarschijnlijk wel wat korter, en er kan ook wel wat meer foutafhandeling in.

twee maal juist :)

Thomas van den Heuvel op 10/04/2020 23:05:21
Die $ok doet trouwens niets?

In de volledige code wel. vergeten opkuisen. sorry

Reageren