2009-12-19 4 views
1

J'utilise l'itérateur de répertoire pour itérer dans les répertoires et redimensionner les images trouvées dans ce répertoire, je le fais depuis le navigateur car je n'ai pas accès à ce serveur. La plupart des images sont bien redimensionnées mais pour chaque 10 images (plus ou moins), je reçois des données jibres. Je pense que c'est une source d'image. dans ces données il y a toujours une chaîne CREATOR: gd-jpeg v1.0 alors je me demande qu'est-ce que c'est? J'ai désactivé toute sortie d'erreur avec le signe @.php redimensionner les images script

EDIT:

Voici le code, et aussi je erreur la cause de sortie désactivée, il n'y a pas d'erreurs et je pensais que la désactivation de la sortie d'erreur désactiverait ces données jiberish, mais les données sont affichées, peu importe.

code:

<?php 
/* 
big = 350 
thumb = 90 
thumb2 = 70 
top = 215 
*/ 

set_time_limit(0); 
ini_set('memory_limit', '128M'); 
ini_set('display_errors', 'On'); 

class ResizeImages 
{ 
    private $dir = 'images/articles_backup_2009-12-19'; 
    private $imageType = array(
     '_big' => 'h:350', 
     '_thumb' => 'm:90', 
     '_thumb2' => 'h:70', 
     '_top' => 'h:215' 
    ); 

    public function __construct() 
    { 
     $this->deleteImages(); 
     $this->resizeImages(); 
    } 

    private function resizeImages() 
    { 
     $n = 0; 
     $dh = opendir($this->dir); 
     while (($file = readdir($dh)) !== false) 
     { 
      if(is_dir($this->dir."/".$file) && $file != '.' && $file != '..') 
      { 
       echo $this->dir."/".$file.'<br />'; 
       $deldir = opendir($this->dir."/".$file); 
       while (($filedel = readdir($deldir)) !== false) 
       { 
        if ($filedel != '.' && $filedel != '..' && $filedel != 'Thumbs.db') 
        { 
         $val = $this->resize($this->dir."/".$file."/".$filedel); 
         $n++; 
        } 
       } 
      } 
     } 
     closedir($dh); 
    } 

    private function resize($target) 
    { 
     $img = $target; 

     $origSize = getimagesize($img); 
     $origWidth = $origSize[0]; 
     $origHeight = $origSize[1]; 

     foreach($this->imageType as $key=>$value) 
     { 
      $attr = explode(':', $value); 

      if(strpos($attr[0], 'w') !== false) 
      { 
       $this->imageWidth = $attr[1]; 
       $this->imageHeight = false; 
      } 
      if(strpos($attr[0], 'h') !== false) 
      { 
       $this->imageHeight = $attr[1]; 
       $this->imageWidth = false; 
      } 

      $imageTmp = explode('.', $img); 
      if(count($imageTmp) == 2) $image_name_fin = $imageTmp[0].$key.'.'.$imageTmp[1]; 
      else if(count($imageTmp) == 4) $image_name_fin = $imageTmp[0].'.'.$imageTmp[1].$key.'.'.$imageTmp[2]; 

      if($this->imageWidth != false) 
      { 
       if($origWidth <= $this->imageWidth) 
       { 
        $resizeHeight = $origHeight; 
        $resizeWidth = $origWidth; 
       } 
       else 
       { 
        $resizeHeight = round($origHeight/($origWidth/$this->imageWidth)); 
        $resizeWidth = $this->imageWidth; 
       } 
      } 
      else if($this->imageHeight != false) 
      { 
       if($origHeight <= $this->imageHeight) 
       { 
        $resizeHeight = $origHeight; 
        $resizeWidth = $origWidth; 
       } 
       else 
       { 
        $resizeWidth = round($origWidth/($origHeight/$this->imageHeight)); 
        $resizeHeight = $this->imageHeight; 
       } 
      } 

      $im = ImageCreateFromJPEG ($img) or // Read JPEG Image 
      $im = ImageCreateFromPNG ($img) or // or PNG Image 
      $im = ImageCreateFromGIF ($img) or // or GIF Image 
      $im = false; // If image is not JPEG, PNG, or GIF 

      if (!$im) 
      { 
       $this->error = array(
        'error' => true, 
        'notice' => 'UPLOADUNSUCCESSFULL' 
       ); 
       return $this->error; 
      } 

      $thumb = ImageCreateTrueColor ($resizeWidth, $resizeHeight); 
      ImageCopyResampled ($thumb, $im, 0, 0, 0, 0, $resizeWidth, $resizeHeight, $origWidth, $origHeight); 
      ImageJPEG ($thumb, $image_name_fin, $this->imageQuality); 
      //echo $image_name_fin.'<br />'; 
     } 

     $this->error = array(
      'imageUrl' => $image_name, 
      'error' => false, 
      'notice' => 'IMAGEUPLOADED' 
     ); 
     return $this->error;    
    } 

