Нужна помощь с форматом .DEF, А именно, с конвартацией кадров |
Здравствуйте, гость ( Вход | Регистрация )
Нужна помощь с форматом .DEF, А именно, с конвартацией кадров |
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; } |
|
|
21 Mar 2011, 16:35
(Сообщение отредактировал snaiperk - 21 Mar 2011, 16:37)
Сообщение
#2
|
|
Newbie Сообщений: 5 Спасибо сказали: 2 раза |
Приятно, что на форуме помогают новичкам, да ещё и как!
В приват мне прислали архив с исходником (и параллельно на форуме нашлась ссылка с похожим материалом), откуда решение нашлось легко. Оказалось, я просто-напросто перепутал (согласно описанию, автору сейчас напишу чтоб поправил) местами 2 байта: если n != 0xFF, то n - это не длина, а символ. А длина - следующий байт. Вот и всё. Gif: Png: За сим тему можно закрыть как разрешённую. |
|
|
Текстовая версия | Сейчас: 19 April 2024 - 06:23 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |