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

时间:2011-04-19 01:16:09

标签: c image-processing

更新: 谢谢你的帮助,我想通了!当我使用

时,我应该增加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);
        }
    }                
}

1 个答案:

答案 0 :(得分:1)

首先,我认为使用memmem(3)函数进行完全重写会有更大的成功(memmem(3)是一个GNU扩展,如strstr(3),但对于任意内存,而不仅仅是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变量只是清理,因为我发现使用变量读取比没有变量更困难。)