Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обработка больших изображений GD

364
09 декабря 2008 года
Xupypr
148 / / 20.04.2000
Господа, подскажите пожалуйста в чем может быть проблема.

Есть скрипт, который закачивает изображение, меняет его размер, если оно больше определенного, сохраняет и пишет в бд.

Все здорово, если не одно НО. Все хорошо работает для небольших файлов, а народ заливает фотки с цифровиков... порядка 1.5, 2 и более мб. порядка 3000х3000пх... И скрипт не срабатывает =(.. т.е. он заливает файл, записывает в базу и даже (что самое странно!!) создает превью!! ...

Возможно проблема в том, что превью - это сторонний файл, а при уменьшении пишет в тот же и просто не заменяет старый.

функция закачки

Код:
function make_prev ($dir_file, $file_name, $w_pix, $h_pix, $type_res, $type_media, $remove) {
// превью

$output = '';
        if (!copy ($file_name,$dir_file)) $output = '';


        $up_pix_size = GetImageSize($dir_file);


$up_pix_resize1 = $up_pix_size[0];
$up_pix_resize2 = $up_pix_size[1];


    if ($up_pix_size[0]>=$up_pix_size[1]) {
        if ($up_pix_size[0] >= $w_pix) {
            $resize_k = $up_pix_size[0]/$up_pix_size[1];
            $up_pix_resize1 = $w_pix;
            $up_pix_resize2 = $up_pix_resize1 / $resize_k;
        }
    }
    if ($up_pix_size[0]<=$up_pix_size[1]) {
        if ($up_pix_size[1] >= $h_pix) {
            $resize_k = $up_pix_size[1]/$up_pix_size[0];
            $up_pix_resize2 = $h_pix;
            $up_pix_resize1 = $up_pix_resize2 / $resize_k;
        }

    }



$pix_up = 0;
$pix_left = 0;

if ($type_res==1) {
    $pix_up =  (($h_pix/2) - ($up_pix_resize2/2));
    $pix_left = (($w_pix/2) - ($up_pix_resize1/2));
    }

       
//echo (filetype($dir_file));

if (($type_media == 'jpeg') || ($type_media == 'jpg')) $up_pix_resize_in = ImageCreateFromjpeg ($dir_file);
if ($type_media == 'gif') $up_pix_resize_in = ImageCreateFromgif ($dir_file);
if ($type_media == 'png') $up_pix_resize_in = ImageCreateFrompng ($dir_file);

if ($type_res==1) { $up_pix_resize1_1 = $w_pix; $up_pix_resize2_2 = $h_pix; } else
{$up_pix_resize1_1 = $up_pix_resize1; $up_pix_resize2_2 = $up_pix_resize2; }

// создается новый файл, и задается его размер
        $up_pix_resize_out = imagecreatetruecolor($up_pix_resize1_1, $up_pix_resize2_2);
        $background = imagecolorallocate($up_pix_resize_out, 254, 254, 254);



// Копируем закаченное изображение, увеличив его
        ImageCopyResized ($up_pix_resize_out, $up_pix_resize_in, $pix_left, $pix_up, 0, 0, $up_pix_resize1, $up_pix_resize2, $up_pix_size[0], $up_pix_size[1] );

if ($remove==1) {
 unlink($dir_file);

 $dir_file = explode($type_media,$dir_file);

 $dir_file =  $dir_file[0].'jpg';
}

        imagejpeg ($up_pix_resize_out, $dir_file, 95);

        ImageDestroy($up_pix_resize_in);
        ImageDestroy($up_pix_resize_out);


    chmod($file_name, 0774);

//------------
$output = $dir_file;

return $output;

}
24K
09 декабря 2008 года
ostgals
53 / / 27.08.2007
Цитата: Xupypr
Есть скрипт, который закачивает изображение, меняет его размер, если оно больше определенного, сохраняет и пишет в бд.

И скрипт не срабатывает =(.. т.е. он заливает файл, записывает в базу и даже (что самое странно!!) создает превью!! ...



Типа, "не работает, но работает"?
Поконкретнее, что он еще должен делать, но не делает?

Цитата: Xupypr
Возможно проблема в том, что превью - это сторонний файл, а при уменьшении пишет в тот же и просто не заменяет старый.



Что значит сторонний? В "тот же" - это в какой?


Код, в принципе, рабочий и даже понятный, хотя вполне реально было бы сделать его в три раза короче. Только непонятно, что именно не работает. :)

364
10 декабря 2008 года
Xupypr
148 / / 20.04.2000
Вообщем-то все просто. Данный скрипт создает превью изображения + преобразует из различных форматов в jpg... и в принципе работает.

Все изображения делаются из одного. т.е. человек закачивает фото и соответственно все делается из него.

Проблема заключается в следующем. После закачки этого основного изображения оно само не уменьшается (хотя должно), если оно большого размера (де-то больше 1 мегабайта), если меньше, то уменьшается, но даже при больших размерах превью создаются.

Кину скрипт закачки пожалуй.

Код:
function upload_img($dir_file, $fn, $file_name, $w_pix, $h_pix, $type_media) {

$output = '';

$dirrr=$dir_file."/";
$dirrr2=$dir_file."/pr/";


    if ((isset($fn)) and ($fn != "")) {

        $fn_name2 = $file_name.'.'.$type_media.'';
        $fn_name_JPG = $file_name.'.jpg';


$uploadfile = $dirrr.$fn_name2;


if (move_uploaded_file($fn, $uploadfile))
            $output = $fn_name2;
        else
            $output = 'Невозможно закачать файл';

// вот тут из закаченного делаем картинку не больше 800х800      
        $new_file = make_prev ($uploadfile, $uploadfile, 800, 800, 0, $type_media, 1);

// вот тут из закаченного делаем превью размером $w_pix, $h_pix
        make_prev ($dirrr2.$fn_name_JPG, $new_file, $w_pix, $h_pix, 0, 'jpg', 0);

    } else {
        $output = 'Файл не выбран';
    }

return $output;
}



Если есть более простой способ уменьшения изображения, киньте текст, попробую его.
25K
10 декабря 2008 года
mdrm
37 / / 26.05.2008
может быть у php не хватает памяти, чтобы обработать большое изображение?
Увеличить размер памяти для php из скрипта можно так:
ini_set('memory_limit', '32M');
если 32М мало, то можно увеличить.
364
10 декабря 2008 года
Xupypr
148 / / 20.04.2000
Цитата: mdrm
может быть у php не хватает памяти, чтобы обработать большое изображение?
Увеличить размер памяти для php из скрипта можно так:
ini_set('memory_limit', '32M');
если 32М мало, то можно увеличить.



Хм... как вариант. Спасибо, попробую.

364
10 декабря 2008 года
Xupypr
148 / / 20.04.2000
Похоже проблема именно в создании изображения
ImageCreateFromjpeg ($dir_file);

Видимо действительно памяти не хватает на обработку большого изображения.
ini_set('memory_limit', '32M'); не помогло. =((

делаю после ini_set get_cfg_var('memory_limit') ... выдает 16M
714
10 декабря 2008 года
clgs
226 / / 29.10.2008
Я позволил себе под редактировать твою функцию (для своих нужд)

Код:
//-------------------------------------------
// Функция меняет ширину и высоту
// $file - имя файла
// $x - ширина, по умолчанию 800
// $y - высота, по умолчанию 600
// $p - сохранить пропорции, по умолчанию "да"
//-------------------------------------------
function make_prev($file, $x=800, $y=600, $p=1) {
    include_once('lib/images.php');
    // проверяем на наличие файла
    if(!file_exists($file)) return "файл не найден";
    // попытка открытия
    if(!$up_pix_resize_in=_ImCreate($file)) return "ошибка открытия файла";
    $im=$up_pix_resize_in[0]; // идендекс
    //$im=$up_pix_resize_in[1]; // тип (jpeg,gif,png,....)

    $up_pix_size = GetImageSize($file); // получаем исходные размеры
    $Sx=$up_pix_size[0]; // ширина
    $Sy=$up_pix_size[1]; // высота

    if($p) {
        if ($Sx>=$Sy && $Sx>=$x) {
            $Sx = $x;
            $Sy = $Sx/($up_pix_size[0]/$up_pix_size[1]);
        }
        elseif ($Sx<=$Sy && $Sy>=$y) {
            $Sy = $y;
            $Sx = $Sy/($up_pix_size[1]/$up_pix_size[0]);
        }
    } else {
        $Sx=$x;
        $Sy=$y;
    }
    //echo (filetype($dir_file));

    // создаем новый холст
    $im_new = imagecreatetruecolor($Sx, $Sy);
    $background = imagecolorallocate($im_new, 254, 254, 254);

    // Копируем закаченное изображение, увеличив его
    ImageCopyResized($im_new, $im, 0, 0, 0, 0, $Sx, $Sy, $up_pix_size[0], $up_pix_size[1] );

    // сохроняем файл
    imagejpeg($im_new, $file, 95);

    // особождаем память
    ImageDestroy($im);
    ImageDestroy($im_new);

    // прова доступа
    chmod($file, 0774);

    return TRUE;
}


Файл lib/images.php
Код:
//-------------------------------------------
// $file - имя файла
// возврашает массив(идендекс,тип) или FALSE
//-------------------------------------------
function _ImCreate($file) {
        # JPEG:
       $im=@imagecreatefromjpeg($file);
        if($im!==FALSE) return array($im,'jpeg');
        # GIF:
       $im=@imagecreatefromgif($file);
        if($im!==FALSE) return array($im,'gif');
        # PNG:
       $im=@imagecreatefrompng($file);
        if($im!==FALSE) return array($im,'png');
        # GD File:
       $im=@imagecreatefromgd($file);
        if($im!==FALSE) return array($im,'gd');
        # GD2 File:
       $im=@imagecreatefromgd2($file);
        if($im!==FALSE) return array($im,'gd2');
        # WBMP:
       $im=@imagecreatefromwbmp($file);
        if($im!==FALSE) return array($im,'bmp');
        # XBM:
       $im=@imagecreatefromxbm($file);
        if($im!==FALSE) return array($im,'xbm');
        # XPM:
       $im=@imagecreatefromxpm($file);
        if($im!==FALSE) return array($im,'xpm');
        # Попытка открыть со строки:
       $im=@imagecreatefromstring(file_get_contents($file));
        if($im!==FALSE) return array($im,'string');
        return false;
}


А обращаюсь так
 
Код:
// делаем картинку не больше 800х800    
            if(!make_prev($filename)) return "не могу изменить размеры";


на счет памяти, я устанавливаю так перед выполнением
 
Код:
ini_set('memory_limit', '64M');
что позволяет 1,77Mb редактировать, пробовал еще 6,5Mb но тут уже Apache ругается)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог