使用Linux中的系統I/O讀取BMP圖片資訊
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#pragma pack(1)
struct file_header{
unsigned short file_type;//檔案標識
unsigned int file_size;//整個檔案的大小
unsigned short freserved1;//保留
unsigned short freserved2;//保留
unsigned int boffset_bits;//點陣圖資料在檔案中的偏移值
};
struct info_header {
unsigned int bitmap_size;//點陣圖資訊的大小
int bitmap_width;//點陣圖寬度
int bitmap_height;//點陣圖高度
unsigned short planes;//點陣圖的位面數
unsigned short image_depth;//點陣圖的影像深度
unsigned int compression;//點陣圖壓縮方式
unsigned int image_size;//點陣圖的資料大小
int x_pels_permeter;//表示水平方向每米的畫素點數量
int y_pels_permeter;//表示垂直方向每米的畫素點數量
unsigned int color_used;//實際使用調色盤的顏色數量
unsigned int color_important;//重要的顏色數量
};
#pragma pack()
int main(int argc, char const *argv[])
{
// int bmp_size = 0; //用於儲存BMP圖片的大小
// int bmp_height = 0; //記錄BMP圖片的高
// int bmp_width = 0; //記錄BMP圖片的寬
//1.BMP圖片的路徑是透過命令列傳遞,所以需要檢測引數有效性
if (2 != argc)
{
printf("argument is invaild\n");
return -1;
}
//2.利用系統呼叫open()開啟待讀取資料的BMP圖片
int bmp_fd = open(argv[1],O_RDWR);
if ( -1 == bmp_fd)
{
printf("open %s is error\n",argv[1]);
return -1;
}
// //3.從被開啟的BMP圖片中讀取影像資訊
// lseek(bmp_fd,2,SEEK_SET);
// read(bmp_fd,&bmp_size,4); //讀取BMP圖片大小
// lseek(bmp_fd,18,SEEK_SET);
// read(bmp_fd,&bmp_width,4); //讀取BMP圖片的寬
// lseek(bmp_fd,22,SEEK_SET);
// read(bmp_fd,&bmp_height,4); //讀取BMP圖片的高
struct file_header s1;
struct info_header s2;
read(bmp_fd,&s1,14);
read(bmp_fd,&s2,40);
//4.輸出BMP資訊
printf("bmp name is %s ,width = %d,height = %d,size = %d\n",argv[1],s2.bitmap_width,s2.bitmap_height,s1.file_size);
return 0;
}