PHP: обрезка с PNG и транс - PullRequest
       54

PHP: обрезка с PNG и транс

0 голосов
/ 01 ноября 2010

У меня проблема, когда пользователь загружает и пытается обрезать 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 ]

2 голосов
/ 01 ноября 2010

Функция imagecreatefromjpeg() создает общее изображение PHP объект из изображения JPEG. Затем вы можете делать с объектом все, что захотите.

imagecreatefromjpeg() ТОЛЬКО создаст общий объект изображения ИЗ JPEG. Если вы хотите создать общий объект изображения из PNG или GIF, вам нужно использовать их соответствующие функции: imagecreatefrompng() и imagecreatefromgif(). Один быстрый способ определить тип изображения - прочитать его расширение.

Если у вас есть этот общий объект изображения, вы можете делать с ним все, что хотите (в том числе, используя imagecopyresampled()), а затем создать из него изображение JPEG, используя imagejpeg().

EDIT:

Вы можете использовать pathinfo(), чтобы определить расширение файла:

$filename = pathinfo($_POST['fname']); // Returns an array of file details
$extension = $filename['extension'];

Если вы получаете имя файла из значения $_POST, вам необходимо убедиться, что вы копируете временный файл изображения в это имя файла. Я не вижу значений $_FILES, используемых в вашем коде (может быть, вы делаете это в другом скрипте?). Если нет, то вот хорошее руководство по загрузке файлов . Он также охватывает расширения файлов.

1 голос
/ 05 февраля 2014

Попробуйте это ... Это будет работать ..

<?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);


?>
0 голосов
/ 07 августа 2012
<?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);

?>

Это вернет обрезанное изображение.

0 голосов
/ 01 ноября 2010

Для файлов gif и png вам необходимо получить идентификатор изображения, используя imagecreatefromgif и imagecreatefrompng

0 голосов
/ 01 ноября 2010

Не удается загрузить изображение, из-за чего imagecreatefromjpeg () возвращает false.Убедитесь, что вы пытаетесь открыть действительное изображение.

...