Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/23: Рейтинг темы: голосов - 23, средняя оценка - 4.87
JK_M

Создать программу компрессии/декомпрессии данных по методу RLE

04.04.2008, 00:00. Показов 4821. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать программу компрессии – декомпрессии данных по методу RLE.
оооооооооочень надо, кто может помогите
jk.o_o.mail.ru
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.04.2008, 00:00
Ответы с готовыми решениями:

программа на С++ для компрессии/декомпрессии файлов
Посоветуйте пожалуйста литературу по этому вопросу,а также посоветуйте какие библиотеки использовать для компрессии,а какие для...

Составить программу компрессии строк
КОМПРЕССИЯ СТРОК. Рассмотрим следующий алгоритм сжатия строк: если в строке встречается несколько одинаковых символов, идущих подряд, то...

Надо создать программу которая шифрует текст по методу Цезаря
Нужно сделать программу которая шифрует текст заменяя буквы на следующие в алфавите ( это называется ключом). Нужно вводить строку, и через...

2
Администратор
 Аватар для mik-a-el
87856 / 53177 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
04.04.2008, 11:34
Алгоритм RLE.

Суть алгоритма состоит в том, что сначала вытягивается по строкам растра, а потом повторяющиеся пиксели заменяются парой (счетчик, значение).
В формате PCX это реализовано следующим образом: в выходной поток пишется либо непосредственно значение пикселя (если в двух его старших разрядах не единицы):
[ XX значение ]
либо пара
[ 11 счетчик ] [ что повторять ]
причем повторяемый символ повторяется число раз, на единицу большую счетчика (не имеет смысл повторять 0 раз). Например, строку из 64 повторяющихся байтов мы превратим в два байта. С другой стороны, если в двух старших разрядах пикселя – единицы, и он не повторяется, то мы будем вынуждены записать:
[ 11 000000 ] [ значение ]
то есть, в худшем случае увеличим размер файла в два раза.
Данный алгоритм рассчитан на изображения с большими областями, залитыми одним цветом.

Данный алгоритм необычайно прост в реализации. Групповое кодирование — от английского Run Length Encoding (RLE) — один из самых старых и самых простых алгоритмов архивации графики. Изображение в нем (как и в нескольких алгоритмах, описанных ниже) вытягивается в цепочку байт по строкам растра. Само сжатие в RLE происходит за счет того, что в исходном изображении встречаются цепочки одинаковых байт. Замена их на пары <счетчик повторений, значение> уменьшает избыточность данных.

Алгоритм декомпрессии при этом выглядит так:

