php调整大小图像脚本

时间:2009-12-19 15:33:14

标签: php gd

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

编辑:

这是代码,并且我也禁用了错误输出,因为没有任何错误,我认为禁用错误输出会禁用此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 个答案:

答案 0 :(得分: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));

有帮助吗?损坏的图像上还有任何图案吗?它们都是同一类型吗?

答案 1 :(得分: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虽然起初使用它们有点令人费解,但一旦你理解了它们,它们就可以使开发变得更加容易。通过上面的内容,您现在可以遍历$ image并从路径下的所有目录中获取以.gif,.jpg或.png结尾的所有文件名,如下所示:

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

实际上,$ image不仅仅是一个字符串,而是一个SplFileInfo对象,所以你也可以得到一堆有用的其他方法。