首页 文章

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

提问于
浏览
0

我在图片上传中使用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是资源,boolean在第116行中给出警告:imagejpeg()期望参数1是资源,布局在第117行的......中给出警告:imagejpeg()期望参数1是资源,布尔值在...在第118行警告:imagejpeg()期望参数1是资源,在第119行中给出的布尔值警告:imagedestroy()期望参数1是资源,布局在第120行中给出...警告: imagedestroy()期望参数1是资源,布线给定...在第121行警告:imagedestroy()期望参数1是资源,boolean在第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 [通道] => 3 [mime ] => image / jpeg)

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

2 回答

  • 1

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

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


    好的,根据下面的评论,这是你的问题:

    $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

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

    基本上,我的代码中有 $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);
    

    STEP BY STEP

    我创建了一个画布

    $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);
    

    希望它能帮助别人:)

相关问题