添加黑条以创建16x9图像

I have a jpg on my server. I use

imagecreatefromjpeg($imgPath);

to open it. I want to make it a 16x9 image by adding black bars to either the top+bottom or left+right. (Think background-size: contain; background-position: center;) This is all I have:

$img_info = getimagesize($imgPath);

I know I need to use ImageCreateTrueColor to make the blank image, imagecopyresampled to create the image, and imagejpeg to save it. But I have no idea how to put them together. Thanks!

This will do the trick:

$im=imagecreatefromjpeg ($imgPath);
$width=ImageSX($im); $height=ImageSY($im); $ratio=16/9;
$width_out=$width; $height_out=$height;
if ($height_out*$ratio<$width_out) {$height_out=floor($width_out/$ratio);} else {$width_out=floor($height_out*$ratio);}
$left=round(($width_out-$width)/2);
$top=round(($height_out-$height)/2);
$image_out = imagecreatetruecolor($width_out,$height_out);
$bg_color = ImageColorAllocate ($image_out, 0, 0, 0);
imagefill($image_out,0,0,$bg_color);
imagecopy($image_out, $im, $left, $top, 0, 0, $width,$height);
imagejpeg($image_out);

How it works: you create the $im container, and check for width and height. After this, the script checks which side is smaller than the other (multiplied / divided by the ratio) and adjust the output size. Calculate where the original image should be placed (center alignment) by dividing the difference between the original and the output image dimensions by 2. Copy over the original image at the given position Output, done.