繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM