#c #image-processing
#c #обработка изображений
Вопрос:
Обновление: Спасибо за помощь, я разобрался! Мне следовало увеличить 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);
(count — это общее количество байтов)
Вот большая часть моего кода. Я пытаюсь заставить работать только одно изображение, прежде чем просматривать весь файл. Я думал, что это сработает, но я не могу получить изображение. Я получаю файл под названием image.jpg в нем много байтов, но нет изображения. Кажется, что ошибка в самом начале файла, но я не уверен в этом. Будем признательны за любые советы. Заранее спасибо.
FILE* output_file;
unsigned char input_char;
for(i=0; i <=count-3 amp;amp; flag2==0; i )
{
input_char = chars[i];
if ((chars[i] == 0xff ) amp;amp;
(chars[i 1] == 0xd8) amp;amp;
(chars[i 2] == 0xff) amp;amp;
(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) amp;amp;
(chars[i 1] == 0xd8) amp;amp;
(chars[i 2] == 0xff) amp;amp;
(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. Вы должны опубликовать свой ответ и принять его, оставив вопрос в состоянии запроса
2. Кроме того, в зависимости от того, что вы делаете, вы должны использовать библиотеку PNG или реализовать изображение самостоятельно со всей его файловой структурой, а не просто загружать его в память.
Ответ №1:
Перво-наперво, я думаю, у вас было бы больше успеха при полной перезаписи с использованием 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
переменной — это просто очистка, поскольку я обнаружил, что читать с переменной сложнее, чем без нее.)