Однако, возникла трудность: по описанному здесь алгоритму сжатия 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;
}
{
$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;
}