imagecopyresampled()导致分色背景imagefill()

时间:2015-05-19 18:58:00

标签: php

我有一个拍摄图像的脚本,重新采样时将短尺寸(宽度或高度)居中放在方形彩色背景上。 这适用于具有较长WIDTH的图像但由于某种原因任何具有较长HEIGHT的图像,结果是分割背景填充 - 左侧的正确颜色,但右侧的默认黑色。如果我使用x轴偏移,则背景填充仅向图像放置延伸到右侧。

计算出的值与垂直图像的预期值一样,所以我无法弄清楚这里发生了什么。请注意,'imagecopy()'会产生完全相同的行为。

  • 原始图片为155 x 400px
  • 方形纵横比的调整后的源尺寸= 400 x 400px
  • 结果缩略图为250 x 250px

以下是一个示例的静态值代码:

$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(水平确定)

1 个答案:

答案 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);

同样,这对于将我的水平图像居中放置在方形画布上是不必要的,但这是一种解决方法,可以消除分割填充背景。