Initialization(...);
do {
byte = ImageFile.ReadNextByte();
if(является счетчиком(byte)) {
counter = Low6bits(byte)+1;
value = ImageFile.ReadNextByte();
for(i=1 to counter)
DecompressedFile.WriteByte(value)
}
else {
DecompressedFile.WriteByte(byte)
} while(ImageFile.EOF());

В данном алгоритме признаком счетчика (counter) служат единицы в двух верхних битах считанного файла.

Соответственно оставшиеся 6 бит расходуются на счетчик, который может принимать значения от 1 до 64. Строку из 64 повторяющихся байтов мы превращаем в два байта, т.е. сожмем в 32 раза.

Алгоритм рассчитан на деловую графику — изображения с большими областями повторяющегося цвета. Ситуация, когда файл увеличивается, для этого простого алгоритма не так уж редка. Ее можно легко получить, применяя групповое кодирование к обработанным цветным фотографиям. Для того, чтобы увеличить изображение в два раза, его надо применить к изображению, в котором значения всех пикселей больше двоичного 11000000 и подряд попарно не повторяются.

Второй вариант алгоритма:

Второй вариант этого алгоритма имеет больший максимальный коэффициент архивации и меньше увеличивает в размерах исходный файл.

Алгоритм декомпрессии для него выглядит так:

Initialization(...);
do {
byte = ImageFile.ReadNextByte();
counter = Low7bits(byte)+1;
if(если признак повтора(byte)) {
value = ImageFile.ReadNextByte();
for (i=1 to counter)
CompressedFile.WriteByte(value)
}
else {
for(i=1 to counter){
value = ImageFile.ReadNextByte();
CompressedFile.WriteByte(value)
}
CompressedFile.WriteByte(byte)
} while(ImageFile.EOF());

Признаком повтора в данном алгоритме является единица в старшем разряде соответствующего байта.

Как можно легко подсчитать, в лучшем случае этот алгоритм сжимает файл в 64 раза (а не в 32 раза, как в предыдущем варианте), в худшем увеличивает на 1/128. Средние показатели степени компрессии данного алгоритма находятся на уровне показателей первого варианта.

Характеристики алгоритма RLE:

Коэффициенты компрессии: Первый вариант: 32, 2, 0,5. Второй вариант: 64, 3, 128/129. (Лучший, средний, худший коэффициенты)

Класс изображений: Ориентирован алгоритм на изображения с небольшим количеством цветов: деловую и научную графику.

Симметричность: Примерно единица.

Характерные особенности: К положительным сторонам алгоритма, пожалуй, можно отнести только то, что он не требует дополнительной памяти при архивации и разархивации, а также быстро работает. Интересная особенность группового кодирования состоит в том, что степень архивации для некоторых изображений может быть существенно повышена всего лишь за счет изменения порядка цветов в палитре изображения.
0
JK_M
24.04.2008, 22:51
Цитата Сообщение от JK_M Посмотреть сообщение
Создать программу компрессии – декомпрессии данных по методу RLE.
оооооооооочень надо, кто может помогите
jk.o_o.mail.ru
вот чтото нашел но написано вродебы на С++
может можно преобразовать на язык делфи

Исходный код реализации алгоритма RLE
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
// RLE.cpp 
#include <stdio.h> 
#include <memory.h>
#include <stdlib.h>
/* Коды ошибок */
#define NO_ERROR      0
#define BAD_FILE_NAME 1
#define BAD_ARGUMENT  2
 
#define FALSE 0
#define TRUE  1
/* входной и выходной файлы */
FILE *source_file, *dest_file;
/*
'byte_stored_status' равен 'TRUE'если байт
прочитан 'fgetc'или 'FALSE' если нет дейтвительного
байта, не прочитано и не содержится в 'val_byte_stored'
*/
int byte_stored_status=FALSE;
int val_byte_stored;
 
/* псевдопроцедуры */
#define end_of_data() (byte_stored_status?FALSE:\
 !(byte_stored_status=\
 ((val_byte_stored=fgetc(source_file))!=EOF)))
 
#define read_byte()  (byte_stored_status?\
 byte_stored_status=FALSE,(unsigned char)val_byte_stored:\
 (unsigned char)fgetc(source_file))
 
#define write_byte(byte)  ((void)fputc((byte),dest_file))
#define write_array(array,byte_nb_to_write)\
   ((void)fwrite((array),1,(byte_nb_to_write),dest_file))
#define write_block(byte,time_nb)\
  {
    unsigned char array_to_write[129];\
    (void)memset(array_to_write,(byte),(time_nb));\
    write_array(array_to_write,(time_nb));\
  }
