我有一个拍摄图像的脚本,重新采样时将短尺寸(宽度或高度)居中放在方形彩色背景上。 这适用于具有较长WIDTH的图像但由于某种原因任何具有较长HEIGHT的图像,结果是分割背景填充 - 左侧的正确颜色,但右侧的默认黑色。如果我使用x轴偏移,则背景填充仅向图像放置延伸到右侧。
计算出的值与垂直图像的预期值一样,所以我无法弄清楚这里发生了什么。请注意,'imagecopy()'会产生完全相同的行为。
以下是一个示例的静态值代码:
$thumb = imagecreatetruecolor(250, 250);
imagecopyresampled($thumb, $source, 77, 0, 0, 0, 250, 250, 400, 400);
$blue = imagecolorallocate($thumb, 0xDE, 0xE6, 0xF9);
imagefill($thumb, 0, 0, $blue);
使用相同的图像旋转90度(400 x 155像素),使其水平较长,然后应用完整的背景填充:
imagecopyresampled($thumb, $source, 0, 77, 0, 0, 250, 250, 400, 400);
对于垂直图像,我的坐标值(77,0)将图像放在imagecreatetruecolor()画布上,正好位于我想要的位置,但更改任何其他imagecopyresampled()值会拉伸或挤压重新采样的图像或裁剪它。
我忽略了一些简单的事情吗?在此处查看屏幕截图: http://i.stack.imgur.com/5CxHU.jpg(垂直问题)和 http://i.stack.imgur.com/wvhzP.jpg(水平确定)
答案 0 :(得分:0)
这个垂直问题必须与PHP的重采样/图像填充算法(?)有关,但这里有一个解决方法,现在可以将我的所有垂直图像集中在我的方形画布中:
1)您需要先填充图像占位符,这样背景填充将延伸到重采样图像的右边缘,方法是通过x轴偏移扩展缩略图高度(声音很奇但是有效)...我们将稍后关闭它:
$thadj_height = $th_height + $th_x;
$thumb = imagecreatetruecolor($th_width, $thadj_height);
2)像往常一样用背景填充重新采样(注意填充是在重采样语句之后应用的,奇怪但只是这样工作)...记住$ thumb的高度比$ th_width高,$ th_height将占用:
imagecopyresampled($thumb, $source, $th_x, $th_y, 0, 0, $th_width, $th_height, $src_width, $src_height);
imagefill($thumb, 0, 0, $bgcolor);
3)暂时保存图像输出,以便接下来可以应用新功能 - 将质量设置为无损,因为我们将重复使用它:
imagejpeg($thumb, "resampled/output_temp.jpg", 100);
imagedestroy($thumb);
4)检索临时文件并获取新维度(覆盖以前的变量):
$file = "resampled/output_temp.jpg";
$image = file_get_contents($file);
$source = imagecreatefromstring($image);
list($src_width, $src_height) = getimagesize($file);
5)创建一个新的图像占位符,在我的情况下最初为正方形:
$thumb = imagecreatetruecolor($th_width, $th_height);
6)现在将临时填充缩略图复制到方形占位符中,这将导致裁剪填充:
imagecopy($thumb, $source, 0, 0, 0, 0, $src_width, $src_height);
header('Content-Type: image/jpeg');
echo imagejpeg($thumb);
imagedestroy($thumb);
同样,这对于将我的水平图像居中放置在方形画布上是不必要的,但这是一种解决方法,可以消除分割填充背景。