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

Форум PHP

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

 

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

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

тема: Проверка GIF - рисунка на анимацию
 
 автор: Artemy   (14.02.2006 в 17:25)   письмо автору
 
 

Задача: проверить GIF - изображение на присутствие в ней анимации!
Вопрос: как это сделать средствами РНР?

Просто при использовании фотогалереи разработчиков этого сайта, возникают проблемы при загрузке анимированых gif - изображений.

   
 
 автор: Artemy   (15.02.2006 в 10:13)   письмо автору
 
   для: Artemy   (14.02.2006 в 17:25)
 

Господин Голышев, может Вы мне поможете?

   
 
 автор: Artemy   (15.02.2006 в 14:26)   письмо автору
 
   для: Artemy   (15.02.2006 в 10:13)
 

Хелп?

   
 
 автор: Artemy   (15.02.2006 в 16:13)   письмо автору
 
   для: Artemy   (15.02.2006 в 14:26)
 

Хоть бы кто ответил, что не знает?

   
 
 автор: elenaki   (15.02.2006 в 16:30)   письмо автору
 
   для: Artemy   (15.02.2006 в 16:13)
 

а какие проблемы возникают при загрузке gif? он не грузится вообще? или перестает
дрыгаться? может, это из-за функций resize? я, если честно, галерею скачала, но не
смотрела еще, руки не дошли. но, по-моему, gif что анимированный, что нет - никакой
разницы...

или из-за водяных знаков... вот тут - в последней строке....
===============================
PhotoWatermark.Professional.6.0.3.3.Retail.With.Frames
Обновилась до версии 6.0.3.3 программа для нанесения водяных знаков на изображения. В своём роде можно сказать занимает лидирующие позиции. Мoжно делать массовое наношение, то есть выбираем папку и помечаем все изображения в ней своим водяным значком. Можно также добавить дату, что может хорошо помочь при выставлении даты на фотографиях. В новой версии исправлены баги связаные с сохранением анимированых gif файлов.

   
 
 автор: Artemy   (15.02.2006 в 17:10)   письмо автору
 
   для: elenaki   (15.02.2006 в 16:30)
 

Некоторые анимированные гифки копируются, а не которые нет!
Хотелось бы проверять загружаемые изображения на наличие анимации.

   
 
 автор: Trianon   (15.02.2006 в 20:53)   письмо автору
 
   для: Artemy   (15.02.2006 в 17:10)
 

Для этого придется самому разобрать содержимое GIF-потока, чтобы сосчитать имеющиеся в нем дескрипторы изображений.
Довольно мерзкое и не самое быстрое занятие. Хотя и реализуемое.
Хотя... наверное можно, обнаружив второй дескриптор, прекратить разбор.

   
 
 автор: Trianon   (16.02.2006 в 15:03)   письмо автору
 
   для: Trianon   (15.02.2006 в 20:53)
 

Пришлось поточить вот этот (http://www.w3.org/Graphics/GIF/spec-gif89a.txt) документ, покурить бамбук, слегка попотеть.
Но в целом вышло что-то такое.
Дескрипторы изображений находятся в элементах $gif['stream'][ nnn ]['id'] == '2C'
<?php
   
function getstr(&$strm$len 1)
   {  
$v substr($strm0$len); $strm substr($strm$len); return $v;   }
   function 
getvstr(&$strm) { return getstr($strmgetbyte($strm));  }
   function 
getbyte(&$strm)   {       return ord(getstr($strm,1));   }
   function 
getword(&$strm)   {$a getbyte($strm);  return $a + (getbyte($strm) << 8); }//>>

   
function get_localscreendescriptor(&$strm)
   {
       
$lsd0 getstr($strm7);
       
$pkd ord($lsd0{4}); $gctf 1&($pkd >>7); $gcts 3<< (1+($pkd&7)); // >>

       
$lsd = array('info' => $lsd0);
       if(
$gctf)
           
$lsd['colors'] = getstr($strm$gcts);
       return 
$lsd;
   }

   function 
get_imagedescriptor(&$strm)
   {    
// assume 2C introducer already read
       
$imd0 getstr($strm9);
       
$pkd ord($imd0{8}); $lctf 1&($pkd >>7); $lcts 3<< (1+($pkd&7)); //>>
       
$imd = array('info' => $imd0);
       if(
$lctf)
           
$imd['colors'] =  getstr($strm$lcts);
       return 
$imd;
   }

   function 
get_gif(&$strm)
   {
       
$g = array();
       
$g['head'] = array('type'=>getstr($strm3), 'version' =>getstr($strm3)) ;
       
$g['lsd'] = get_localscreendescriptor($strm);
       
$g['stream']= array();
       
$last_block;
       while((
$idgetbyte($strm)) != 0)
       {
           
$blk = array('id'=> sprintf("%02X",$id));
           switch(
$id)
           {
              case 
0x3B:   break;
              case 
0x2C:
                  
$blks = array();
                  
$blk['imd'] = get_imagedescriptor($strm$blk);
                  
$blk['minLZW'] = getbyte($strm);
                  while(
strlen($blks[]=getvstr($strm))!= 0) ;
                   
$blk['chunks']=$blks;
                  break;
              case 
0x21:
              
$block getbyte($strm);
              
$blks = array('sub_id' => sprintf("%02X",$block), 'rec' => array());
              while(
strlen($blks['rec'][] = getvstr($strm)) != 0)    ;
              
$blk['ext'] = $blks;
              break;
           }
           
$g['stream'][] = $blk;
       }
       return 
$g;
   }

   
$gif1 = @file_get_contents("example.gif");
   echo 
"<pre>";
   
$gif get_gif($gif1);
   
print_r($gif);
?>

   
 
 автор: Artemy   (16.02.2006 в 15:30)   письмо автору
 
   для: Trianon   (16.02.2006 в 15:03)
 

Большое Вам спасибо!
А что делать с этими дискрипторами?

   
 
 автор: Trianon   (16.02.2006 в 15:33)   письмо автору
 
   для: Artemy   (16.02.2006 в 15:30)
 

Если их два и более - значит GIF содержит 2 и более кадра. Значит GIF анимирован. Если только один - значит обычная картинка.
Вы же это хотели выяснить?
PS В принципе, после обнаружения второго такого дескриптора анализ можно было бы и прервать. Можно также не собирать графические данные(chunks) и данные блоков расширения (rec).

   
 
 автор: Artemy   (16.02.2006 в 16:32)   письмо автору
 
   для: Trianon   (16.02.2006 в 15:33)
 

хм...Я пробовал анимированным гифом провести "такого рода махинации", который состоит из трех кадров. И я не нашел там такого элемента - stream.

   
 
 автор: Trianon   (16.02.2006 в 16:47)   письмо автору
 
   для: Artemy   (16.02.2006 в 16:32)
 

А какие элементы там нашлись?
Прикрепите, пожалуйста, этот gif к ответу. Я его гляну.

   
 
 автор: Artemy   (16.02.2006 в 16:50)   письмо автору
 
   для: Trianon   (16.02.2006 в 16:47)
 

Прикрепил!

   
 
 автор: Trianon   (16.02.2006 в 17:06)   письмо автору
 
   для: Artemy   (16.02.2006 в 16:50)
 

Я имел в виду - прикрепить сам gif-файл, а не отчет скрипта. :)))

   
 
 автор: Artemy   (16.02.2006 в 17:10)   письмо автору
