我想在C中读取一个图像,我想说,picture.png
。我知道我可以在二进制模式下打开它,然后阅读 - 它非常简单。
但我需要更多内容:我希望能够一次读取图像,将其存储在我的代码中,例如,存储在*.h
文件中,作为“字符串”,例如:
unsigned char image[] = "0x87 0x45 0x56 ... ";
然后,能够做到:
image
保存到文件中 - 它将再次创建我的文件,即使我从磁盘中删除了图像(我之前读过的已删除的物理文件picture.png
)我仍然可以在磁盘上创建图像,只需使用二进制模式将image
数组写入文件。在纯C中这可能吗?如果是这样,我该怎么做?
答案 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;
}