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

标签 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);
        }
    }                
}

最佳答案

首先,我认为使用 memmem(3) 完全重写会更成功。函数( memmem(3) 是类似于 strstr(3) 的 GNU 扩展,但适用于任意内存,而不仅仅是 C 字符串。如果 memmem(3) 对您不可用,编写自己的版本并不难。)。当然,使用 memmem(3)如果嵌入的 JPEG 文件包含与这些 header 字节匹配的数据,这仍然是一个问题。我不知道这是可能的,但我也不知道这是不可能的。当心。 :)

随着时间的推移,这个循环看起来只是维护起来很麻烦,这就是为什么我提出了一种完全不同的方法。但是,如果您致力于这种方法,请注意您将多次复制 header 字节;我希望您的输出文件的前几个字节实际上是: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 变量只是清理,因为我发现使用该变量比不使用它更难阅读。)

关于c - 如何在c中打开几个jpg图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5710572/

相关文章:

c - 在 C 中的系统命令中执行的 linux 命令的成功/失败

image - 消除图像中字符的噪声

Java 图像作为 OpenGL 纹理映射的 ByteBuffer

image-processing - 我们如何通过拥抱人脸库获得多模态模型的注意力分数?

c++ - OpenCV 的段错误(核心转储)

Android:实时图像处理

objective-c - 加快检查点像素颜色的速度

c - 最佳 SSE 无符号 8 位比较

c - 使用 SSE 模拟标准 Math.pow 函数

函数返回类型返回结构指针的编译器抛出错误