PHP:使用PNG和trans进行裁剪

时间:2010-10-31 23:10:56

标签: php image upload crop

我在用户上传并尝试裁剪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等等...?然后以某种方式转换它..

如何解决这个问题?

5 个答案:

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

?>

这将返回裁剪的图像。