#c
#c
Вопрос:
Я разработал программу на языке Си, которая основана на алгоритме Хаффмана.
Теперь я хочу работать по тому же алгоритму с файлом изображения (предыдущая программа может сжимать .txt
файл)…
Как я могу ввести файл изображения с помощью программы на языке си и использовать алгоритм для его сжатия?.
void freq()
{
int i=0,j,k,f,n=0;
char ch;
clrscr();
printf("nEnter path of the text file:");
fflush(stdin);
gets(path);
f1=fopen(path,"rb");
if(f1==NULL)
{
printf("cant open %s",path);
getch();
exit(1);
}
while(1)
{
f=0;
ch=fgetc(f1);
if(ch==EOF)
break;
for(j=0;j<n;j )
{
if(ch==arr[j])
f=1;
}
if(f==1)
continue;
else
{
arr[i]=ch;
ptr[i][0]=arr[i];
ptr[i][1]='';
i ;
}
n ;
}
arr[i]='';
noc=i-1;
}
Комментарии:
1. Покажите нам свой код. Возможно, тогда мы сможем взглянуть на это и дать предложения.
2. Переименуйте ваш файл изображения, чтобы он имел
.TXT
расширение. Готово, теперь вы можете использовать свой алгоритм кодирования Хаффмана на основе TXT!3. код слишком длинный .. я просто загружаю раздел ввода void freq() { int i=0,j,k,f, n=0; char ch; //ФАЙЛ *f1,*f2; clrscr(); printf(«nEnter путь к текстовому файлу:»); fflush(stdin); gets(путь); f1=fopen(путь,»rb»); if(f1==NULL) { printf(«не удается открыть% s»,путь); getch(); exit(1); } while(1) { f=0; ch=fgetc(f1); if (ch ==EOF) перерыв; for(j=0;j<n;j ) { if (ch==arr[j]) f=1; } if(f==1) продолжить; else { arr[i]= ch; ptr[i][0]=arr[i]; ptr[i][1]=»; i ; } n ; } arr [i]=»; noc=i-1;
4. @cosmin: В общем случае для меня просто невозможно переименовать файл изображения в файл .txt.
5. @user720101 Пожалуйста, отредактируйте свой текст и поместите туда код, он совершенно нечитаем в комментарии. Не забудьте поместить его в блок кода, чтобы он автоматически получал цветную разметку и интервал.
Ответ №1:
Как Космин Прунд уже заявил в своем комментарии: «Переименуйте ваш файл изображения в .txt». Теперь, конечно, вам не нужно этого делать, он имел в виду следующее: алгоритм кодирования Хаффмана не зависит от того, какой тип входных данных он получает, ему все равно.
Итак, вместо чтения в файле .txt, просто прочитайте файл изображения и передайте его алгоритму Хаффмана. Для алгоритма это всего лишь биты, не имеет значения, английский это или клингонский, или BMP, или …
Конечно, использовать кодировку Хаффмана в файле изображения для его сжатия, вероятно, не лучшая идея. Есть причина, по которой существуют такие форматы файлов, как JPG. Они используют тот факт, что человеческий глаз нечувствителен к определенным преобразованиям изображения с потерями, и используют это для удаления этой информации, поэтому им приходится кодировать меньше данных. Кодировка Хаффмана не может этого сделать, поскольку она универсальна и без потерь.
[Редактировать] Я не просматривал опубликованный вами код, но с первого взгляда заметил ошибку: fgetc
возвращает an int
, а не a char
, как вы могли бы подумать по его названию. Так что лучше измените определение ch
.
Комментарии:
1. … за исключением того, что файл должен быть открыт в двоичном режиме, чтобы программа была переносимой.
2. Ну да, но это уже так, если вы посмотрите на код операционной системы (флаг «rb» в
fopen
вызове).