//=========================================================
// Сжатие методом RLE
void rle1encoding()
{
 register unsigned char byte1, byte2, frame_size, array[129];
 if (!end_of_data())
 {
  byte1=read_byte();
  frame_size=1;
  if (!end_of_data())
  {
   byte2=read_byte();
   frame_size=2;
   do {
    if (byte1==byte2)
    {
     while ((!end_of_data())&&(byte1==byte2)
      &&(frame_size<129))
     {
      byte2=read_byte();
      frame_size++;
     }
     if (byte1==byte2) /* встретили
           последовательность
           одинаковых байт */
     {
      write_byte(126+frame_size);
      write_byte(byte1);
      if (!end_of_data())
      {
       byte1=read_byte();
       frame_size=1;
      }
      else frame_size=0;
     } else
     {
      write_byte(125+frame_size);
      write_byte(byte1);
      byte1=byte2;
      frame_size=1;
     }
     if (!end_of_data())
     {
      byte2=read_byte();
      frame_size=2;
     }
    } else /* подготовка массива для
        сравнений, в нем будут
        храниться все идентичные байты */
    {
     *array = byte1;
     array[1]=byte2;
     while ((!end_of_data())&&(array[frame_size-2]!=
      array[frame_size-1])&&(frame_size<128))
     {
      array[frame_size]=read_byte();
      frame_size++;
     }
     if (array[frame_size-2]==array[frame_size-1])
      /* встретилась ли последовательность из разных байт,
      следующих за одинаковыми? */
     { /* Да, тогда не считаем 2 последних байта */
      write_byte(frame_size-3);
      write_array(array,frame_size-2);
      byte1=array[frame_size-2];
      byte2=byte1;
      frame_size=2;
     } else
     {
      write_byte(frame_size-1);
      write_array(array,frame_size);
      if (end_of_data())
       frame_size=0;
      else {
       byte1=read_byte();
       if (end_of_data())
        frame_size=1;
       else {
        byte2=read_byte();
        frame_size=2;
       }
      }
     }
    }
   } while ((!end_of_data())||(frame_size>=2));
  }
  if (frame_size==1)
  {
   write_byte(0);
   write_byte(byte1);
  }
 }
} 
//---------------------------------------------------------
// Декомпрессия методом RLE
void rle1decoding()
{
 unsigned char header;
 register unsigned char i;
 while (!end_of_data())
 {
  header=read_byte();
  switch (header & 128)
  {
   case 0:
    if (!end_of_data())
     for (i=0;i<=header;i++)
      write_byte(read_byte());
    /* else INVALID FILE */
    break;
   case 128:
    if (!end_of_data())
     write_block(read_byte(),(header & 127)+2);
    /* else INVALID FILE */
  }
 }
}
//---------------------------------------------------------
// Вывод помощи о пользовании программой
void help()
{
 printf("RLE_01 e(encoding)|d(decoding) source target\n");
} 
//---------------------------------------------------------
// главная функция
int _tmain(int argc, _TCHAR* argv[])
{
 if (argc!=4)
 { 
  help();
  exit(BAD_ARGUMENT);
 }
 else if ( tolower(argv[1][0])!= 'e'
  && tolower(argv[1][0])!= 'd')
 {
  help();
  exit(BAD_ARGUMENT);
 }
 else if ((source_file=fopen(argv[2],"rb"))==NULL)
 {
  help();
  exit(BAD_FILE_NAME);
 }
 else if ((dest_file=fopen(argv[3],"wb"))==NULL)
 {
  help();
  exit(BAD_FILE_NAME);
 }
 else { 
  if (tolower(argv[1][0]) == 'e') rle1encoding();
  else rle1decoding();
  fclose(source_file);
  fclose(dest_file);
 }
 printf("Completed.\n");
 return (NO_ERROR); 
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2008, 22:51
Помогаю со студенческими работами здесь

Разработайте приложение rle.exe, выполняющее RLE-компрессию бинарных файлов
Разработайте приложение rle.exe, выполняющее RLE-компрессию бинарных файлов с сильно разреженным содержимым, а также декомпрессию...

Сжатие данных. Кодирование длин серий (RLE)
Всем привет! Необходимо доработать алгоритм кодирование длин серий. Входная строка: 2 3 3 3 5 2 4 4 4 4 4 8 -6 8 Моя...

Написать программу кодировки (сжатия) цифр алгоритмом RLE
Нужно написать программу кодировки(сжатия) цифр алгоритмом RLE. Есть пример но он кодиркет не так как надо. Например есть цифры...

Написать программу на основе алгоритма RLE (сжатие/восстановление массива)
Массив из 0 и 1 целых чисел. Массив надо сжать, а затем восстановить массива. Надо написать программу по алгоритму RLE. Спасибо заранее ...

Создать программу, которая обеспечивает ввод данных, поиск по году рождения и фамилии, вывод данных
Создать программу, которая обеспечивает ввод данных, поиск по году рождения и фамилии, вывод данных. Запись содержит данные: фамилия (тип...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru