我有一个脚本,采取一个图像,当重新采样中心的短尺寸(宽度或高度)在一个正方形的彩色背景。
对于宽度较长的图像,这种方法效果很好,但由于某些原因,任何高度较长的图像,其结果都是分割背景填充-左边是正确的颜色,右边是默认的黑色。如果我使用X轴偏移播放,背景填充仅延伸到图像放置的右侧。
计算值与垂直图像的预期值相同,因此我无法确定此处发生了什么。请注意,“imagecopy()”会产生完全相同的行为。
原图为155 x 400px
方形宽高比的调整源尺寸=400 x 400 px
生成的缩略图为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 px),使其在水平方向上更长,则应用完整的背景填充:
imagecopyresampled($thumb, $source, 0, 77, 0, 0, 250, 250, 400, 400);
对于垂直图像,我的坐标值(77,0)将图像放置在imageCreateTureColor()画布上,正好位于我所需的中心位置,但更改任何其他imageCopyResampled()值都会拉伸或挤压重采样图像或将其裁剪。
我是不是忽略了一些简单的事情?在此处查看屏幕截图:
http://i.stack.imgur.com/5CxHU.jpg(垂直发布)和
http://i.stack.imgur.com/wvhzP.jpg(水平确定)
最佳答案
这个垂直问题一定与php的重采样/imagefill算法有关(?)但这里有一个解决方法,现在可以将我所有的垂直图像集中在我的方形画布中:
1)您需要首先填充图像占位符,以便背景填充将通过使用X轴偏移量扩展缩略图高度(听起来很奇怪,但它起作用)扩展到重采样图像的右边缘。我们稍后将对此进行修剪:
$thadj_height = $th_height + $th_x;
$thumb = imagecreatetruecolor($th_width, $thadj_height);
2)像往常一样使用背景填充重新采样(请注意,填充是在重新采样语句之后应用的,很奇怪,但只能这样工作)…请记住$thumb的高度比$thu width,$thu 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)创建一个新的图像占位符square,与我的示例中的初衷一样:
$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);
同样,这些都不需要在正方形画布上居中我的水平图像,但这是一个解决办法,将消除分割填充背景。
关于php - imagecopyresampled()导致背景颜色分离imagefill(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30333946/