2010-10-31 39 views
0

Im ayant problème lorsqu'un utilisateur télécharge et de tenter de recadrer une image PNG ou une image transparente (avec .gif)PHP: culture avec PNG et trans

Je reçois:

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 

Cela peut être dû au fait de ma fonction de culture 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; 
} 

il crée de jpg, ne peux pas je fais de sorte qu'il crée à partir gif et png et bmp et ainsi ..? et puis le convertir en quelque sorte ..

Comment cela devrait-il être résolu?

Répondre

2

La fonction imagecreatefromjpeg() crée une image générique PHP objet à partir d'une image jpeg. Vous pouvez alors faire ce que vous voulez avec l'objet.

imagecreatefromjpeg() crée UNIQUEMENT un objet image générique à partir d'un fichier JPEG. Si vous souhaitez créer un objet image générique à partir d'un fichier PNG ou GIF, vous devez utiliser leurs fonctions respectives: imagecreatefrompng() et imagecreatefromgif(). Un moyen rapide de détecter le type d'une image est en lisant son extension de fichier. Une fois que vous avez cet objet image générique, vous pouvez en faire ce que vous voulez (y compris en utilisant imagecopyresampled()), puis créer une image jpeg à l'aide de imagejpeg().

EDIT:

Vous pouvez utiliser pathinfo() pour détecter l'extension du fichier:

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

Si vous obtenez le nom du fichier à partir d'une valeur $_POST, vous devez vous assurer que vous copiez le fichier image temporaire à ce nom de fichier. Je ne vois aucune valeur $_FILES utilisée dans votre code (peut-être que vous le faites dans un autre script?). Si ce n'est pas le cas, here's a good tutorial on handling file uploads. Il couvre également les extensions de fichiers.

+0

Salut, merci pour votre réponse. Comment puis-je détecter une extension de fichier? $ _POST ["nom"]; est le nom de fichier par exemple asddsa.jpg – Johnson

+0

Un moyen très simple serait de voir si strpos ($ _ POST ['fname'], '.jpg'); renvoie vrai. Changez simplement '.jpg' en '.png', '. Gif', '.jpeg' pour tester d'autres types. – Klinky

0

Le chargement de l'image échoue, ce qui provoque le retour de la fonction imagecreatefromjpeg(). Assurez-vous que vous essayez d'ouvrir une image valide.

0

Pour gif et png fichiers dont vous avez besoin pour obtenir l'identifiant d'image en utilisant imagecreatefromgif et imagecreatefrompng

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

?> 

Ceci retournera l'image recadrée.

1

Try This ... Il fonctionnera ..

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


?>