|
|
|
| Добрый день, при именении размера изображения формата GIF получаю ошибки:
Warning: imagecreatefromgif() [function.imagecreatefromgif]: '1.gif' is not a valid GIF file in 1.php on line ...
Строка: $images_src = ImageCreateFromGIF ($images_url);
Warning: imagecopyresampled() expects parameter 2 to be resource, boolean given in 1.php on line ...
Строка: ImageCopyResampled ($images_dst, $images_src, 0, 0, 0, 0, $images_resize_full, $images_new_h, $images_iw_full, $images_ih);
Warning: imagedestroy() expects parameter 1 to be resource, boolean given in 1.php on line ...
Строка: imagedestroy($images_src);
|
Собственно пример кода которым все это действие пытается произойти:
<?php
$images = $_FILES['images']['tmp_name'];
if ($_FILES['images']['type'] == 'image/gif') { $user_images = '.gif'; }
elseif ($_FILES['images']['type'] == 'image/jpeg') { $user_images = '.jpg'; }
elseif ($_FILES['images']['type'] == 'image/png') { $user_images = '.png'; }
else { $user_images = '';}
$images_id = 1;
$images_url = $images_id.$user_images;
move_uploaded_file($images, $images_url);
$images_resize_full = 250;
$images_resize_arr = GetImageSize ($images_url);
if($user_images == '.jpg') {
$images_src = ImageCreateFromJPEG ($images_url);
} elseif ($user_images == '.gif') {
$images_src = ImageCreateFromGIF ($images_url);
} elseif ($user_images == '.png') {
$images_src = ImageCreateFromPNG ($images_url);
}
$images_iw_full = $images_resize_arr[0];
$images_ih = $images_resize_arr[1];
$images_koe = $images_iw_full/$images_resize_full;
$images_new_h = ceil ($images_ih/$images_koe);
$images_dst = ImageCreateTrueColor ($images_resize_full, $images_new_h);
ImageCopyResampled ($images_dst, $images_src, 0, 0, 0, 0, $images_resize_full, $images_new_h, $images_iw_full, $images_ih);
if($user_images == '.jpg') {
ImageJPEG ($images_dst, $images_url, 90);
} elseif ($user_images == '.gif') {
ImageGIF ($images_dst, $images_url, 90);
} elseif ($user_images == '.png') {
ImagePNG ($images_dst, $images_url);
}
imagedestroy($images_src);
?>
|
В чем заключается моя ошибка?
Спасибо. | |
|
|
|
|
|
|
|
для: ZetRider
(05.07.2012 в 15:18)
| | Во-первых - проверка по $_FILES['images']['type'], это полная туфта.
Во-вторых - $_FILES['images']['tmp_name'], это временный файл имеющий постоянное расширение независящее от типа загруженного файла, и приклеивать к нему расширение, как вы пытаетесь, не надо. | |
|
|
|
|
|
|
|
для: confirm
(05.07.2012 в 15:40)
| | в этом коде нет проверки файла, это выдранный кусок кода
по type проверяем чтобы просто узнать расширение, после того как удостоверились, что это изображение
Хорошо, не надо, но все такие в почему ругается GIF ? | |
|
|
|
|
|
|
|
для: ZetRider
(05.07.2012 в 15:50)
| | Что-то невнимательный я сегодня. )
Потому, что файл ваш невалидный, судя по ошибке. И каким это образом вы хотите сохранить gif с компрессией 90%? Нет у gif формата компрессии, и функция imagegif() может принимать максимум два аргумента. Формат GIF можно уменьшить только за счет уменьшения цветов в его палитре.
Я вам написал как лучше в данном случае поступать, повторю еще раз, с вложением условий:
<?
if(!$_FILES['images']['error']) {
//тут проверки по условию, если нужны
$ext = array(1=>'.gif', '.jpg', '.png');
$type = getimagesize($_FILES['images']['tmp_name']);
if(array_key_exists($type[1]), $ext) { //изображение
$img = file_get_contets($_FILES['images']['tmp_name']);
if($img = imagecreatefromstring($img)) { //если ДЕЙСТВИТЕЛЬНО изображение
//ресайз
//сохранение
switch($type[1]) {
case 1: imagegif($img, $name); //оригинал
imagegif($small, $name); //эскиз
break;
case 2: imagejpeg($img, $name, $quality); //оригинал
imagejpeg($small, $name, $quality); //эскиз
break;
case 3: imagepng($img, $name, $level, $filters); //оригинал
imagepng($small, $name, $level, $filters); //эскиз
}
} //иначе мусор
} //не изображение или недопустимый его тип
}
| В этом случае вы гарантировано сохраните у себя изображения. Иначе вы сохраняете на сервере сперва, а это может быть далеко не картинка, потом загружаете и начинаете изголяться над... | |
|
|
|
|
|
|
|
для: ZetRider
(05.07.2012 в 15:18)
| | Вынужден новое написать, запутался в ваших переменных.
Первое остается в силе (насчет проверки).
А загрузку делать так:
<?
if(!$_FILES['images']['error']) {
//getimagesize - ее используете, а она ведь возвращает тип изображения
//и это куда более лучшая проверка, нежели ['images']['type'],
//которая основывается на расширении файла
$ext = array(
1=>array('ext'=>'.gif','mime'=>'image/gif'),
array('ext'=>'.jpg','mime'=>'image/jpeg'),
array('ext'=>'.png','mime'=>'image/png')
);
$type = getimagesize($_FILES['images']['tmp_name']);
if(array_key_exists($type[1]), $ext) { //изображение
$img = file_get_contets($_FILES['images']['tmp_name']);
$img = magecreatefromstring($img); //выбросит все добавки
//делаем нужное
//если надо сохраняем и оригинал
//руководствуясь $type[1]
//и все из $img
}
}
|
| |
|
|
|
|
|
|
|
для: confirm
(05.07.2012 в 16:03)
| | Как Вам такой вариант?
<?php
function my_images_resize($file_input, $file_output, $w_o, $h_o) {
list($w_i, $h_i, $type) = getimagesize($file_input);
if (!$w_i || !$h_i) {
echo 'Невозможно получить длину и ширину изображения';
return;
}
$types = array('','gif','jpeg','png');
$ext = $types[$type];
if ($ext) {
$func = 'imagecreatefrom'.$ext;
$img = $func($file_input);
} else {
echo 'Некорректный формат файла';
return;
}
if (!$h_o) $h_o = $w_o/($w_i/$h_i);
if (!$w_o) $w_o = $h_o/($h_i/$w_i);
$img_o = imagecreatetruecolor($w_o, $h_o);
imagecopyresampled($img_o, $img, 0, 0, 0, 0, $w_o, $h_o, $w_i, $h_i);
if ($type == 2) {
return imagejpeg($img_o,$file_output,100);
} else {
$func = 'image'.$ext;
return $func($img_o,$file_output);
}
}
?>
|
| |
|
|
|
|
|
|
|
для: ZetRider
(10.07.2012 в 13:49)
| | echo 'Невозможно получить длину и ширину изображения'; - это вообще зачем?
И чем хорошо ваш вариант? | |
|
|
|
|
|
|
|
для: confirm
(10.07.2012 в 14:03)
| | Да чтож вы к echo прикопались, этот код как пример добавлен..
сама проверка файлов происходит примерно так:
<?php
function check_upload_images($input_name='') {
$images = $input_name['tmp_name'];
$getimagesize = getimagesize($images);
$mime_type = $getimagesize['mime'];
$wh_mime = array(
'image/gif',
'image/jpeg',
'image/png'
);
if ( !in_array($mime_type,$wh_mime) ) {
return "<li>Неверный формат! Доступные для загрузки форматы: *.gif *.jpg *.png</li>";
} else {
return 'ok';
}
}
?>
|
Вообщем ошибку понял почему ругался на gif, спасибо. | |
|
|
|
|
|
|
|
для: ZetRider
(10.07.2012 в 14:13)
| | Я ни к чему не докапываюсь, но вы же код показываете и спрашиваете. Вот отсюда и вопрос - а к чему такая информация?
Изображение имеет заголовок, именно из него функция getimagesize() получает информацию. Но то, что заголовок валидный, еще совсем не означает, что структура изображения таковая.
Вашему коду не составляет труда скормить мусор, на который он во многих местах обязан будет плеваться ошибками.
И еще - вы хоть головой об стену, а GD будет работать со всеми форматами файла в своем внутреннем представлении - gd-формате. Другими словами, функции GD для открытия файлов того или иного формата, это всего лишь загрузчики по "определенному формату". | |
|
|
|
|
|
|
|
для: confirm
(10.07.2012 в 14:30)
| | >> Вашему коду не составляет труда скормить мусор, на который он во многих местах обязан будет плеваться ошибками.
Как Вы боритесь с этим? | |
|
|
|
|
|
|
|
для: ZetRider
(10.07.2012 в 14:52)
| | Пытаться прочесть данные файла описанные форматом - если прочитаны, значит 99% искомое. 1% на то, что искомое может быть халтурой, но такое надо специально устраивать.
При этом стараться открывать так "как предписывает расширение" нет никакой необходимости. Про весь этот зоопарк расширений можно забыть, так как задача в конечном итоге одна - открыть ресурс.
Вы же изначально верите расширению и заголовкам, а потом пытаетесь прочесть. | |
|
|
|
|