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

Posted

技术标签:

【中文标题】PHP GD 多张白色背景图像 - 警告?【英文标题】:PHP GD multiple images with white background - warnings? 【发布时间】:2012-03-16 17:26:35 【问题描述】:

我在图像上传中使用 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,所以我也把pngs转成jpg。

编辑 3(对不起,我弄糊涂了):

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

数组 ( [0] => 354 [1] => 332 [2] => 2 [3] => [bits] => 8 [channels] => 3 [mime] => 图片/jpeg )

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

【问题讨论】:

【参考方案1】:

“Boolean given”通常意味着操作失败,而不是返回一个 GD 句柄,而是返回一个布尔值 false。然后,您在另一个 GD 调用中的其他地方使用此错误值,并收到该警告。

因此,请查看该代码中的第 114 行,找出您在其中使用的 GD 句柄来自何处,然后找出本应生成该句柄的操作产生错误值的原因。


好的,下面的 cmets 的结果是你的问题:

$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

【讨论】:

谢谢 Marc,这是带有 imagecopyresized() 的行。如果我不使用 image allocate 和 imagefill 就不会出现警告,我认为一定是因为它们? 这就是警告发生的地方,但实际问题发生得更早,当时之前的 GD 调用失败并返回 false 值。您必须弄清楚是哪个复制大小的参数导致了它(src img、dst img 等......),然后弄清楚为什么它之前得到了一个错误的值。 是的,我认为这一定是因为 imagecolorallocate() 和 imagefill() 因为没有这两个调用的相同代码工作得非常好......所以,我提到了堆栈中的另一个问题溢出。我以为我的代码和那里完全一样,但可能我有一些错误......我怎样才能找出导致它们失败的原因? 检查文件上传是否实际成功 - 您正在直接从 PHP 为上传创建的 tmp 文件中读取。如果上传失败,这些文件将不存在,并且 imagecreatefromjpeg/png 的结果将得到 FALSE 文件上传有效,我实际上在正文中显示文件......当然我使用move_uploaded_file【参考方案2】:

我终于找到了我的问题的答案,我想我应该一步一步把它贴在这里,所以如果有一天有人遇到同样的问题,这就是我想出的:

基本上,我的代码中有 $nimga_0=imagefill($nimgac_0,0,0,$nimgaa_0);,而 imagefill 是一个布尔值。所以,imagefill 成功了,我把它的值 1 赋给了 $nimga_0,然后想用 1 作为imagecopyresized($nimga_0,$nimgb_0,0,0,0,0,$nwidth_0,$nheight_0,$width,$height); 中的资源。

当然,这不可能是有效的来源。我所要做的就是省去变量,然后做:

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

希望它也对其他人有所帮助:)

【讨论】:

以上是关于PHP GD 多张白色背景图像 - 警告?的主要内容,如果未能解决你的问题,请参考以下文章

PHP中带有GD的透明背景

带有白色背景且未集中的 PHP 缩略图

使用 imagick 将图像放在白色背景上

使用gd在php中调整图像大小后的黑色背景

用PHP检测白色图像背景?

PHP系列GD库