tags:

views:

224

answers:

2

I am using directory iterator to iterate through directories and resize images found in that directory, I am doing this from browser cause I don't have ssh access to that server. Most pictures resize fine but for every 10 pictures (more or less) I get jiberish data out. I think it's a picture source. in that data there is always a string CREATOR: gd-jpeg v1.0 so I'm wondering what is this? I disabled any error output with @ sign.

EDIT:

Here is the code, and also I disabled error output cause there aren't any errors and I thought that disabling error output would disable this jiberish data, but data is displayed no matter.

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;


?>
+1  A: 

Well, the first thing would be to remove the error suppression to see if there is any errors. Seeing some of your code could be helpful as well.

EDIT Ok, too late to fix your problem, but here is another suggestion for your code. All that "readdir, decide if file, build path" stuff is just a pain to use (and look at). Try this for an 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 are from the SPL and while they are somewhat puzzling to use at first, they can make development much easier once you understood them. With the above you can now loop over $image and get all filenames ending in .gif, .jpg or .png from all directories below path, like this:

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

In fact, $image is not just a string, but an SplFileInfo object, so you also get a bunch of useful other methods with it.

Gordon
Source added to post
dfilkovi
+2  A: 

At the top add this:

error_reporting(E_ALL);

And try changing this:

$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

To this:

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

Did it help? Also is there any pattern on the corrupted images? Are they all of the same type?

Alix Axel
Tnx, this error_reporting(E_ALL); helped, seems ini_set('display_errors', 'on'); didn't do the trick.I had some errors I fixed, thank you.
dfilkovi