PHP GD多个图像与白色背景 - 警告?

时间:2012-03-16 17:26:35

标签: php image-processing warnings gd

我在图片上传中使用php imagecolorallocate()和imagefill()也让png文件具有白色背景(如在这篇文章中所示:imagescreatetruecolor with a white background

以下是它所涉及的代码的一部分:

    //create new images
    $nimgac_0=imagecreatetruecolor($maxw_img0,$maxh_img0); //img1
    $nimgac_1=imagecreatetruecolor($maxw_img1,$maxh_img1); //img2
    $nimgac_2=imagecreatetruecolor($maxw_img2,$maxh_img2); //img3

    $nimgaa_0=imagecolorallocate($nimgac_0,255,255,255);
    $nimgaa_1=imagecolorallocate($nimgac_1,255,255,255);
    $nimgaa_2=imagecolorallocate($nimgac_2,255,255,255);

    $nimga_0=imagefill($nimgac_0,0,0,$nimgaa_0);
    $nimga_1=imagefill($nimgac_1,0,0,$nimgaa_1);
    $nimga_2=imagefill($nimgac_2,0,0,$nimgaa_2);

    //create images from temp folder
        if ($type=="jpg") {
            $nimgb_0=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
            $nimgb_1=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
            $nimgb_2=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
        }

        if ($type=="png") {
            $nimgb_0=imagecreatefrompng("../imga/".$_FILES['file']['name']);
            $nimgb_1=imagecreatefrompng("../imga/".$_FILES['file']['name']);
            $nimgb_2=imagecreatefrompng("../imga/".$_FILES['file']['name']);
        }


    imagecopyresized($nimga_0,$nimgb_0,0,0,0,0,$nwidth_0,$nheight_0,$width,$height);
    imagecopyresized($nimga_1,$nimgb_1,0,0,0,0,$nwidth_1,$nheight_1,$width,$height);
    imagecopyresized($nimga_2,$nimgb_2,0,0,0,0,$nwidth_2,$nheight_2,$width,$height);

    imagejpeg($nimga_0,"../imga/".$_FILES['file']['name'],80);
    imagejpeg($nimga_1,"../imga/".$imgname_1,80);
    imagejpeg($nimga_2,"../imga/".$imgname_2,80);

但我得到了这个警告:

  

警告:imagecopyresized()期望参数1是资源,   在第114行的......中给出的布尔值

     

警告:imagecopyresized()期望参数1是资源,   在第115行的......中给出的布尔值

     

警告:imagecopyresized()期望参数1是资源,   在第116行的......中给出的布尔值

     

警告:imagejpeg()期望参数1是资源,给定布尔值   在...第117行

     

警告:imagejpeg()期望参数1是资源,给定布尔值   在......第118行

     

警告:imagejpeg()期望参数1是资源,给定布尔值   在...第119行

     

警告:imagedestroy()期望参数1是资源,布尔值   在......第120行给出

     

警告:imagedestroy()期望参数1是资源,布尔值   给出......第121行

     

警告:imagedestroy()期望参数1是资源,布尔值   在......第122行给出

没有immagecolorallocate()和imagefill()的相同代码完全正常。但是,我发现上述发布的代码没有任何错误或任何差异。

任何想法?提前谢谢!

PS:我想将所有图像保存为jpg,这也是我将png转换为jpg的原因。

编辑3(抱歉,我感到困惑):

print_r(getimagesize($_FILES['file']['tmp_name']));返回

  

数组([0] => 354 [1] => 332 [2] => 2 [3] => width =“354”height =“332”[位] => 8 [ channel] => 3 [mime] => image / jpeg)

所以,if($size['2']==3) {$type="jpg";} ...

一切都很好

2 个答案:

答案 0 :(得分:1)

“给定布尔值”通常表示操作失败,而不是返回GD句柄,返回布尔值false。然后在另一个GD调用中的其他位置使用此false值,并获得该警告。

所以看看代码中你的第114行是什么,找出你在那里使用的GD句柄的来源,然后弄清楚为什么应该生成该句柄的操作产生了错误值。< / p>


好的,根据以下评论中的内容,这是您的问题:

$size = getimagesize($_FILES[ blah blah blah]);

返回一个数组。然后,将此数组与int:

进行比较
$size == 2

哪个会失败。所以$ type是空白的。这意味着无法调用imagecreatefromXXX()函数,并且$ nimgb_XXX图像处理永远不会被定义。

但是,您将这些未定义的句柄变量传递给各种其他GD函数,然后您会收到警告。不知何故,PHP放入这些变量的自动创建的null值被GD库报告为FALSE。

您的代码应为:

$info = getimagesize(...);
switch($info['type']) {
    case IMGTYPE_JPG:
         $nimgb_0=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
         $nimgb_1=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
         $nimgb_2=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
         break;
    case IMGTYPE_PNG:
         etc....
    default:
         die("Unsupported file type");
}

IMGTYPE _...常量记录在此处:http://php.net/manual/en/image.constants.php

答案 1 :(得分:1)

我终于找到了我的问题的答案,并认为我应该一步一步地在这里发布,所以如果某人有一天应该有同样的问题,这就是我想出的:

基本上,我的代码中有$nimga_0=imagefill($nimgac_0,0,0,$nimgaa_0);,而imagefill则是bool。因此,imagefill成功了,我将其值1分配给$ nimga_0,然后想在imagecopyresized($nimga_0,$nimgb_0,0,0,0,0,$nwidth_0,$nheight_0,$width,$height);中使用1作为资源。

当然,这不是一个有效的来源。我不得不改变的只是遗漏了变量而只是做了:

imagefill($nimgac_0,0,0,$nimgaa_0);

逐步

我用

创建了一个画布
$nimgac_0=imagecreatetruecolor($maxw_img0,$maxh_img0);

然后是

的白色
$nimgaa_0=imagecolorallocate($nimgac_0,255,255,255);

然后只需使用

填充画布颜色
imagefill($nimgac_0,0,0,$nimgaa_0);

然后我用

复制上传的图像
$nimgb_0=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);

然后将上传的图像复制到(现在为白色的)画布

imagecopyresized($nimgac_0,$nimgb_0,0,0,0,0,$nwidth_0,$nheight_0,$width,$height);

并另存为jpg

imagejpeg($nimgac_0,"../imga/".$_FILES['file']['name'],80); 

最后清除缓存

imagedestroy($nimgac_0);

希望它也可以帮助其他人:)