PHP似乎运行一些图像创建的东西比它应该更多

时间:2014-07-26 19:05:07

标签: php

我有一些代码将徽标叠加到我的图片上。我想要的是从一个装满图像的文件夹开始,然后将徽标覆盖到每个文件夹上并保存一份副本。在我看来,下面的代码应该实现这一点。但是,在我的浏览器中,我得到了。

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)之外的所有图像实际输出两次!它的某些我的输出文件被用作输入但不是全部。

2 个答案:

答案 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指出的一个错误)我想我只是假设一个调试器可以正常工作:(