Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Не удается добавить в файл картинку,уменьшенную с помощью imagecopyresampled
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Не удается добавить в файл картинку,уменьшенную с помощью imagecopyresampled

Страниц (1): [1]
 

1. mmmoi09 - 26 Июня, 2012 - 15:51:58 - перейти к сообщению
Сделал форму для загрузки картинок на сервер в заданную дирректорию и соответствующую функцию.
Так же понадобилось делать уменьшенные копии фото для вывода в фотогалерее.
Делал все стандартными методами
//$filename -путь к исходному изображению
//$dir_to_save - путь к папке,в которую будет помещаться уменьшенная копия //изображения
//$w = 200 - ширина уменьшаемой копии
//$quality = 100 - качество для jpeg
function resizeImg($filename,$dir_to_save,$w = 200,$quality = 100){


list($width,$height,$type) = getimagesize($filename);
if (!$width || !$height) {
echo 'Невозможно получить длину и ширину изображения';
return;
}
//проверяем тип изображения создаем новое изображение из старого
$types = array('','gif','jpeg','png');
$ext = $types[$type];
if ($ext) {
$func = 'imagecreatefrom'.$ext;
$scr_img = $func($filename);
} else {
echo 'Некорректный формат файла';
return;
}

//получаем размер оригинального изображения
$newWidth = $w;
$koefficient = $width/$w ;
$newHeight = $height/$koefficient ;

//создаем пустое изображение с новыми шириной и высотой
$newSizeImg = imagecreatetruecolor($newWidth, $newHeight);

//копируем исходное изображение в новое с заданными шириной и высотой без потери качества
imagecopyresampled($newSizeImg, $scr_img, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);


if(!file_exists($dir_to_save)){
mkdir("$dir_to_save", 777,true);}

//Создаем изображение

if ($type == 2) {
return imagejpeg($newSizeImg,$dir_to_save, $quality);
} else {
$func = 'image'.$ext;
return $func($newSizeImg,$dir_to_save);
}


// Освобождаем память
imagedestroy($scr_img);
}


В браузере выдает ошобку
Warning: imagejpeg() [function.imagejpeg]: Unable to open 'img_small/' for writing: Permission denied in C:\Users\Public\www\htdocs\photogalery\form.php on line 45

Попробовал посмотреть,что приходит в функцию imagejpeg($newSizeImg,$dir_to_save, $quality); в переменную $newSizeImg,в которой должен быть файл для сохранения
Туда приходит echo $newSizeImg ;// Resource id #7

Ниндзя
Что за Resource id #7 и может поэтому не сохраняется уменьшенная картиинка ????
2. fdr21 - 26 Июня, 2012 - 16:44:27 - перейти к сообщению
Цитата:
Что за Resource id #7 и может поэтому не сохраняется уменьшенная картиинка ????

так и должно быть.
Цитата:
PHP:
скопировать код в буфер обмена
  1. return imagejpeg($newSizeImg,$dir_to_save, $quality);

imagejpeg - второй параметр должен быть имя файла, а не папки!
3. mmmoi09 - 26 Июня, 2012 - 17:00:13 - перейти к сообщению
Путь для сохранения файла
Никакие манипуляции с написанием этого пути не помогают .
Все равно возникает ошибка
Warning: imagejpeg() [function.imagejpeg]: Unable to open ....for writing: Permission denied in ....
4. fdr21 - 26 Июня, 2012 - 17:07:01 - перейти к сообщению
пропешите туда для отладки просто, - image.jpg.
проверти права доступа скрипта на запись!!!
5. Alho - 26 Июня, 2012 - 17:08:40 - перейти к сообщению
Права на папку должны быть 777.
6. mmmoi09 - 26 Июня, 2012 - 17:12:37 - перейти к сообщению
Alho пишет:
Права на папку должны быть 777.

А как их проверить,права то?
Я работаю на локальной машине под виндовс7 ?
7. fdr21 - 26 Июня, 2012 - 17:30:02 - перейти к сообщению
попробуйте убрать вот это все, так по мне не должно быть.
PHP:
скопировать код в буфер обмена
  1. if(!file_exists($dir_to_save)){
  2.  mkdir("$dir_to_save", 777,true);}
  3.  
  4.  //Создаем изображение
  5.  
  6.  if ($type == 2) {
  7.  return imagejpeg($newSizeImg,$dir_to_save, $quality);
  8.  } else {
  9.  $func = 'image'.$ext;
  10.  return $func($newSizeImg,$dir_to_save);
  11.  }


на ...
PHP:
скопировать код в буфер обмена
  1. imagejpeg($newSizeImg,'image_' . uniqid() . '.jpg');
  2. imagedestroy($scr_img);
  3. imagedestroy($newSizeImg);
  4.  
8. mmmoi09 - 26 Июня, 2012 - 18:01:01 - перейти к сообщению
fdr21 пишет:
на ...
PHP:
скопировать код в буфер обмена

imagejpeg($newSizeImg,'image_' . uniqid() . '.jpg');
imagedestroy($scr_img);
imagedestroy($newSizeImg);


Спасибо большое.
Такой способ решает проблему.Ключевым фактором ,наверное,тут послужила функция uniqid()
Единственное ,что не ясно,почему же не работают стандартные записи путей вида photogalery/img_small/ .Ведь в интернете полно подобных примеров.
И еще проблема в том,что хотелось,чтобы имя уменьшенного изображения копировалось с оригинала (только,естественно,сохранялось в другой папке)
(Добавление)
fdr21

большое спасибо,что нашли время и желание помоч Улыбка
Все-таки не правильно я прописывал путь и имя для сохранения файла в функции imagejpeg()
(Добавление)
Не могу понять,почему я присваиваю переменной путь
if($_FILES){
$basename = basename($_FILES['uploadimg']['name']);
$dir_to_save_img_small = "img_small/" .$basename;
//передаю путь для сохранения уменьшенного файла в функцию
resizeImg($this_save_img,$dir_to_save_img_small);

но в функцию попадает другой путь C:/Users/Public/www/htdocs/photogalery/img/IMG_1696.JPG

а вне функции $dir_to_save_img_small выводим и получается img_small/IMG_1696.JPG

Как так путь переданный в функцию приображается?

 

Powered by ExBB FM 1.0 RC1