我在用户上传并尝试裁剪PNG或透明图片(使用.gif)时遇到问题
我得到了:
Warning: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: in statusUpFunctions.php on line 100
Warning: imagecreatefromjpeg(): 'images/status/photo/1-6.jpg' is not a valid JPEG file in statusUpFunctions.php on line 100
Warning: imagecopyresampled() expects parameter 2 to be resource, boolean given in statusUpFunctions.php on line 114
这可能是因为我的php裁剪功能:
case 'crop':
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
ini_set('memory_limit', '256M');
$jpeg_quality = 90;
$src = "images/status/photo/".$_POST['fname'];
$img_r = imagecreatefromjpeg($src);
if($_POST['fixed'] == 0) {
$targ_w = $_POST['w'];
$targ_h = $_POST['h'];
}
else {
$targ_h = $_POST['sizeh'];
$targ_w = $_POST['sizew'];
}
$dst_r = ImageCreateTrueColor( $targ_w, $targ_h );
imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],
$targ_w,$targ_h,$_POST['w'],$_POST['h']);
$path_thumbs = "images/status/photo";
$filename = $newfilename;
$thumb_path = $path_thumbs . '/' . $filename;
imagejpeg($dst_r,$thumb_path,$jpeg_quality);
}
break;
}
它是从jpg创建的,我不能这样创建它是从gif和png和bmp等等...?然后以某种方式转换它..
如何解决这个问题?
答案 0 :(得分:2)
函数imagecreatefromjpeg()
从jpeg图像创建通用PHP图像对象。然后,您可以使用该对象执行任何操作。
imagecreatefromjpeg()
只能从JPEG创建一个通用图像对象。如果要从PNG或GIF创建通用图像对象,则需要使用各自的功能:imagecreatefrompng()
和imagecreatefromgif()
。检测图像类型的一种快速方法是读取其文件扩展名。
拥有该通用图像对象后,您可以使用它执行所需的操作(包括使用imagecopyresampled()
),然后使用imagejpeg()
从中创建jpeg图像。
修改强>
您可以使用pathinfo()
来检测文件的扩展名:
$filename = pathinfo($_POST['fname']); // Returns an array of file details
$extension = $filename['extension'];
如果从$_POST
值获取文件名,则需要确保将临时映像文件复制到该文件名。我没有在您的代码中看到任何$_FILES
值(也许您在另一个脚本中执行此操作?)。如果没有,here's a good tutorial on handling file uploads。它还包括文件扩展名。
答案 1 :(得分:1)
试试这个......它会起作用..
<?php
$image = imagecreatefrompng('photo.png');
$thumb_width = 280;
$thumb_height = 200;
$width = imagesx($image);
$height = imagesy($image);
$original_aspect = $width / $height;
$thumb_aspect = $thumb_width / $thumb_height;
if ( $original_aspect >= $thumb_aspect ){
// If image is wider than thumbnail (in aspect ratio sense)
$new_height = $thumb_height;
$new_width = $width / ($height / $thumb_height);
}else{
// If the thumbnail is wider than the image
$new_width = $thumb_width;
$new_height = $height / ($width / $thumb_width);
}
$crop = imagecreatetruecolor($thumb_width,$thumb_height);
imagealphablending($crop, false);
$white = imagecolorallocatealpha($crop, 0, 0, 0, 127); //FOR WHITE BACKGROUND
imagefilledrectangle($crop,0,0,$thumb_width,$thumb_height,$white);
imagesavealpha($crop, true);
$userImage = imagecopyresampled($crop, $image,
0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
0 - ($new_height - $thumb_height) / 2, // Center the image vertically
0, 0, $new_width, $new_height,
$width, $height);
header('Content-type: image/png');
imagepng($crop);
?>
答案 2 :(得分:0)
无法加载图像,导致imagecreatefromjpeg()返回false。确保您尝试打开有效图片。
答案 3 :(得分:0)
对于gif和png文件,您需要使用imagecreatefromgif和imagecreatefrompng获取图像标识符
答案 4 :(得分:0)
<?php
$image = imagecreatefrompng('myPhoto.png');
$crop = imagecreatetruecolor(50,50);
$userImage = imagecopyresampled($crop, $image, 0, 0, 0, 0, 50, 50, 8, 8);
header('Content-type: image/png');
imagepng($crop);
?>
这将返回裁剪的图像。