1 1 1 3 4 4 4, то коефіцієнт стиснення буде рівний 60%. У зв'язку з цим найбільша ефективність алгоритму RLE досягається при стисненні графічних даних (особливо для однотонових фонових зображень).
Недоліки методу RLE є очевидними: це, передусім, низька пристосованість до багатьох розповсюджених типів файлів, наприклад, текстових: у загальному випадку реально стиснути можна лише ланцюжки проміжків на початку абзаців. Саме тому цей метод можна ефективно використовувати лише у комбінації з вторинним кодуванням.
Саме ций алгоритм кодування ми будемо використовувати в даному дипломному проекті.
2.3 Опис алгоритмів програми
Метою даної частини дипломного проекту є розробка програми, яка б архівувала файли з розширенням *.bmp в файли з розширенням *.tmp згідно відомого методу стиснення інформації. Загальний алгоритм роботи нашої програми зображений на рисунку 2.1. Текст програми наведено у Додатку А. Дана програма була реалізована з допомогою програмного продукту Borland Delphi 7.0.
Тобто, можна сказати, що даний алгоритм – це алгоритм формування потрібного нам файлу.
Рисунок 2.1 – Загальний алгоритм роботи програми
Як видно з рисунку 2.1 алгоритм починається з того, що нам потрібно вибрати файл потрібного формату, тобто BMP-файл. Після того, як ми це зробимо, появиться вікно на якому будуть дві кнопки. Це кнопки “Button 1” і “Button 2”. Після того, якщо ми вибрали той файл, що потрібно і після натиску “Button 1”, відбувається перевірка параметрів блока по ширині і по висоті. Потім, якщо параметри блока коректні, програма приступає безпосередньо до стиснення файлу, яке може проходити за двома методами. Ці методи ми розглянемо нижче.
Після того як стиснення відбулось, ми можемо зберегти утворений файл і повернутись на початок для здійснення компресії нового файлу.
Якщо ж параметри блока виявились не коректними, тобто не правильно було задано ширину або висоту блока, то алгоритм переривається і повертається на початок.
Якщо ж ми одразу хочемо відмовитись від стиснення після вибору файлу, то можемо скористатись кнопкою “Button 2” і тоді перейдемо на початок алгоритму.
Ось так можна описати роботу даного алгоритму.
Розглянемо тепер алгоритм стиснення функції Pack (рисунок 2.2). У ній використовується один з двох методів стиснення Compress1 або Compress2, алгоритми проведення яких наведено на рисунку. 2.3. і рис. 2.4.
Рисунок 2.2 - Алгоритм функції Pack
Отже функція Pack починається з того, що спочатку в буфер зчитується заголовок BMP-файлу. Потім зчитується тип файлу BMP. Після цього, як тільки програма виявляє, що формат файлу не вірний, випливає повідомлення про помилку і архівація не проводиться.
Далі, як видно із рисунку 2.2 в буфер зчитується інформація про те чи файл, який ми вибрали є 256-колірним. Якщо ні, то з’являється повідомлення про помилку також.
Якщо вибраний файл задовольняє всі поставлені вище умови, то починається зчитування інформації про довжину та ширину малюнка.
Після цього починається корекція файлу. Програма починає визначати кількість блоків по координатах х та, у утворюючи таким чином малюнок потрібного розмірору. Фрагмент програми цього виглядає так:
blx=width/bwidth
bly=height/bheight
Після корекції, як видно з блок-схеми починається створення текстового файлу з розширенням tmp. Це необхідно для того щоб програма, яка буде розпаковувати файли могла коректно це виконати.
Далі починається формування BMP-заголовку, запис у файл. Після цього починається сама компресія сформованого файлу. Методи компресій, що використовуються розглянемо нижче.
Потім стиснутий файл зберігається.
Таким чином утворюються потрібні файли, які потім повинні використовуватись програмою декомпресії.
Тепер розглянемо самі методи стиснення, їх відмінність та недоліки.
Рисунок 2.3 - Алгоритм функції Compress1
Як видно з блок-схеми перший метод стиснення починається з того, введені певні змінні cr, nSame, n, спочатку прирівнюються до нуля, тобто:
cr=0
nSame=0
Після цього задається умова, що cr < n. Якщо ця умова не вірна, то алгоритм завершується.
Якщо ж умова справджується, тоді змінна nSame набуває значення 1. Це означає признак «однаковості» 2 байтів. Далі змінна заноситься в буфер.
Потім задається нова умова:
buf[cr]=buf[cr+1],
тобто до змінної, що знаходиться в буфері додається 1. Внаслідок цієї умови виконується рівність:
nSame=nSame+1
cr=cr+1
Це значить, що змінні вже мають значення на порядок вище.
Наступна умова вже буде така:
сr= n,
якщо ця умова справджується то алгоритм успішно завершується, якщо ні – то алгоритм повертається до попередньої умови.
Другий шлях виконання алгоритму такий.
Якщо умова cr < n вірна, то виконується наступна умова cr=cr+1.
Потім відбувається запис змінних nSame і buf[cr] у файл. Таким чином алгоритм compress1 завершується.
Але, звичайно, є недолік цього алгоритму. Він полягає в тому, що у випадку не стискання файлу, файл на виході буде в 9 разів більше, ніж на вході.
Розглянемо алгоритм стикання Compress2.
Рисунок 2.4 - Алгоритм функції Compress2
Як бачимо цей алгоритм значно об’ємніший за попередній. Він відрізняється від Compress1 тим, що аналізується на однаковість не 1 біт, а рядок із 255 біт.
Алгоритм починається з того, що змінним cr і nll присвоюються значення 0. Змінна cnt лежить на проміжку від 0 до 255.
Після цього задається умова, така нерівність:
buf[cr]?buf[cr+1],
тобто значення змінних, записаних в буфер, не дорівнюють одна одній.
Якщо умова не правильна, то алгоритм повертається до змінної cnt, а якщо нерівність вірна, то відбувається запис змінних nll, cnt, buf[cr- cnt]… buf[i].
Після цього задається друга умова:
cr?n
Якщо ця умова не дійсна, то настає кінець виконання програми.
Якщо умова справджується, то задається новий проміжок для змінної cnt від 1 до 254.
Потім задаються дві умови:
buf[cr]=buf[cr+1],
cr<n,
якщо вони дійсні, тоді виконується рівність cr= cr+1 і алгоритм повертається до змінної, що знаходиться на інтервалі 1…254.
Якщо ж умова не виконується, то повинна виконуватись наступна умова:
сnt=255
Після неї виконується рівність:
сnt=