我有以下代码
// load image and get image size
$img = imagecreatefrompng( "{$pathToImages}{$fname}" );
$width = imagesx( $img );
$height = imagesy( $img );
// calculate thumbnail size
$new_width = $imageWidth;
$new_height = 500;
// create a new temporary image
$tmp_img = imagecreatetruecolor( $new_width, $new_height );
// copy and resize old image into new image
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
它适用于某些图像..但对于某些图像,它会显示错误,如
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error:
Warning: imagesx() expects parameter 1 to be resource, boolean given
Warning: imagesy() expects parameter 1 to be resource, boolean given
我也启用了
gd.jpeg_ignore_warning = 1
在php.ini中
任何帮助表示感谢。
答案 0 :(得分:4)
根据a blog post from (Feb 2010),imagecreatefromjpeg
实施中的一个错误应该返回false
但会引发错误。
解决方案是检查图像的文件类型(我删除了对imagecreatefromjpeg
的重复调用,因为它完全是多余的;我们之前已经检查过正确的文件类型,如果由于某些其他原因发生错误, imagecreatefromjpeg
将正确返回false
:
function imagecreatefromjpeg_if_correct($file_tempname) {
$file_dimensions = getimagesize($file_tempname);
$file_type = strtolower($file_dimensions['mime']);
if ($file_type == 'image/jpeg' || $file_type == 'image/pjpeg'){
$im = imagecreatefromjpeg($file_tempname);
return $im;
}
return false;
}
然后你可以这样编写你的代码:
$img = imagecreatefrompng_if_correct("{$pathToImages}{$fname}");
if ($img == false) {
// report some error
} else {
// enter all your other functions here, because everything is ok
}
当然你可以为png做同样的事情,如果你想打开一个png文件(就像你的代码建议的那样)。实际上,通常你会检查你的文件确实有哪种文件类型,然后在三者之间调用正确的函数(jpeg,png,gif)。
答案 1 :(得分:1)
请参阅PHP Bug #39918 imagecreatefromjpeg doesn't work。建议更改jpeg图像加载的GD设置:
ini_set("gd.jpeg_ignore_warning", 1);
然后您还需要检查imagecreatefromjpeg
Docs电话的返回值:
$img = imagecreatefromjpeg($file);
if (!$img) {
printf("Failed to load jpeg image \"%s\".\n", $file);
die();
}
另请注意可能重复的问题:
它与您的错误描述几乎相同。
答案 2 :(得分:0)
你能举出任何有/无效的文件的例子吗? 根据{{3}}远程文件中的空格可能会导致问题。
答案 3 :(得分:0)
此问题的解决方案:检测imagecreatefromjpeg是否返回'false',在这种情况下,请在file_get_contents上使用imagecreatefromstring。 为我工作。 参见下面的代码示例:
$ind=0;
do{
if($mime == 'image/jpeg'){
$img = imagecreatefromjpeg($image_url_to_upload );
}elseif ($mime == 'image/png') {
$img = imagecreatefrompng($image_url_to_upload );
}
if ($img===false){
echo "imagecreatefromjpeg error!\n ");
}
if ($img===false){
$img = imagecreatefromstring(file_get_contents($image_url_to_upload));
}
if ($img===false){
echo "imagecreatefromstring error!\n ");
}
$ind++;
}while($img===false&&$ind<5);
答案 4 :(得分:0)
如果您使用URL作为图像源,则需要确保启用php设置allow_url_fopen。