PHP изменение размера изображения скрипт - PullRequest
1 голос
/ 19 декабря 2009

Я использую итератор каталогов для перебора каталогов и изменения размера изображений, найденных в этом каталоге, я делаю это из браузера, потому что у меня нет доступа по ssh к этому серверу. Размер большинства изображений изменяется нормально, но для каждых 10 изображений (более или менее) я получаю данные о спаде. Я думаю, что это источник изображения. в этих данных всегда есть строка CREATOR: gd-jpeg v1.0, поэтому мне интересно, что это? Я отключил вывод ошибок с помощью знака @.

EDIT:

Вот код, а также я отключил вывод ошибок, потому что ошибок нет, и я подумал, что отключение вывода ошибок отключило бы эти спорные данные, но данные отображаются независимо от того.

Код:

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

2 голосов
/ 19 декабря 2009

Вверху добавьте это:

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 голос
/ 19 декабря 2009

Ну, во-первых, нужно удалить подавление ошибок, чтобы увидеть, есть ли ошибки. Просмотр вашего кода также может быть полезен.

EDIT Хорошо, слишком поздно, чтобы решить вашу проблему, но вот еще одно предложение для вашего кода. Все эти «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)));

Итераторы из SPL , и, хотя поначалу они немного озадачивают в использовании, они могут значительно упростить разработку, как только вы их поймете. С помощью вышеприведенного вы можете теперь зацикливаться на $ image и получать все имена файлов, заканчивающиеся на .gif, .jpg или .png из всех каталогов ниже пути, например:

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

На самом деле, $ image - это не просто строка, а объект SplFileInfo, так что вы также получите множество других полезных методов.

...