Практическая часть. Варианты заданий приведены в Приложении 1.
Варианты заданий приведены в Приложении 1. Пункты 6-9 задания являются факультативными. Порядок выполнения задания:
1) Провести «вручную» сжатие 2-х фрагментов данных методом группового кодирования. Сравнить полученные коэффициенты сжатия. 2) Провести «вручную» сжатие 2-х фрагментов данных методом LZW. Сравнить полученные коэффициенты сжатия. 3) Провести «вручную» сжатие 2-х фрагментов данных c применением кодов Хаффмана. Сравнить полученные коэффициенты сжатия. 4) Провести «вручную» сжатие фрагмента данных c применением алгоритмов RLE, LZW и кодов Хаффмана. Описать полученные результаты и сделать соответствующие выводы.
Приложение 1. Варианты заданий. Числа в таблице соответствуют номерам цепочек данных. В пунктах 17-26 данных для кодирования числа обозначают индексы строк и столбцов для выделения рабочего блока из общей матрицы изображения.
Данные для кодирования: 1) bbbbbbbccccccbbcaaaaaaabbbccccaaaaaaabbbbbaaaaadddddddddaaaadd 2) cbcbbbbcdccddaddabbddccaaaccddddccbbbaaadddddbbbbcacccddaabb 3) aaaaaccccaaccccbbccccccccfffffffffffffssssssssaaaaaabbbbbcccbbbbbffbbbb 4) ccccccbbaaccaddcdacdbcadcdadaaaddacaccadaabbbacadcccadbcbbbcbcbd
5) baaccbccbcabaccabbaabaaabcc 6) babaabbaabbaaabbbaaaaa 7) abbabbabaabbabbbba 8) aaacbcbbbbcccbbbcacc
9) dcafbfbabggbceffgggfhhhgghhhefffsffaabbabchhabffccaf 10) faaadddddbbbccbaffbbbaabbabbbabbfcadcbfababadddab 11) gdadafghggfghababahbagggabcdcdcahhggaghhhgacagca 12) bbffdddedffdfdccdcadcddddacacacccaccaccadccfcc
13) abaacadbbaaaaadcda 14) aacaddddccdbbaaaaad 15) bbbacadbccadcbaaadcda 16) abaaabbccdabaacadb
17) 250-257, 200-207 18) 290-297, 170-177 19) 50-57, 60-67 20) 150-157, 141-148 21) 220-227, 300-307 22) 121-128, 145-152 23) 122-129, 146-153 24) 123-130, 147-154 25) 140-147, 170-177 26) 123-130, 296-303 Приложение 2. Инструкции по выполнению пп. 6-9 задания. Программная реализация алгоритма сжатия RLE в виде процедуры (функции) может быть выполнена на любом доступном языке высокого уровня, таком как Pascal (в среде Delphi) или C++ (в средах Воrland Builder или Microsoft Visual), однако следует учитывать, что при вызове процедуры в основной программе используется т.н. «паскалевское»(__stdcall) соглашение о передаче параметров. Процедура входит в динамическую библиотеку (DLL), которая подключается к основной программе. Взаимодействие происходит по следующей схеме: 1) основная программа RLE.exe загружает исходный файл изображения и динамическую библиотеку в оперативную память; 2) из динамической библиотеки вызывается функция CompressImage c четырьмя параметрами: - pInBuf – массив исходных данных; - pOutBuf – массив сжатых данных; - nInSize – размер входных данных; - nOutSize – размер сжатых данных. Функция реализует алгоритм и формирует массив сжатых данных; 3) Основная программа компонует новый файл изображения и записывает его на “жесткий” диск.
Ниже приведён пример шаблона реализации в среде программирования Delphi:
- создать новый проект с именем “RLE” c помощью мастера создания динамической библиотеки выбрав пункт меню Project / Add New Project / DLL Wizard; - добавить в проект файл Module1.pas, выбрав команду Project / Add to Project (шаблоны файлов RLE.dpr и Module1.pas см. ниже); - скомпилировать библиотеку RLE.dll и перенести её в каталог основной программы RLE.exe.
/////////////////////////////////////////////////////// Файл RLE.dpr ///////////////////////////////// library RLE;
uses SysUtils, Classes, Module1 in 'Module1.pas'; {подключаем модуль файла Module1.pas} exports CompressImage name 'CompressImage '; {делаем функцию CompressImage экспортируемой }
begin end.
/////////////////////////////////////////////////////// Файл Module1.pas ///////////////////////////////// unit Module1;
interface type TArray = array [0..9] of byte; pArray = ^TArray; { объявляется тип указателя на массив элементов типа byte } { объявление процедуры CompressImage} procedure CompressImage(pInBuf:pArray; pOutBuf:pArray; nInSize:longword; nOutSize:longword);
implementation
uses Dialogs, SysUtils;
{ определение процедуры CompressImage} procedure CompressImage(pInBuf:pArray; pOutBuf:pArray; nInSize:longword; nOutSize:longword); var { Здесь объявляются локальные переменные, например i: integer; Res: byte} begin { Здесь размещается код алгоритма. pInBuf – указатель на массив входных данных типа byte; pOutBuf – указатель на массив выходных(сжатых) данных типа byte; nInSize – размер входных данных, передаваемый процедуре; nOutSize – размер выходных данных, вычисляемый процедурой; Индексация массивов начинается с нуля. Обращение к i-элементу массива по указателю выполняется в виде pInBuf^[i]. Пример: for i:=0 to (n-1) do begin pOutBuf ^[i+1]:= pInBuf^[i]; end; } end;
end.
|