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;
}
Обработка больших изображений GD
Есть скрипт, который закачивает изображение, меняет его размер, если оно больше определенного, сохраняет и пишет в бд.
Все здорово, если не одно НО. Все хорошо работает для небольших файлов, а народ заливает фотки с цифровиков... порядка 1.5, 2 и более мб. порядка 3000х3000пх... И скрипт не срабатывает =(.. т.е. он заливает файл, записывает в базу и даже (что самое странно!!) создает превью!! ...
Возможно проблема в том, что превью - это сторонний файл, а при уменьшении пишет в тот же и просто не заменяет старый.
функция закачки
Код:
Цитата: Xupypr
Есть скрипт, который закачивает изображение, меняет его размер, если оно больше определенного, сохраняет и пишет в бд.
И скрипт не срабатывает =(.. т.е. он заливает файл, записывает в базу и даже (что самое странно!!) создает превью!! ...
И скрипт не срабатывает =(.. т.е. он заливает файл, записывает в базу и даже (что самое странно!!) создает превью!! ...
Типа, "не работает, но работает"?
Поконкретнее, что он еще должен делать, но не делает?
Цитата: Xupypr
Возможно проблема в том, что превью - это сторонний файл, а при уменьшении пишет в тот же и просто не заменяет старый.
Что значит сторонний? В "тот же" - это в какой?
Код, в принципе, рабочий и даже понятный, хотя вполне реально было бы сделать его в три раза короче. Только непонятно, что именно не работает. :)
Все изображения делаются из одного. т.е. человек закачивает фото и соответственно все делается из него.
Проблема заключается в следующем. После закачки этого основного изображения оно само не уменьшается (хотя должно), если оно большого размера (де-то больше 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;
}
$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;
}
Если есть более простой способ уменьшения изображения, киньте текст, попробую его.
Увеличить размер памяти для php из скрипта можно так:
ini_set('memory_limit', '32M');
если 32М мало, то можно увеличить.
Цитата: mdrm
может быть у php не хватает памяти, чтобы обработать большое изображение?
Увеличить размер памяти для php из скрипта можно так:
ini_set('memory_limit', '32M');
если 32М мало, то можно увеличить.
Увеличить размер памяти для php из скрипта можно так:
ini_set('memory_limit', '32M');
если 32М мало, то можно увеличить.
Хм... как вариант. Спасибо, попробую.
ImageCreateFromjpeg ($dir_file);
Видимо действительно памяти не хватает на обработку большого изображения.
ini_set('memory_limit', '32M'); не помогло. =((
делаю после ini_set get_cfg_var('memory_limit') ... выдает 16M
Код:
//-------------------------------------------
// Функция меняет ширину и высоту
// $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;
}
// Функция меняет ширину и высоту
// $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;
}
// $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 "не могу изменить размеры";
if(!make_prev($filename)) return "не могу изменить размеры";
на счет памяти, я устанавливаю так перед выполнением
Код:
ini_set('memory_limit', '64M');