C fread导致数组无法读取
我正在尝试为bmp图像编程一种边缘检测方法,但在使用fread读取数据后,我无法访问保存像素RGB值的数组 图像从fread读取到的数组中很好地写出,自然不变,所以我真的不确定这里发生了什么。我怀疑这与我分配阵列的方式有关,但我不确定需要更改什么。非常感谢您的帮助C fread导致数组无法读取,c,arrays,fread,C,Arrays,Fread,我正在尝试为bmp图像编程一种边缘检测方法,但在使用fread读取数据后,我无法访问保存像素RGB值的数组 图像从fread读取到的数组中很好地写出,自然不变,所以我真的不确定这里发生了什么。我怀疑这与我分配阵列的方式有关,但我不确定需要更改什么。非常感谢您的帮助 struct fileHeader{ unsigned short type; unsigned int size; unsigned short reservedOne, reservedTwo; u
struct fileHeader{
unsigned short type;
unsigned int size;
unsigned short reservedOne, reservedTwo;
unsigned int offset;
}Header;
struct infofileHeader{
unsigned int size;
int width, height;
unsigned short planes;
unsigned short bits;
unsigned int compression;
unsigned int imageSize;
int xResolution, yResolution;
unsigned int colors;
unsigned int importantColors;
} infoHeader;
struct pixel{
unsigned char Red, Green, Blue;
};
int main(int argc, char *argv[])
{
int i;
FILE* image = fopen(argv[1], "rb");
FILE *testFile = fopen("out.bmp", "wb");
fread(&Header.type, 2, 1, image);
fread(&Header.size, 4, 1, image);
fread(&Header.reservedOne, 2, 1, image);
fread(&Header.reservedTwo, 2, 1, image);
fread(&Header.offset, 4, 1, image);
fread(&infoHeader.size, 4, 1, image);
fread(&infoHeader.width, 4, 1, image);
fread(&infoHeader.height, 4, 1, image);
fread(&infoHeader.planes, 2, 1, image);
fread(&infoHeader.bits, 2, 1, image);
fread(&infoHeader.compression, 4, 1, image);
fread(&infoHeader.imageSize, 4, 1, image);
fread(&infoHeader.xResolution, 4, 1, image);
fread(&infoHeader.yResolution, 4, 1, image);
fread(&infoHeader.colors, 4, 1, image);
fread(&infoHeader.importantColors, 4, 1, image);
printf("%X\n", Header.type);
printf("%d\n", Header.size);
printf("%d\n", Header.offset);
printf("Horizontal Resolution: %d\n", infoHeader.width);
printf("Vertical Resolution: %d\n", infoHeader.height);
printf("Total Resolution:Test %d\n", infoHeader.width * infoHeader.height);
struct pixel **pixelArray = malloc(infoHeader.height * sizeof(pixelArray));
if(pixelArray == NULL)printf("Could not allocate memory");
for(i=0; i<infoHeader.height; i++){
pixelArray[i] = (struct pixel*) malloc(infoHeader.width * sizeof(struct pixel));
if(pixelArray[i] == NULL)printf("Could not allocate memory");
}
fread(pixelArray, sizeof(struct pixel), infoHeader.width*infoHeader.height, image);
fclose(image);
fwrite(&Header.type, 2, 1, testFile);
fwrite(&Header.size, 4, 1, testFile);
fwrite(&Header.reservedOne, 2, 1, testFile);
fwrite(&Header.reservedTwo, 2, 1, testFile);
fwrite(&Header.offset, 4, 1, testFile);
fwrite(&infoHeader.size, 4, 1, testFile);
fwrite(&infoHeader.width, 4, 1, testFile);
fwrite(&infoHeader.height, 4, 1, testFile);
fwrite(&infoHeader.planes, 2, 1, testFile);
fwrite(&infoHeader.bits, 2, 1, testFile);
fwrite(&infoHeader.compression, 4, 1, testFile);
fwrite(&infoHeader.imageSize, 4, 1, testFile);
fwrite(&infoHeader.xResolution, 4, 1, testFile);
fwrite(&infoHeader.yResolution, 4, 1, testFile);
fwrite(&infoHeader.colors, 4, 1, testFile);
fwrite(&infoHeader.importantColors, 4, 1, testFile);
fwrite(pixelArray, sizeof(struct pixel), 50000, testFile);
/*for(i=0; i<infoHeader.height; i++){
free(pixelArray[i]);
}
free(pixelArray);*/
fclose(testFile);
return 0;
}
struct文件头{
无符号短型;
无符号整数大小;
未签名的短预留完成,预留两个;
无符号整数偏移量;
}收割台;
结构infofileHeader{
无符号整数大小;
int宽度、高度;
无符号短平面;
无符号短位;
无符号整数压缩;
无符号整数图像大小;
int x分辨率,y分辨率;
无符号整数颜色;
未签名的国际重要颜色;
}信息头;
结构像素{
无符号字符红色、绿色、蓝色;
};
int main(int argc,char*argv[])
{
int i;
文件*image=fopen(argv[1],“rb”);
FILE*testFile=fopen(“out.bmp”、“wb”);
fread(&Header.type,2,1,image);
fread(&Header.size,4,1,图像);
fread(&Header.reservedOne,2,1,图像);
fread(&Header.reservedTwo,2,1,image);
fread(&Header.offset,4,1,图像);
fread(&infoHeader.size,4,1,图像);
fread(&infoHeader.width,4,1,图像);
fread(&infoHeader.height,4,1,图像);
fread(&infoHeader.planes,2,1,图像);
fread(&infoHeader.bits,2,1,image);
fread(&infoHeader.compression,4,1,image);
fread(&infoHeader.imageSize,4,1,image);
fread(&infoHeader.x分辨率,4,1,图像);
fread(&infoHeader.yResolution,4,1,图像);
fread(&infoHeader.colors,4,1,图像);
fread(&infoHeader.importantColors,4,1,image);
printf(“%X\n”,Header.type);
printf(“%d\n”,Header.size);
printf(“%d\n”,Header.offset);
printf(“水平分辨率:%d\n”,infoHeader.width);
printf(“垂直分辨率:%d\n”,infoHeader.height);
printf(“总分辨率:测试%d\n”,infoHeader.width*infoHeader.height);
结构像素**pixelArray=malloc(infoHeader.height*sizeof(pixelArray));
如果(pixelArray==NULL)printf(“无法分配内存”);
对于(i=0;i
您不能以这种方式读取像素,因为您对每行进行了不同的分配
相反,您必须为每一行单独调用fread
您不能以这种方式读取像素,因为您对每行进行了不同的分配
相反,您必须为每一行单独调用fread
您不能以这种方式读取像素,因为您对每行进行了不同的分配
相反,您必须为每一行单独调用fread
您不能以这种方式读取像素,因为您对每行进行了不同的分配
相反,你必须为每一行单独调用fread
。你能澄清“无法访问数组”的意思吗?建议检查fread(像素数组,
的返回值,并与infoHeader.width*infoHeader.height
进行比较。BMP有多种格式。你能澄清一下你的意思吗“无法访问数组”?建议检查fread(pixelArray,
的返回值,并与infoHeader.width*infoHeader.height
进行比较。BMP有多种格式。您能否澄清“无法访问数组”的含义?建议检查fread的返回值(pixelArray,
并与infoHeader.width*infoHeader.height
进行比较。BMP有多种格式。请澄清“无法访问数组”的含义。建议检查fread(pixelArray,
的返回值,并与infoHeader.width*infoHeader.height
进行比较。BMP有多种格式。
...
fread(pixelArray, sizeof(struct pixel), infoHeader.width*infoHeader.height, image);
...