Как открыть несколько изображений JPG в C? - PullRequest
3 голосов
/ 19 апреля 2011

Обновление : Спасибо за помощь, я разобрался! Я должен был увеличить I, когда я использовал

        putc(input_char, output_file);
        input_char = chars[i+1];
        putc(input_char, output_file);
        input_char = chars[i+2];
        putc(input_char, output_file);
        input_char = chars[i+3];
        putc(input_char, output_file);

У меня есть файл с несколькими изображениями в формате JPEG. Мне нужно поместить каждое изображение в отдельный файл. Я уже положил файл в:

unsigned char* chars;

которое я сделал равным:

chars = (unsigned char*) malloc (sizeof(unsigned char)*count+1);

(количество - общее количество байтов)

Вот большая часть моего кода. Я пытаюсь заставить работать только одно изображение, прежде чем просмотреть весь файл. Я думал, что это будет работать, но я не могу получить изображение. Я получаю файл с именем image.jpg с большим количеством байтов, но без изображения. Кажется, что в самом начале файла что-то не так, но я не уверен в этом. Любые советы или советы будут оценены. Заранее спасибо.

FILE* output_file;
unsigned char input_char;


for(i=0; i <=count-3 && flag2==0; i++)
{
    input_char = chars[i];
    if ((chars[i] == 0xff ) && 
        (chars[i+1] == 0xd8) && 
        (chars[i+2] == 0xff) && 
        (chars[i+3] == 0xe0))
    {
        if (flag==1) {
            puts("closing file I");
            fclose(output_file);
            puts("closed I");
            flag2 = 1;
            break;
        }

        pictures++;
        puts("New pic! I");
        puts("Opening file I!");
        output_file = fopen("image.jpg", "wb");
        putc(input_char, output_file);
        input_char = chars[i+1];
        putc(input_char, output_file);
        input_char = chars[i+2];
        putc(input_char, output_file);
        input_char = chars[i+3];
        putc(input_char, output_file);

        flag = 1;//there is at least one image, so it will need to be closed
    }
    else if ((chars[i] == 0xff) && 
             (chars[i+1] == 0xd8) && 
             (chars[i+2] == 0xff) && 
             (chars[i+3] == 0xe1))
    {
        if (flag==1) {
            puts("closing file II");
            fclose(output_file);
            puts("closed II");
            flag2 = 1;
            break;
        }

        pictures++;
        puts("New pic II!");
        puts("Opening file! II");
        output_file = fopen("Image.jpg", "wb");
        putc(input_char, output_file);
        input_char = chars[i+1];
        putc(input_char, output_file);
        input_char = chars[i+2];
        putc(input_char, output_file);
        input_char = chars[i+3];
        putc(input_char, output_file);

        flag = 1;//there is at least one image, so it will need to be closed
    }
    else
    {
        if (flag==1) //There is an image opened
        {
            putc(input_char, output_file);
        }
    }                
}

1 Ответ

1 голос
/ 19 апреля 2011

Перво-наперво, я думаю, у вас будет больше успеха с полной перезаписью с использованием функции memmem(3) (memmem(3) - это расширение GNU, подобное strstr(3), но для произвольной памяти, а не только для C-строкНетрудно написать собственную версию, если memmem(3) вам еще не доступен.)Конечно, использование memmem(3) будет все еще проблемой, если встроенный файл JPEG будет содержать данные, соответствующие этим байтам заголовка.Я не знаю, что это возможно, но я также не знаю, что это невозможно.Быть осторожен.:)

Этот цикл выглядит не чем иным, как проблемой для поддержания во времени, поэтому я предложил совершенно другой подход.Но если вы привержены этому подходу, обратите внимание, что вы будете копировать байты заголовка несколько раз;Я ожидаю, что первые несколько байтов вашего выходного файла будут на самом деле: 0xff 0xd8 0xff 0xe0 0xd8 0xff 0xe0 - вы не перешли i вперед для учета всех записанных символов в вашем цикле.

Я думаю, что ваш код будетбудет легче читать и поддерживать, если вы замените этот код:

            putc(input_char, output_file);
            input_char = chars[i+1];
            putc(input_char, output_file);
            input_char = chars[i+2];
            putc(input_char, output_file);
            input_char = chars[i+3];
            putc(input_char, output_file);

на этот код:

            putc(chars[i++], output_file);
            putc(chars[i++], output_file);
            putc(chars[i++], output_file);
            putc(chars[i++], output_file);

(i++ - это Исправление , в котором вы не двигаетесь вперед i для каждого символа; удаление переменной input_char - это просто очистка, поскольку мне было труднее читать с переменной, чем без нее.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...