PHP - 如何保护唯一的变量名称?

时间:2010-06-05 16:41:26

标签: php

这个函数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);
?>

2 个答案:

答案 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有第二个参数,它将文件名保存为。