IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Closed TopicStart new topic
> Нужна помощь с форматом .DEF, А именно, с конвартацией кадров
snaiperk
сообщение 21 Mar 2011, 13:52 (Сообщение отредактировал snaiperk - 21 Mar 2011, 13:58)
Сообщение #1

Newbie
Сообщений: 5
Спасибо сказали: 2 раза




Всем добрый день. Вчера за пару часов набросал на коленке конвертер def -> png (именно так, в другую сторону мне не нужно).
Однако, возникла трудность: по описанному здесь алгоритму сжатия PackBits раскодировать кадры "тупо в лоб" не получается. В лучшем случае, получается каша (приложил парочку для примера):


DEF-файл исправен, defview его конвертит нормально. Может, кто сталкивался с этим алгоритмом и подскажет, в как реализовать конверсию?

Моё:
Код
  function UnPackBits($h, $data_size, $x, $y)//, $start)
  {
    $start = ftell($h); // Стартовая позиция
    $rez = array();//$x*$y);
    $cnt = 0;
    //fseek($h, $start, 0);
    $offsets = array(); // Заполним массив смещений
    for($i = 0; $i < $y; $i++)
      $offsets[$i] = readint($h); // Считали необходимый оффсет
      
    //Print_r($offsets);die();    
    $offsets[$y]=$data_size;
    $dx = 0;
    $cursor = 0;
    for($i = 0; $i < $y; $i++)
    {
      $j = 0;   // Смещение по массиву
      $cnt = 0; // Смещение по файлу
      $len = 0; $c = "";
      fseek($h, $start+$offsets[$i], 0);
      while($cnt < $x)
      {
        $n = ord(fread($h, 1));
        
        if($n == 0xFF) // Куча разных пикселей
        {
            $n = ord(fread($h, 1)); // Прочитать длину этой кучи
          for($k = 0; $k <= $n; $k++)
          {
            $rez[$i][] = ord(fread($h, 1));
            $cnt++;
          }
        }
        else
        {
          $c = ord(fread($h, 1));
          for($k = 0; $k <= $n; $k++)
          {
            $rez[$i][] = $c;
            $cnt++;
          }
        }
      }

      $dx += $x;
    }
    return $rez;
  }


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
snaiperk
сообщение 21 Mar 2011, 16:35 (Сообщение отредактировал snaiperk - 21 Mar 2011, 16:37)
Сообщение #2

Newbie
Сообщений: 5
Спасибо сказали: 2 раза




Приятно, что на форуме помогают новичкам, да ещё и как!
В приват мне прислали архив с исходником (и параллельно на форуме нашлась ссылка с похожим материалом), откуда решение нашлось легко.
Оказалось, я просто-напросто перепутал (согласно описанию, автору сейчас напишу чтоб поправил) местами 2 байта: если n != 0xFF, то n - это не длина, а символ. А длина - следующий байт. Вот и всё.

Gif:

Png:
За сим тему можно закрыть как разрешённую.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 16 April 2024 - 17:47
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика