c中读取BMP文件时读取头数组中存储的信息
Reading information stored in header array when reading BMP file in c
我正在尝试使用 c 学习图像处理。
#include <stdio.h>
int main(){
FILE *streamIn;
streamIn=fopen("lena512.bmp","r");
//read imageHeader and colorTable
unsigned char header[54];//to store the image header
//unsigned char colorTable[1024];//to store the colorTable,if it exists
for(int i=0;i<54;i++){
header[i]=getc(streamIn);
}
/*
width of the image(18th byte)
height of the image(22nd byte)
bitDepth of the image(28th byte)
*/
int width=*(int*)(&header[18]);
int height=*(int*)(&header[22]);
int bitDepth=*(int*)(&header[28]);
}
我遇到了我无法理解的线。
int width=*(int*)(&header[18]);
为什么我们不能像 int width=(int)(header[18]);?
那样简单地进行类型转换
您正在使用*(int*)(&header[18])
,想知道为什么(int)(header[18])
不能使用。
嗯,这是完全不同的表达方式。
第一个采用 header[18]
的地址,这是一个 unsigned char
,所以这给出了指向此类的指针。将其转换为指向 int
的指针并在赋值中通过 *
取消引用它复制一个完整的 int
从该地址开始,读取所有必要的字节。
第二个简单地读取 header[18]
中的单个 unsigned char
并将 值 转换为 int
。这将仅使用第一个字节。
注意:Microsoft 的 header 文件提供了 BMP header 的结构定义。使用它们要好得多。例如,您可以调用 fread()
来阅读 header.
I came across the line which i couldn't understand.
int width=*(int*)(&header[18]);
写它的人也没有,因为这是在几个不同方面公然未定义的行为。它给出了一个未对齐的地址(在主流系统上)以及一个严格的别名违规。 What is the strict aliasing rule?
最后那三行是bug,你不能那样写C代码。编写此程序的正确方法可能是将数据复制到由 OS API.
提供的预定义结构中
我正在尝试使用 c 学习图像处理。
#include <stdio.h>
int main(){
FILE *streamIn;
streamIn=fopen("lena512.bmp","r");
//read imageHeader and colorTable
unsigned char header[54];//to store the image header
//unsigned char colorTable[1024];//to store the colorTable,if it exists
for(int i=0;i<54;i++){
header[i]=getc(streamIn);
}
/*
width of the image(18th byte)
height of the image(22nd byte)
bitDepth of the image(28th byte)
*/
int width=*(int*)(&header[18]);
int height=*(int*)(&header[22]);
int bitDepth=*(int*)(&header[28]);
}
我遇到了我无法理解的线。
int width=*(int*)(&header[18]);
为什么我们不能像 int width=(int)(header[18]);?
您正在使用*(int*)(&header[18])
,想知道为什么(int)(header[18])
不能使用。
嗯,这是完全不同的表达方式。
第一个采用 header[18]
的地址,这是一个 unsigned char
,所以这给出了指向此类的指针。将其转换为指向 int
的指针并在赋值中通过 *
取消引用它复制一个完整的 int
从该地址开始,读取所有必要的字节。
第二个简单地读取 header[18]
中的单个 unsigned char
并将 值 转换为 int
。这将仅使用第一个字节。
注意:Microsoft 的 header 文件提供了 BMP header 的结构定义。使用它们要好得多。例如,您可以调用 fread()
来阅读 header.
I came across the line which i couldn't understand.
int width=*(int*)(&header[18]);
写它的人也没有,因为这是在几个不同方面公然未定义的行为。它给出了一个未对齐的地址(在主流系统上)以及一个严格的别名违规。 What is the strict aliasing rule?
最后那三行是bug,你不能那样写C代码。编写此程序的正确方法可能是将数据复制到由 OS API.
提供的预定义结构中