С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Так здесь же http://zx-pk.ru/threads/25281-sozdan...l=1#post874626 расписал формат
А сам алгоритм вот, вроде готов:
// Распаковка сжатых данных.
fsize:=fsize-1; // Ставим указатель на последний загруженный байт
while buf^[fsize]=0 do
fsize:=fsize-1;
cpos:=32767;
repeat
b:=buf^[fsize-1];
c:=buf^[fsize ]-1;
if c>=128 then begin // Сжатые данные. Скопировать "b" "c" раз
c:=c and $7F;
if cpos-c >=0 then
for x:=0 to c do
spb^[cpos-x]:=b;
end else begin // Несжатые данные, просто скопировать "c" байт
if (cpos-c >=0) and (fsize-c-1 >0) then
for x:=0 to c do
spb^[cpos-x]:=buf^[fsize-x-1];
fsize:=fsize-c; // Сдвинем указатель в источнике на "с" байт
end;
cpos:=cpos-c-1; // Сдвиг указателя приёмника на следующий байт
fsize:=fsize-2; // Сдвиг указателя источника на следующиую группу байт
until fsize<=18;
Вот, что удалось узнать по формату .spr:
- Размер файла кратен 128 байт. Неиспользуемые байты в конце заполнены 0.
- Сохранены 4 битовые плоскости от Вектор 06ц. Распаковываются в 32 КБ единым куском как есть,
без разбивки на битовые плоскости, столбцы и строки.
- Вперемешку используется сжатие RLE и куски несжатых данных.
- В файле по смещению 0 хранится 16 байтовая палитра вектора.
- Байты 16 и 17 непонятного назначения, во всех просмотренных файлах .spr равны 0.
- По смещению 18 начинается массив самого изображения.
- Байты изображения начинаются с левого нижнего угла и поднимаются сначала вверх и затем сдвиг вправо,
что соответствует организации экранной памяти вектора.
- В данных изображения могут идти как области несжатых байт, так и сжатых.
Несжатые данные. Подряд идут N байт несжатых данных, их надо просто скопировать.
За ними идёт байт со значением N. При этом, N принимает значения от 1 по 128.
Сжатые данные. Идёт байт данных, который повторяется N раз. За ним идёт байт со значением 128+N.
N принимает значения от 1 до 127.
- С начала файла однозначно не распаковать данные, поэтому, нужно распаковывать с конца,
тогда сначала будет идти количество повторов или количество несжатых байт.
Попробую сделать распаковщик и преобразователь в bmp.
Можете дать ссылку на .spr, где эти байты не равны 0?
В архиве Amstrad spr.7z и в сгенерированных в sprview эти 2 байта равны 0. Предположу, что один из них может кодировать цвет бордюра, что сейчас не актуально, а второй кодирует используемые битовые плоскости. Хорошо бы разобраться.
Последний раз редактировалось yur; 15.06.2016 в 20:39.
yur, ну что, сделали компрессор в формат .spr? Я начал, но ошибка проскакивает, не пойму где.
Чтение палитры и распаковку данных вроде сделал. Теперь надо битовые плоскости преобразовать в формат windows bmp. Только не хочу возиться с 4 битной картинкой и палитрами, поэтому сделаю преобразование в 16 битную картинку.
Оффтоп
Здравствуйте.
Ковыряю тут тоже потихоньку граф. форматы Вектора. Возник вот такой вопрос: есть ли у кого все 256 цветов Векторовской палитры в стандартном RGB-виде (для конвертирования в BMP)?[свернуть]
Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.
Seamos realistas y hagamos lo imposible!
Ernesto Che GuevaraПереехал сюда: SteinBlume (ex ATM CP/M Explorer)
http://era-cg.su
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)