37.8 Кб
 
   для: Trianon   (16.02.2006 в 17:06)
 

Вауля! :)

   
 
 автор: Trianon   (16.02.2006 в 17:16)   письмо автору
 
   для: Artemy   (16.02.2006 в 17:10)
 

У меня честно пишет Total frames: 3
То бишь в GIFе всего три кадра.

   
 
 автор: Trianon   (16.02.2006 в 17:13)   письмо автору
 
   для: Trianon   (16.02.2006 в 17:06)
 

Попробуйте этот вариант.
<?php
   
function getstr(&$strm$len 1)
   {  
$v substr($strm0$len); $strm substr($strm$len); return $v;   }
   function 
getvstr(&$strm) { return getstr($strmgetbyte($strm));  }
   function 
getbyte(&$strm)   {       return ord(getstr($strm,1));   }
   function 
getword(&$strm)   {$a getbyte($strm);  return $a + (getbyte($strm) << 8); }//>>

   
function get_localscreendescriptor(&$strm)
   {
       
$lsd0 getstr($strm7);
       
$pkd ord($lsd0{4}); $gctf 1&($pkd >>7); $gcts 3<< (1+($pkd&7)); // >>

       
$lsd = array('info' => $lsd0);
       if(
$gctf)
           
$lsd['colors'] = getstr($strm$gcts);
       return 
$lsd;
   }

   function 
get_imagedescriptor(&$strm)
   {    
// assume 2C introducer already read
       
$imd0 getstr($strm9);
       
$pkd ord($imd0{8}); $lctf 1&($pkd >>7); $lcts 3<< (1+($pkd&7)); //>>
       
$imd = array('info' => $imd0);
       if(
$lctf)
           
$imd['colors'] =  getstr($strm$lcts);
       return 
$imd;
   }

   function 
get_gif(&$strm)
   {
       
$g = array();
       
$g['frames'] = 0;
       
$g['head'] = array('type'=>getstr($strm3), 'version' =>getstr($strm3)) ;
       
$g['lsd'] = get_localscreendescriptor($strm);
       
$g['stream']= array();
       
$last_block;
       while((
$idgetbyte($strm)) != 0)
       {
           
$blk = array('id'=> sprintf("%02X",$id));
           switch(
$id)
           {
              case 
0x3B:   break;
              case 
0x2C:  $g['frames']++;;
                  
$blks = array();
                  
$blk['imd'] = get_imagedescriptor($strm$blk);
                  
$blk['minLZW'] = getbyte($strm);
                  while(
strlen($blks[]=getvstr($strm))!= 0) ;
                   
$blk['chunks']=$blks;
                  break;
              case 
0x21:
              
$block getbyte($strm);
              
$blks = array('sub_id' => sprintf("%02X",$block), 'rec' => array());
              while(
strlen($blks['rec'][] = getvstr($strm)) != 0)    ;
              
$blk['ext'] = $blks;
              break;
           }
           
$g['stream'][] = $blk;
       }
       return 
$g;
   }

   
$gif1 = @file_get_contents("example.gif");
   
$gif get_gif($gif1);
   echo 
"Total frames: ".$gif['frames']."<br>\r\n";
?>

   
 
 автор: Artemy   (16.02.2006 в 17:19)   письмо автору
 
   для: Trianon   (16.02.2006 в 17:13)
 

ОГРОМНОЕ СПАСИБО!!! :-)

Все работает!

   
Rambler's Top100
вверх

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