我遇到了一个问题,我允许用户调整容器中的图像大小,然后需要创建一个结果图像,该图像是容器的大小,但图像会根据用户的选择进行缩放和调整。
例如,假设容器为 400 x 200,用户希望能够放入 600 x 100 的徽标,他们可能希望缩小徽标以使其适合并在顶部和底部留出空间。我需要能够将其保存为 400x200 的图像,顶部和底部有适当的间隙。
但我发现,如果图像内容(本例中的徽标)超出容器的顶部和右侧,一切都很好,或者如果它没有超出任何一个,那很好,但如果它超出一个而不是另一个然后我得到黑色填充 - 或类似的东西 - 见下面的例子......
下面是一些结果示例,这是我正在使用的代码......
$cropped = wp_imagecreatetruecolor( $frame_w, $frame_h);
$backgroundColor = imagecolorallocatealpha($cropped, 0, 0, 0, 127);
//imageantialias( $cropped, true );
//if $img_y or $img_x are negative we need to apply the value to $img_x and $img_y
//if $img_y or $img_x are positive we need to apply the value to $dest_x and $dest_y
$dest_x = strstr($img_x,'-') ? 0 : abs($img_x);//if neg is true = 0 else offset inside
$dest_y = strstr($img_y,'-') ? 0 : abs($img_y);
$img_x = strstr($img_x,'-') ? abs($img_x) : 0;//if neg is true offset outside else 0
$img_y = strstr($img_y,'-') ? abs($img_y) : 0;
$img_w = $img_w > $frame_w ? $frame_w : $img_w;
$img_h = $img_h > $frame_h ? $frame_h : $img_h;
imagecopy( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $img_w, $img_h);
//imagecopymerge( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $img_w, $img_h,100);
//imagecopyresampled( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $frame_w, $frame_h, $img_w, $img_h );
imagefill($cropped, 0, 0, $backgroundColor);//putting this after the copy makes any black borders transparent again unless $resized does not extend beyond both dimensions
例子
图像没有超出顶部或超出右侧(罚款)
图像超出底部但不正确(不好)
图像超出两者(很好)
图像超出右侧但未超出底部(不好)
图像既不超出(罚款)
我一直在努力解决这个问题,并尝试了所有可能的imagesavealpha、imagecopymerged、imagecolorallocatealpha、imagealphablending等我能想到的组合,但似乎没有什么能解决这个问题......
那么这是GD的错误/限制吗?或者有人可以来救我吗!