    private function deleteImages() 
    { 
     $dh = opendir($this->dir); 
     while (($file = readdir($dh)) !== false) 
     { 
      if(is_dir($this->dir."/".$file)) 
      { 
       //echo $file.'<br />'; 
       $deldir = opendir($this->dir."/".$file); 
       while (($filedel = readdir($deldir)) !== false) 
       { 
        if(strpos($this->dir."/".$file."/".$filedel, '_big.') !== false || strpos($this->dir."/".$file."/".$filedel, '_thumb.') !== false || strpos($this->dir."/".$file."/".$filedel, '_thumb2.') !== false || strpos($this->dir."/".$file."/".$filedel, '_top.') !== false) 
        { 
         unlink($this->dir."/".$file."/".$filedel); 
        } 
       } 
      } 
     } 
     closedir($dh); 
    } 
} 

$batch = new ResizeImages; 


?> 

Répondre

2

Au sommet ajouter ceci:

error_reporting(E_ALL); 

Et essayez de changer ceci:

$im = ImageCreateFromJPEG ($img) or // Read JPEG Image 
$im = ImageCreateFromPNG ($img) or // or PNG Image 
$im = ImageCreateFromGIF ($img) or // or GIF Image 
$im = false; // If image is not JPEG, PNG, or GIF 

à ceci:

$im = ImageCreateFromString(file_get_contents($img)); 

at-il aidé? Y a-t-il aussi un motif sur les images corrompues? Sont-ils tous du même type?

+0

Tnx, this error_reporting (E_ALL); aidé, semble ini_set ('display_errors', 'on'); n'a pas fait l'affaire. J'ai eu quelques erreurs que j'ai corrigées, merci. – dfilkovi

1

Eh bien, la première chose serait de supprimer la suppression d'erreur pour voir s'il y a des erreurs. Voyant certains de votre code pourrait être utile aussi bien.

EDIT Ok, trop tard pour résoudre votre problème, mais voici une autre suggestion pour votre code. Tout ce "readdir, décider si le fichier, construire le chemin" est juste une douleur à utiliser (et à regarder). Essayez ceci pour une alternative:

class ImageFilterIterator extends FilterIterator 
{ 
    public function accept() 
    { 
     $ext = pathinfo($this->current()->getRealPath(), PATHINFO_EXTENSION); 
     return stripos('.gif|.jpg|.png', $ext); 
    } 
} 

$path = '.'; 
$images = new ImageFilterIterator(
       new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($path))); 

Iterators sont de la SPL et alors qu'ils sont un peu déroutante à utiliser dans un premier temps, ils peuvent faire du développement beaucoup plus facile une fois que vous avez compris. Avec ce qui précède, vous pouvez maintenant boucle sur image $ et obtenez tous les noms se terminant par .gif, .jpg ou .png de tous les répertoires ci-dessous chemin, comme celui-ci:

foreach($images as $image) { 
    echo $image; 
} 

En fait, l'image $ est non seulement une chaîne , mais un objet SplFileInfo, donc vous obtenez également un tas d'autres méthodes utiles avec elle.

+0

Source ajoutée à l'article – dfilkovi

Questions connexes