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 多张白色背景图像 - 警告?的主要内容,如果未能解决你的问题,请参考以下文章