打开图像文件作为二进制文件,将图像存储为字节串,保存图像 - 可能在普通C中?

时间:2014-04-16 10:54:20

标签: c image io binaryfiles binary-data

我想在C中读取一个图像,我想说,picture.png。我知道我可以在二进制模式下打开它,然后阅读 - 它非常简单。

但我需要更多内容:我希望能够一次读取图像,将其存储在我的代码中,例如,存储在*.h文件中,作为“字符串”,例如:

unsigned char image[] = "0x87 0x45 0x56 ... ";

然后,能够做到:

  1. 删除我从磁盘读取的物理文件
  2. image保存到文件中 - 它将再次创建我的文件,
  3. 即使我从磁盘中删除了图像(我之前读过的已删除的物理文件picture.png)我仍然可以在磁盘上创建图像,只需使用二进制模式将image数组写入文件。在纯C中这可能吗?如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分:2)

当然有可能,但有点不清楚你在追求什么。

有一些独立的程序可以将二进制数据转换为C源代码,您无需实现它。但这样做当然意味着图像成为程序可执行文件的静态部分。

如果你想让它更具动态性,比如在程序运行时为你的程序指定文件名,那么关于转换为C源代码的全部内容就变得毫无意义了。你的程序已经编译完毕。 C程序无法在运行时添加到自己的源中。

更新如果您要做的只是加载文件,请将其保存在内存中然后将其写回,所有这些都在您的程序的同一次运行中,这非常简单。

您可以使用fopen()打开文件,fseek()转到最后,ftell()来读取文件的大小。然后rewind()开始,malloc()一个合适的缓冲区,fread()文件的内容放入缓冲区,fclose()文件。稍后,fopen()一个新的输出文件,并在使用fwrite()关闭文件之前将fclose()缓冲区放入其中。然后你就完成了。您可以根据需要多次重复。它可以是图像,程序,文档或任何其他类型的文件,无关紧要。

答案 1 :(得分:2)

这个任务的特殊格式甚至是XPM,还有一个用来操作这些文件的库。但请记住,由于其性质,它仅适用于相对较小的图像。但是,它在X Window系统中使用多年来提供图标。那些旧的好日子图标宽16x16像素,包含不超过256种颜色:)

答案 2 :(得分:1)

pic2h.c

#include <stdio.h>

int main(int argc, char *argv[]){
    if(argc != 3){
        fprintf(stderr, "Usage >pic2h image.png image.h\n");
        return -1;
    }
    FILE *fi = fopen(argv[1], "rb");
    FILE *fo = fopen(argv[2], "w");
    int ch, count = 0;
    fprintf(fo, "extern unsigned char image[];\n");
    fprintf(fo, "unsigned char image[] =");
    while(EOF!=(ch=fgetc(fi))){
        if(count == 0)
            fprintf(fo, "\n\"");
        fprintf(fo, "\\x%02X", ch);
        if(++count==24){
            count = 0;
            fprintf(fo, "\"");
        }
    }
    if(count){
        fprintf(fo, "\"");
    }
    fprintf(fo, ";\n");

    fclose(fo);
    fclose(fi);
    return 0;
}

resave.c

#include <stdio.h>
#include "image.h"

int main(int argc, char *argv[]){
    if(argc != 2){
        fprintf(stderr, "Usage >resave image.png\n");
        return 0;
    }
    size_t size = sizeof(image)-1;
    FILE *fo = fopen(argv[1], "wb");
    fwrite(image, size, 1, fo);
    fclose(fo);
    return 0;
}