2009-12-19 238 views
1

我正在使用目录迭代器来遍历目录,并调整在该目录中找到的图像,我这样做来自浏览器,因为我没有ssh访问该服务器。 大多数图片调整大小,但每10张图片(或多或少)我得到jiberish数据。 我认为这是一个图片来源。在那个数据总是有一个字符串CREATOR: gd-jpeg v1.0所以我想知道这是什么?我用@ sign禁用了任何错误输出。php调整大小图像脚本

编辑:

下面是代码的,也是我禁用错误输出的原因没有任何错误,我认为禁用错误输出将禁用此jiberish数据,但数据显示不管。

代码:

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


?> 

回答

2

在顶部加入这样的:

error_reporting(E_ALL); 

,试着改变这样的:

$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 

要这样:

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

有没有帮助?还有损坏的图像上有任何模式?他们都是同一类型吗?

+0

Tnx,this error_reporting(E_ALL);似乎ini_set('display_errors','on');没有做到这一点。 我有一些错误,我修好了,谢谢。 – dfilkovi 2009-12-19 16:27:25

1

好了,第一件事是删除错误抑制,看看是否有任何错误。看到你的一些代码也会有帮助。

编辑 好吧,为时已晚,以解决您的问题,但这里是您的代码的另一个建议。所有这些“readdir,决定文件,构建路径”的东西只是一个使用(和看)的痛苦。尝试此替代:

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来自SPL虽然他们有点令人费解,在首先使用,它们可以使开发更容易,一旦你了解他们。通过以上你现在可以遍历$图像并获得.GIF,.JPG或结束从下面路径中的所有目录png格式,这样所有文件名:

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

事实上,$形象不只是一个字符串,但一个SplFileInfo对象,所以你也得到了一堆有用的其他方法。

+0

来源添加到帖子 – dfilkovi 2009-12-19 15:49:07