【发布时间】:2021-09-28 03:44:22
【问题描述】:
我正在尝试读取一个“.raw”文件,该文件存储使用 C 在相机上拍摄的图像的内容。我想将这些内容存储到 uint16_t * 中。
在下面的代码中,我尝试使用fread() 将此数据存储到一个指针中,然后使用fwrite() 将此数据写入一个测试文件,以检查我的数据是否正确。
但是,当我将文件写回时,当我检查它时它是完全黑色的。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define MAX_ROW 2560
#define MAX_COL 2160
int main()
{
char filename[32] = "image1.raw";
FILE * image_raw = fopen(filename, "rb");
fseek(image_raw, 0, 2);
long filesize = ftell(image_raw);
/*READ IMAGE DATA*/
uint16_t * image_data_ptr;
image_data_ptr = (uint16_t *)malloc(sizeof(uint16_t)*MAX_ROW*MAX_COL);
fread(image_data_ptr, sizeof(uint16_t), filesize, image_raw);
fclose(image_raw);
/*TEST WRITING THE SAME DATA BACK INTO TEST RAW FILE*/
FILE *fp;
fp = fopen("TEST.raw", "w");
fwrite(image_data_ptr, sizeof(uint16_t), filesize, fp);
fclose(fp);
return 0;
}
【问题讨论】:
-
你可能想要
filesize/2。也使用二进制模式 ("wb")。您还可以检查fread或fwrite是否返回任何错误。 -
感谢您的快速回复。使用filesize/2的目的是什么?每次我回信时,我的文件大小都会翻倍,所以我认为您正在做某事。
-
您搜索到文件的末尾以查看它有多大,然后尝试阅读它而不再次搜索。你认为从文件中读取了多少?
-
为什么使用
uint16_t? -
在将输入文件搜索到末尾以获取其大小后,您不会在读取字节之前返回文件的开头。另外,不要使用magic numbers -
fseek(image_raw, 0, SEEK_END);比fseek(image_raw, 0, 2);更容易理解
标签: c image-processing malloc fread