gpt4 book ai didi

php - imagecopyresampled() 导致分离颜色背景 imagefill()

转载 作者:搜寻专家 更新时间:2023-10-31 22:00:11 24 4
gpt4 key购买 nike

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

计算值符合垂直图像的预期值,因此我无法弄清楚这里发生了什么。请注意,“imagecopy()”会产生完全相同的行为。

  • 原始图片为 155 x 400 像素
  • 调整后的源尺寸为方形纵横比 = 400 x 400 像素
  • 生成的缩略图为 250 x 250 像素

这是一个带有静态值的代码示例:

$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() Canvas 上,正好在我想要的位置居中,但更改任何其他 imagecopyresampled() 值拉伸(stretch)或挤压重采样图像或裁剪它.

我是否忽略了一些简单的事情?在此处查看屏幕截图: http://i.stack.imgur.com/5CxHU.jpg (垂直问题)和 http://i.stack.imgur.com/wvhzP.jpg (横向确定)

最佳答案

这个垂直问题一定与 PHP 的重采样/图像填充算法有关(?),但这里有一个解决方法,现在可以将我的所有垂直图像居中放置在我的方形 Canvas 中:

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

同样,这些都不是将我的水平图像居中放置在方形 Canvas 上所必需的,但这是一种解决方法,可以消除分割填充背景。

关于php - imagecopyresampled() 导致分离颜色背景 imagefill(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30333946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com