2010-06-11 4 views
2

Cette fonction crée des images noires aléatoires comme .. 10% du temps, n'est pas beaucoup, mais .. vous savez .. ne devrait pas se produire.PHP + GD créer des vignettes noires aléatoires

class ImgResizer { 
private $originalFile = ''; 
public function __construct($originalFile = '') { 
    $this -> originalFile = $originalFile; 
} 
public function resize($newWidth, $targetFile) { 
    if (empty($newWidth) || empty($targetFile)) { 
     return false; 
    } 
    $src = imagecreatefromjpeg($this -> originalFile); 
    list($width, $height) = getimagesize($this -> originalFile); 
    $newHeight = ($height/$width) * $newWidth; 

    if ($newHeight<'335') { 
     //$newHeight='335'; 
    } 
    $tmp = imagecreatetruecolor($newWidth, $newHeight); 
    #$tmp = imagecreate($newWidth, $newHeight); 
    imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 
    if (file_exists($targetFile)) { 
     unlink($targetFile); 
    } 
    imagejpeg($tmp, $targetFile, 85); // 85 is my choice, make it between 0 – 100 for output image quality with 100 being the most luxurious 
} 

}

aucune erreur données dans error_log. Voici gd_info():

Array(
[GD Version] => bundled (2.0.34 compatible) 
[FreeType Support] => 
[T1Lib Support] => 
[GIF Read Support] => 1 
[GIF Create Support] => 1 
[JPG Support] => 1 
[PNG Support] => 1 
[WBMP Support] => 1 
[XPM Support] => 1 
[XBM Support] => 1 
[JIS-mapped Japanese Font Support] =>)1 

le serveur est linux. La fonction est appelée comme ceci: en supposant que $ imagen est l'image source réelle, et $ imagendestino est le chemin et le nom de fichier de la nouvelle vignette.

if (!file_exists($imagendestino)) { 
     $work = new ImgResizer($imagen); 
     $work -> resize(475, $imagendestino); 
    } 

Merci d'avance!

+0

Êtes-vous sûr que la journalisation des erreurs est activée? –

+0

Le déterminisme défaillant? C'est à dire. la sortie est-elle toujours la même pour le même fichier d'entrée? –

Répondre

1

Vous avez probablement transmis une image non JPEG.

Un format JPEG est redimensionné correctement, mais comme la fonction ne peut pas lire un format d'image différent, une image non valide est générée. Le résultat est une image vide, c'est-à-dire tous les zéros, ceci donne une image noire. créé par

imagecreatetruecolor($newWidth, $newHeight); 

quand j'ai couru vous classe passer un fichier image PNG donne ces avertissements et crée une image en noir:

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'filename' is not a valid JPEG file 
Warning: imagecopyresampled(): supplied argument is not a valid Image resource 

plus probable que vous avez avertissement désactiver si vous n Ne reçois pas ces messages.

essayez d'utiliser

imagecreatefromstring(file_get_contents(filename)) 

au lieu de

imagecreatefromjpeg(filename) 

cette façon GD détecte automatiquement le type de fichier en fonction de l'en-tête de fichier pour vous.