реализация алгоритма Хаффмана в файле изображения

#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 вызове).