这个函数cropit,我无耻地偷走了互联网,从现有的图像中裁剪了90x60的区域。
在这段代码中,当我将该函数用于多个项目(图像)时,一个将显示在另一个项目的顶部(它们占据相同的输出空间)。
我认为这是因为该函数在创建时(imagecopy)具有相同的(静态)名称($ dest)作为图像的目的地。
我试过,因为你可以看到在cropit函数中包含第二个参数,它将作为$ dest变量的“名称”,但它不起作用。
为了充分披露我有22小时的PHP经验(顺便说一下,自上次我睡觉以来的小时数相同),我开始时并不那么聪明。
即使在这里完全有其他工作,但在我看来,通常有一种方法可以确保变量总是被赋予唯一的名称。
<?php
function cropit($srcimg, $dest) {
$im = imagecreatefromjpeg($srcimg);
$img_width = imagesx($im);
$img_height = imagesy($im);
$width = 90;
$height = 60;
$tlx = floor($img_width / 2) - floor ($width / 2);
$tly = floor($img_height / 2) - floor ($height / 2);
if ($tlx < 0)
{
$tlx = 0;
}
if ($tly < 0)
{
$tly = 0;
}
if (($img_width - $tlx) < $width)
{
$width = $img_width - $tlx;
}
if (($img_height - $tly) < $height)
{
$height = $img_height - $tly;
}
$dest = imagecreatetruecolor ($width, $height);
imagecopy($dest, $im, 0, 0, $tlx, $tly, $width, $height);
imagejpeg($dest);
imagedestroy($dest);
}
$img = "imagefolder\imageone.jpg";
$img2 = "imagefolder\imagetwo.jpg";
cropit($img, $i1);
cropit($img2, $i2);
?>
答案 0 :(得分:1)
在这段代码中,当我将该函数用于多个项目(图像)时,一个将显示在另一个项目的顶部(它们将占据相同的输出空间)。
您正在创建原始图像数据:您无法在HTTP请求中一次提供多个图像(您可以将无限量保存到文件中,imagejpg可以获取更多参数),没有像样的浏览器会知道如何制作它
如果要将一个图像叠加到另一个图像上,请查看imagecopyresampled()
我认为这是因为该函数在创建时(imagecopy)具有相同的(静态)名称($ dest)作为图像的目的地。
情况并非如此,只要您的函数退出$ dest就不再存在(它只存在于函数范围内。请参阅http://php.net/manual/en/language.variables.scope.php
答案 1 :(得分:0)
我希望我理解你。您想将裁剪的图像保存为变量$i1
和$i2
中的文件名吗?
然后最后一部分可能是错的。它应该是这样的:
<?php
function cropit($srcimg, $filename) {
$im = imagecreatefromjpeg($srcimg);
$img_width = imagesx($im);
$img_height = imagesy($im);
$width = 90;
$height = 60;
$tlx = floor($img_width / 2) - floor ($width / 2);
$tly = floor($img_height / 2) - floor ($height / 2);
if ($tlx < 0)
{
$tlx = 0;
}
if ($tly < 0)
{
$tly = 0;
}
if (($img_width - $tlx) < $width)
{
$width = $img_width - $tlx;
}
if (($img_height - $tly) < $height)
{
$height = $img_height - $tly;
}
$dest = imagecreatetruecolor ($width, $height);
imagecopy($dest, $im, 0, 0, $tlx, $tly, $width, $height);
imagejpeg($dest, $filename); // Second parameter
imagedestroy($dest);
}
imagejpeg
有第二个参数,它将文件名保存为。