[英]How to open several jpg images in 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 && 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);
}
}
}
首先,我认为使用memmem(3)
函数进行完全重写会有更多的成功( memmem(3)
是像strstr(3)
这样的GNU扩展,但对于任意内存,不仅仅是C字符串如果你还没有memmem(3)
那么编写自己的版本并不困难。) 当然,如果嵌入的JPEG文件包含与这些头字节匹配的数据,则使用memmem(3)
仍然是个问题。 我不知道这是可能的,但我也不知道这是不可能的。 小心。 :)
这个循环看起来只是随着时间的推移而保持麻烦,这就是为什么我提出了一种完全不同的方法。 但是,如果你正在致力于这种方法,请注意,您可以复制你的头字节数次 ; 我希望你的输出文件的前几个字节实际上是: 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
。变量只是清理,因为我发现它比没有它的变量更难以阅读)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.