Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> архиватор RLE, проблема с архивированием BMP 24-bit 
:(
    Опции темы
[Lorry]
Дата 5.12.2005, 23:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Добрый день!
Мне нужно написать простенький архиватор на основании алгоритма RLE: если идёт последовательность повторяющихся байтов, то в архиве ставится байт с ведущим битом равным 1, а остальные 7 - счётчик повторений. И сразу после этого байта идёт тот байт, который повторяется. Если идёт последовательность неповторяющихся байтов, то ставится байт с ведущим нулём, а осальные 7 бит - это сколько после этого байта будет помещено неповторяющихся символов.

Моя проблема заключается в том, что программа корректно архивирует и разархивирует только 256-цветные BMP файлы, а 24-битовые искажает при распаковке smile

Помогите разобраться в чем дело. Очень надо

Заранее благодарна

Код

procedure Compress;
var ch, buf, i, s : byte;
RepeatCh : array [0..127] of byte;
R : boolean;
begin
  s:=0;
  ch:=0;
  R:=true;
  repeat
     read(FileIn, buf);
     if ((buf<>ch) and (R=true)) or (S>=127)
     then begin
            if (S>0)
            then begin
                   S:=S+128;
                   write(FileOut, S);
                   write(FileOut, ch);
                 end;
             S:=0;
             R:=false;
             ch:=buf;
             continue;
          end;

      if (buf<>ch) and (R=false)
      then begin
             inc(S);
             RepeatCh[S-1]:=ch;
             ch:=buf;
             continue;
           end;

      if (buf=ch) and (R=false)
      then begin
             if (S>0)
             then begin
                    write(FileOut, S);
                    for i:=0 to S-1 do
                    write(FileOut, RepeatCh[i])
                  end;
              S:=2;
              R:=true;
              continue
           end;

           if (buf=ch) and (R=true)
           then begin
                  inc(S);
                  continue;
                end;

  until(Eof(FileIn));
end;

procedure UnCompress;
var k,i : byte;
S : byte;
begin
   repeat
     read(FileIn,k);
     if (k>128)
     then begin
            read(FileIn,S);
            for i:=1 to k-128 do
            write(FileOut2,S);
          end
     else for i:=1 to k do
          begin
            read(FileIn,S) ;
            write(FileOut, S);
          end;

  until (Eof(FileIn));
end;

// файлы FileIn, FileOut описываются в основной программе

  Вверх
cardinal
Дата 6.12.2005, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Цитата
, 5.12.2005,  21:59]Моя проблема заключается в том, что программа корректно архивирует и разархивирует только 256-цветные BMP файлы, а 24-битовые искажает при распаковке

А ты уверен, что при распаковке? А может уже при запаковке?
Потом следующие вопросы:
1. Ты запаковываешь файл полностью? Это неправильно! Так как упакованные RLE bmp файлы открываются редакторами, а если ты запакуешь файл полностью (а не только bitmap), то никакой редактор не будет знать, что это за файл. Если тот же ACDSee не может открыть твой запакованный файл, то это так.
2. Если не ошибаюсь, для 4 и 8 битных bmp'шек используются разные RLE алгоритмы. Но это не суть. Дело тут в другом. Дело ИМХО как всегда в округлении строк. То есть если в синтаксисе C/C++, то ширина твоей картинки равна в 8 битном файле
Код

dwBmpWidth = ((((pdsInfoHeaderSrc->biWidth << 3) + 7) >> 3) + 3) & 0xfffffffc;

а в 4 битном
Код

dwBmpWidth = ((((pdsInfoHeaderSrc->biWidth << 2) + 7) >> 3) + 3) & 0xfffffffc;

Как я понял ты это вообще не учел.
3. Из каких то соображений (не помню каких) я не занимался RLE 24 битной картинки. Помоему это RLE описанием не предусмотрено. Типа того, что 4 и 8 битный RLE, а 24 не делают. Почему не знаю. Кстати сейчас открыв графичекий редактор я этому еще раз удостоверился. Тут копай в сторону dither короче.

Успехов!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
[Lorry]
Дата 6.12.2005, 19:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Большое спасибо!
  Вверх
cardinal
Дата 6.12.2005, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Не за что.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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