我在图片上传中使用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";}
...
答案 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);
希望它也可以帮助其他人:)