Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Resize Gif
 
 автор: ZetRider   (05.07.2012 в 15:18)   письмо автору
 
 

Добрый день, при именении размера изображения формата 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_src0000$images_resize_full$images_new_h$images_iw_full$images_ih); 
if(
$user_images == '.jpg') {
    
ImageJPEG ($images_dst$images_url90);
} elseif (
$user_images == '.gif') {
    
ImageGIF ($images_dst$images_url90);
} elseif (
$user_images == '.png') {
    
ImagePNG ($images_dst$images_url);
}
imagedestroy($images_src);
?>



В чем заключается моя ошибка?

Спасибо.

  Ответить  
 
 автор: confirm   (05.07.2012 в 15:40)   письмо автору
 
   для: ZetRider   (05.07.2012 в 15:18)
 

Во-первых - проверка по $_FILES['images']['type'], это полная туфта.
Во-вторых - $_FILES['images']['tmp_name'], это временный файл имеющий постоянное расширение независящее от типа загруженного файла, и приклеивать к нему расширение, как вы пытаетесь, не надо.

  Ответить  
 
 автор: ZetRider   (05.07.2012 в 15:50)   письмо автору
 
   для: confirm   (05.07.2012 в 15:40)
 

в этом коде нет проверки файла, это выдранный кусок кода
по type проверяем чтобы просто узнать расширение, после того как удостоверились, что это изображение

Хорошо, не надо, но все такие в почему ругается GIF ?

  Ответить  
 
 автор: confirm   (05.07.2012 в 18:30)   письмо автору
 
   для: 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 
1imagegif($img$name); //оригинал
                    
imagegif($small$name); //эскиз
                    
break;
            case 
2imagejpeg($img$name$quality); //оригинал
                    
imagejpeg($small$name$quality); //эскиз
                    
break;
            case 
3imagepng($img$name$level$filters); //оригинал
                    
imagepng($small$name$level$filters); //эскиз
         

      } 
//иначе мусор
   
//не изображение или недопустимый его тип  
}
В этом случае вы гарантировано сохраните у себя изображения. Иначе вы сохраняете на сервере сперва, а это может быть далеко не картинка, потом загружаете и начинаете изголяться над...

  Ответить  
 
 автор: confirm   (05.07.2012 в 16:03)   письмо автору
 
   для: 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
 
}  
}

  Ответить  
 
 автор: ZetRider   (10.07.2012 в 13:49)   письмо автору
 
   для: 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$img0000$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);
    }
}
?>

  Ответить  
 
 автор: confirm   (10.07.2012 в 14:03)   письмо автору
 
   для: ZetRider   (10.07.2012 в 13:49)
 

echo 'Невозможно получить длину и ширину изображения'; - это вообще зачем?
И чем хорошо ваш вариант?

  Ответить  
 
 автор: ZetRider   (10.07.2012 в 14:13)   письмо автору
 
   для: 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, спасибо.

  Ответить  
 
 автор: confirm   (10.07.2012 в 14:30)   письмо автору
 
   для: ZetRider   (10.07.2012 в 14:13)
 

Я ни к чему не докапываюсь, но вы же код показываете и спрашиваете. Вот отсюда и вопрос - а к чему такая информация?
Изображение имеет заголовок, именно из него функция getimagesize() получает информацию. Но то, что заголовок валидный, еще совсем не означает, что структура изображения таковая.
Вашему коду не составляет труда скормить мусор, на который он во многих местах обязан будет плеваться ошибками.
И еще - вы хоть головой об стену, а GD будет работать со всеми форматами файла в своем внутреннем представлении - gd-формате. Другими словами, функции GD для открытия файлов того или иного формата, это всего лишь загрузчики по "определенному формату".

  Ответить  
 
 автор: ZetRider   (10.07.2012 в 14:52)   письмо автору
 
   для: confirm   (10.07.2012 в 14:30)
 

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

Как Вы боритесь с этим?

  Ответить  
 
 автор: confirm   (10.07.2012 в 15:09)   письмо автору
 
   для: ZetRider   (10.07.2012 в 14:52)
 

Пытаться прочесть данные файла описанные форматом - если прочитаны, значит 99% искомое. 1% на то, что искомое может быть халтурой, но такое надо специально устраивать.
При этом стараться открывать так "как предписывает расширение" нет никакой необходимости. Про весь этот зоопарк расширений можно забыть, так как задача в конечном итоге одна - открыть ресурс.
Вы же изначально верите расширению и заголовкам, а потом пытаетесь прочесть.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования