如何在c中打开几个jpg图像?

问题描述

| 更新: 谢谢您的帮助,我知道了!我应该在使用时增加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);

        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\",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文件包含与这些标头字节匹配的数据,则使用“ 4”仍然是个问题。我不知道这是可能的,但我也不知道这是不可能的。小心。 :) 这个循环看起来很麻烦,但是随着时间的推移很难维护,这就是为什么我建议了一种完全不同的方法。但是,如果您致力于这种方法,请注意,您将多次复制标头字节。我希望输出文件的前几个字节实际上是::9ѭ―您还没有向前迈进ѭ10to来说明循环中的所有书面字符。 我认为如果替换以下代码,您的代码将更易于阅读和维护:
            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);
i++
是错误修复程序,因为您不会为每个字符向前移动
i
;删除
input_char
变量只是清除操作,因为我发现使用该变量比不使用它更难读取。)