我有一些代码将徽标叠加到我的图片上。我想要的是从一个装满图像的文件夹开始,然后将徽标覆盖到每个文件夹上并保存一份副本。在我看来,下面的代码应该实现这一点。但是,在我的浏览器中,我得到了。
Array ( [0] => ./images/im1.jpg [1] => ./images/im2.jpg [2] => ./images/im3.jpg [3] => ./images/im4.jpg [4] => ./images/im5.jpg [5] => ./images/im6.jpg [6] => ./images/im7.jpg [7] => ./images/out0.jpg [8] => ./images/out1.jpg [9] => ./images/out2.jpg [10] => ./images/out3.jpg [11] => ./images/out4.jpg [12] => ./images/out5.jpg )
当print_r语句的输出打印出它应该在文件夹中找到的文件。我只有文件im<#> .jpg,1到7在脚本运行之前,没有任何名为<#> .jpg的文件。然而,它们是在底部while循环中创建的。
我对这个完全感到困惑,因为我确实得到了我的输出图片......太多了。
相关代码(我认为)从foreach循环开始。
$logoHeight = 60;
$overlayImage = imagecreatefrompng('./overlay.png');
list($overlayWidth, $overlayHeight) = getimagesize('./overlay.png');
$overlayAspectRatio = ($overlayWidth*1.000) /($overlayHeight*1.0000);
list($resizedOverlayWidth, $resizedOverlayHeight) = [round($logoHeight*$overlayAspectRatio), $logoHeight];
list($paddingX, $paddingY) = [20, 20];
$filesInFolder = scandir('./images');
$pictureFilesToConvert = array();
$pictureNumber = 0;
foreach($filesInFolder as $file)
{
$fullFilePath = './images/'.$file;
$extension = pathinfo($fullFilePath,PATHINFO_EXTENSION);
if ($extension == "jpg")
{
$pictureFilesToConvert[$pictureNumber] = $fullFilePath;
$pictureNumber++;
}
}
$pictureNumber--; //decrement by one because we incremented even on the last image above.
print_r($pictureFilesToConvert);
print_r($pictureNumber);
$i = 0;
while($i < $pictureNumber)
{
$backgroundImage = imagecreatefromjpeg($pictureFilesToConvert[$i]);
list($backgroundWidth, $backgroundHeight) = getimagesize($pictureFilesToConvert[$i]);
$outputImage = imagecreatetruecolor($backgroundWidth, $backgroundHeight);
imagecopy($outputImage,$backgroundImage,0,0,0,0,$backgroundWidth, $backgroundHeight);
imagecopyresampled($outputImage, $overlayImage, $backgroundWidth - $resizedOverlayWidth - $paddingX, $backgroundHeight - $resizedOverlayHeight - $paddingY, 0, 0, $resizedOverlayWidth, $resizedOverlayHeight, $overlayWidth, $overlayHeight);
imagejpeg($outputImage, './images/out'.$i.'.jpg', 100);
$i++;
}
我通过out11.jpg结束了out0.jpg。我的输入图像除了一个(im7.jpg)之外的所有图像实际输出两次!它的某些我的输出文件被用作输入但不是全部。
答案 0 :(得分:1)
代码错过了最后一张图片,因为在行$pictureNumber--;
之后,$pictureNumber
= 6(如果有7个输入图像)。但是,在最后的while
循环中,它只运行了6次(0到5)。两次输出的图像可能来自重新运行脚本而不删除先前的输出。这是一个使用更传统语法的版本:
foreach($filesInFolder as $file)
{
$fullFilePath = './images/'.$file;
$extension = pathinfo($fullFilePath,PATHINFO_EXTENSION);
if ($extension == "jpg")
{
$pictureFilesToConvert[] = $fullFilePath;
}
}
print_r($pictureFilesToConvert);
foreach ($pictureFilesToConvert as $i => $pic)
{
$backgroundImage = imagecreatefromjpeg($pic);
list($backgroundWidth, $backgroundHeight) = getimagesize($pictureFilesToConvert[$i]);
$outputImage = imagecreatetruecolor($backgroundWidth, $backgroundHeight);
imagecopy($outputImage,$backgroundImage,0,0,0,0,$backgroundWidth, $backgroundHeight);
imagecopyresampled($outputImage, $overlayImage, $backgroundWidth - $resizedOverlayWidth - $paddingX, $backgroundHeight - $resizedOverlayHeight - $paddingY, 0, 0, $resizedOverlayWidth, $resizedOverlayHeight, $overlayWidth, $overlayHeight);
imagejpeg($outputImage, './images/out'.$i.'.jpg', 100);
}
答案 1 :(得分:0)
我现在感到愚蠢......我认为phpstorm调试器运行我的页面的方式有问题。我下载了MAMP,将我的项目复制到该文件夹并直接运行并且它可以工作(除了由@Fabricator指出的一个错误)我想我只是假设一个调试器可以正常工作:(