Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> компрессия lzw для gif 
:(
    Опции темы
SATYR
Дата 25.5.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 24.5.2005

Репутация: нет
Всего: нет



Народ подскажите пожалуста модуль(если такой есть) в котором можно глянуть реализацию алгоритма lzw для gif на Перл ? А то весь CPAN перерыл  smile, результата ноль. Конкретно интересует реализация чтения кодов переменной длинны из входного потока при декодировании.

Попытался сам реализовать алгоритм согласно его описаниюздесь, но возникла такая проблема при обработке входного потока находится несколько кодов окончания потока данных smile .
На всякий случай привожу код, может кто по конкретной ситуации поможет, заранее спасибо:
Код

##Decode grafic data from LZW 
...
{
     my $lzw_size;                # текущий размер кода в битах
     my $ost;                         #остаток от предыдещего слова 
     my $ost_size;                 #размер остатка от предыдущего слова
     my @table;                      #таблица кодов

     sub decode_lzw_{
         my $frame=$_[0];           #gif парсится и представляется в виде структуры данных  собс-но $frame это указатель на соответствующий узел структуры
         my $word;                       #cлово фиксированного размера извлекаемое из кодированного потока
         my $word_size;               # размер этого слова
         my $i=0;
         for(0..bytes::length($$frame{body})-1){
               $lzw_size||=$$frame{lzw_size}+1;      #используем сначала "код размера"  указанный в потоке данных
               $word=vec($$frame{body},$_,8);        # извлекаем слово
               $word_size=8;                                      # размера 8-бит
             if(defined($ost_size)){                                  #если предыдущее слово обработано не полностью 
                 $word=($word<<$ost_size)|$ost;             # добавляем остаток 
                 $word_size+=$ost_size;                            # и корректируем размер
                 undef $ost_size;
             }     
             while(($word_size-$word_size % $lzw_size)/$lzw_size > 0){
                    my $code=$word & 2**$lzw_size-1;                                  #из полученного слова из младших разрядов извлекаем коды текущей длинны
                       $word=$word>>$lzw_size;                                              # выбрав код сдвигаем  
                       $word_size-=$lzw_size;                                                 
                       if($code==2**$$frame{lzw_size}){                       
                         #здесь если встретили код очистки таблици делаем что необходимо...
                       }elsif($code==2**$$frame{lzw_size}+1){
                         #сюда попадаем если конец потока данных
                       }else{ 
                          #а сюда иначе
                            $lzw_size++ if($code==2**$lzw_size-1); # если все коды длинны 2^текщая длинна исчерпаны 
                             $lzw_size=$$frame{lzw_size}+1 if($code==4095);  #если мы исчерпали коды длинны 12-бит (за ним должен следовать код очистки)
                           #ниже должно следовать процедура обрабатывающая полученный код
                       }
            }
            if($word_size!=0){      # и наконец здесь сохраняем остаток для обработки его со следующим словом
                $ost=$word;
                $ost_size=$word_size;
            }

           }
      }    

}



ЗЫ Не судите строго, возможно, изобретаю велосипед, но тем не менее... smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0799 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.