C语言读取BMP文件头、信息头及像素信息

这篇博客介绍了如何使用C语言读取BMP文件的文件头、信息头和像素数据。实验内容包括从指定路径读取BMP文件,根据像素深度分情况读取像素数据,并将其分通道输出到文本文件。此外,还详细说明了如何处理不同像素深度(如24位、8位、4位和1位)的情况,以及如何复制原BMP文件。
摘要由CSDN通过智能技术生成

本学期的实验之一,看网上许多文章关于读取像素的处理并不是很完整,就放上来一个。

/*****************************************************
 * usage:<BMP file><r output><g output><b output><copy file>
 *****************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef unsigned short int WORD;
typedef unsigned int DWORD;
typedef unsigned char BYTE;

typedef struct tagBITMAPFILEHEADER
{
    WORD bfType; // 位图文件的类型,必须为BM(0-1字节)
    DWORD bfSize;  // 位图文件的大小,以字节为单位(2-5字节)
    WORD bfReserved1;  // 位图文件保留字,必须为0(6-7字节)
    WORD bfReserved2;  // 位图文件保留字,必须为0(8-9字节)
    DWORD bfOffBits;  // 位图数据的起始位置(10-13字节),以相对于
    // 位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;


typedef struct tagBITMAPINFOHEADER
{
    DWORD biSize;  // 本结构所占用字节数(14-17字节)
    DWORD biWidth;  // 位图的宽度,以像素为单位(18-21字节)
    DWORD biHeight;  // 位图的高度,以像素为单位(22-25字节)
    WORD biPlanes;  // 目标设备的级别,必须为1(26-27字节)
    WORD biBitCount;  // 每个像素所需的位数,必须是1(双色),(28-29字节)
    // 4(16色),8(256色)或24(真彩色)之一
    DWORD biCompression;  // 位图压缩类型,必须是 0(不压缩),(30-33字节)
    // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    DWORD biSizeImage;  // 位图的大小,以字节为单位(34-37字节)
    DWORD biXPelsPerMeter;  // 位图水平分辨率,每米像素数(38-41字节)
    DWORD biYPelsPerMeter;  // 位图垂直分辨率,每米像素数(42-45字节)
    DWORD biClrUsed;  // 位图实际使用的颜色表中的颜色数(46-49字节) 设为0的话,则说明使用所有调色板项,即2 biBitCount种颜色
    DWORD biClrImportant; // 位图显示过程中重要的颜色数(50-53字节)
}BITMAPINFOHEADER;

typedef struct tagRGBQUAD
{
	BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)
	BYTE rgbGreen;  // 绿色的亮度(值范围为0-255)
	BYTE rgbRed;  // 红色的亮度(值范围为0-255)
	BYTE rgbReserved; // 保留字,必须为0
} RGBQUAD;

int main(int argc, char** argv)
{
    FILE *result_r;// 输出的三个通道文件
    FILE *result_g;
    FILE *result_b;
	FILE *bmp;// 要读入的BMP文件
    FILE *copy;// 要复制的BMP文件
    long real_w;// 一个扫描行的实际占用字节数
    long offset = 0;// 用于偏移每行结尾处的冗余数据
    
	BITMAPFILEHEADER header;// BMP文件头
	BITMAPINFOHEADER info;// BMP信息头
    
    if (argc!=6) {
        printf("usage:<BMP file><r file><g file><b file><copy file>");
        return -1;
    }
    
    if ((bmp=fopen(argv[1], "r"))==NULL) {
        printf("the file of BMP isn't exist\n");
        return -1;
    }

    copy=fopen(argv[5],"w");
    
    fread(&header,14,1,bmp);
    fwrite(&header, 14, 1, copy);
    
    fread(&info,40,1,bmp);
  
  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值