精华内容
下载资源
问答
  • c语言读取bmp图像c语言读取bmp图像

    热门讨论 2009-04-28 14:07:57
    c语言读取bmp图像c语言读取bmp图像c语言读取bmp图像c语言读取bmp图像c语言读取bmp图像c语言读取bmp图像c语言读取bmp图像c语言读取bmp图像c语言读取bmp图像
  • C语言读取bmp图像

    2015-10-29 12:55:26
    C语言读取bmp图像,得到图像的宽、高像素的个数
  • C语言读取BMP图像

    2019-03-14 15:10:36
    c语言实现BMP图像的读取与复制,读取BMP文件表头54个的字节的表头,和再生成一个图片
  • C语言读取BMP图像数据的源码,需要的朋友可以参考一下
  • C语言读取bmp图像并做简单显示

    千次阅读 2020-10-20 19:46:00
    C语言读取bmp图像信息并做简单显示)bmp文件格式读取bmp文件信息并展示 bmp文件格式 bmp文件大体上分为四个部分: bmp文件构成 位图文件头BITMAPFILEHEADER 位图信息头BITMAPINFOHEADER 调色板Palette ...

    C语言读取bmp图像并做简单显示)

    bmp文件格式

    bmp文件大体上分为四个部分:

    bmp文件构成
    位图文件头BITMAPFILEHEADER
    位图信息头BITMAPINFOHEADER
    调色板Palette
    实际的位图数据ImageDate

    第一部分为位图文件头,位图文件头长度固定,为14个字节。

    typdef struct {
    WORD bfType;    //指定文件类型,必须是0x424d,即”BM”
    DWORD bfSize;   //指定文件大小
    WORD bfReserved1; //保留字
    WORD bfReserved2; //保留字
    DWORD bfOffBits; //为文件头到实际的位图数据的偏移字节数,即上图前三部分和
    }bitmapFileHeader;
    

    第二部分为位图信息头,这个结构的长度也是固定的,为40个字节。

    typedef struct {
    	DWORD biSize;  //指这个机构的长度,为40
    	LONG biWidth;  //指定图像的宽度,单位是像素
    	LONG biHeight;  //指定图像的高度,单位是像素
    	WORD biPlanes;  //平面数,必须为1,不用考虑 
    	WORD biBitCount; //指定表示颜色是要用到的位数,常用值为1(黑白二色图),
    	//4(16色图),8(256色),24(真彩色图)(新的.bmp格式支持32位色)
    	DWORD biCompression; //指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFILELDS
    	DWORD biSizeImage; //指定实际的位图数据占用的字节数,其实也可以从以下的公式计算出来:
    	//biSizeImage=bitWidth’*biHeight,bitWidth‘为大于等于bitWidth的4的倍数
    	LONG biXPelsPerMeter; //指定设备的水平分辨率,单位是每米的图像个数
    	LONG biYPelsPerMeter; //同上,垂直分辨率
    	DWORD biClrUsed; //指定本图像实际用到的颜色数,如果该值为零,则用到的颜色数为2^biBitCount
    	DWORD biClrImportant;// 指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的
    }bitmapInfoHeader;
    

    第三部分为调色板(真彩图像不需要调色版,bitmapInfoHeader后直接是数据)调色板实际是一个数组,共有biClrUsed个元素(如果该值为0,则有2^biBitCount个元素),数组中每个元素的类型是一个RGBQUAD结构,占四个字节,其定义如下:

    typedef struct {
    	BYTE rgbBlue; //该颜色的蓝色分量
    	BYTE rgbGreen; //该颜色的绿色分量
    	BYTE rgbRed; //该颜色的红色分量
    	BYTE rgbReserved; //保留值
    } RGBQUAD;
    

    第四部分为实际图像数据
    对于用到调色版的位图,图像数据就是该像素颜在调色板中的索引值。对于真彩图,图像数据就是实际的R、G、B值。

    需要注意两点:
    (1)每一行的字节数必须是4的整倍数,如果不是,则需要补齐。
    (2)一般来说,.bmp文件的数据是从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个像素,然后是左边第二个像素……接下来是倒数第二行左边第一个像素,左边第二个像素……依次类推 ,最后得到的是最上面一行的最右一个像素。

    读取bmp文件信息并展示

    以24位bmp图像为例
    在这里插入图片描述

    定义数据结构:

    typedef struct {
    	unsigned char bfType[2];
    	unsigned long bfSize;
    	unsigned short bfReserved1;
    	unsigned short bfReserved2;
    	unsigned long bfOffBits;
    }bitmapFileHeader;
    
    typedef struct {
    	unsigned long biSize;
    	long biWidth;
    	long biHeight;
    	unsigned short biPlanes;
    	unsigned short biBitCount;
    	unsigned long biCompression;
    	unsigned long biSizeImage;
    	long biXPixPerMeter;
    	long biYPixPerMeter;
    	unsigned long biClrused;
    	unsigned long biClrImportant;
    }bitmapInfoHeader;
    

    读入文件头:

    //仅展示,不用于实验
    int readFileHeader(FILE *fp,bitmapFileHeader*bfHeader){
    	fseek(fp,0,SEEK_SET);
    	fread(bfHeader,sizeof(bitmapFileHeader),1,fp);
    	/*
    	int i;	
    	printf("读入文件头:");
    	char*p=(char*)bfHeader;
    	for(i=0;i<sizeof(bitmapFileHeader);i++,p++){
    		printf("%02x ",*p);
    	}
    	printf("\n");
    	printf("文件头信息如下:\n");
    	printf("文件类型:%c%c\n",bfHeader->bfType[0],bfHeader->bfType[1]);
    	printf("文件大小: %d 字节\n",bfHeader->bfSize);
    	printf("位图数据偏移:%d\n",bfHeader->bfOffBits);
    	*/
    	return 0;
    }
    

    读信息头:

    //仅展示,不用于实验
    int readInfoHeader(FILE*fp,bitmapInfoHeader*biHeader){
    	fseek(fp,14,SEEK_SET);
    	fread(biHeader,sizeof(bitmapInfoHeader),1,fp);
    
    	/*
    	int i;
    	printf("读入位图信息头:\n");
    	char*p=(char*)biHeader;
    	for(i=0;i<sizeof(bitmapInfoHeader);i++,p++){
    		printf("%02x ",*p);
    		if(i%20==0&&i!=0)
    			printf("\n");
    	}
    	printf("\n");
    	printf("位图信息头信息如下:\n");
    	printf("bmp图像宽度:%d\n",biHeader->biWidth);
    	printf("bmp图像高度:%d\n",biHeader->biHeight);
    	printf("bmp图像颜色位数: %d\n",biHeader->biBitCount);
    	printf("bmp图像实际数据占用字节:%d\n",biHeader->biSizeImage);
    	*/
    	return 0;
    }
    

    读入bmp图像数据,并展示

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    
    #pragma pack(1)  //这个选项挺重要,不加的话程序就会报错,原因参考
    //https://blog.csdn.net/qq_44310495/article/details/109181857
    
    typedef struct {
    	unsigned char bfType[2];
    	unsigned long bfSize;
    	unsigned short bfReserved1;
    	unsigned short bfReserved2;
    	unsigned long bfOffBits;
    }bitmapFileHeader;
    
    typedef struct {
    	unsigned long biSize;
    	long biWidth;
    	long biHeight;
    	unsigned short biPlanes;
    	unsigned short biBitCount;
    	unsigned long biCompression;
    	unsigned long biSizeImage;
    	long biXPixPerMeter;
    	long biYPixPerMeter;
    	unsigned long biClrused;
    	unsigned long biClrImportant;
    }bitmapInfoHeader;
    
    int main(){
    	FILE *fp,*fp_txt;
    	if((fp=fopen("d:\Temp\\skull.bmp","rb"))==NULL){
    		perror("can not open file!");
    		return -1;
    	}
    	
    	bitmapFileHeader bfHeader;
    	fread(&bfHeader,14,1,fp);
    	bitmapInfoHeader biHeader;
    	fread(&biHeader,40,1,fp);
    
    	int imSize=biHeader.biSizeImage;
    	int width=biHeader.biWidth;
    	int height=biHeader.biHeight;
    	int bitCount=biHeader.biBitCount;
    
    	fseek(fp,bfHeader.bfOffBits,SEEK_SET);
    	unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));
    	fread(imageData,imSize*sizeof(unsigned char),1,fp);
    
    	//图像为24位图像
    	int lineBytes=(bitCount*width+31)/32*4;//得到图像数据的bitwidth'
    	int i,j;
    	int r,g,b;
    	for(i=0;i<height;i++){ //对于每一行
    		for(j=0;j<width*3;j++){ //对于每一列
    			r=*(imageData+lineBytes*(height-1-i)+j); //从最后一行往上读
    			j++;
    			g=*(imageData+lineBytes*(height-1-i)+j);
    			j++;
    			b=*(imageData+lineBytes*(height-1-i)+j);
    			if(r==255&&g==255&&b==255) //模拟二值图像展示
    				printf("  ");
    			else
    				printf(".$");
    		}
    		printf("\n");
    	}
    	
    	free(imageData);
    	fclose(fp);
    	getchar();
    	return 0;
    }
    

    代码效果展示:
    在这里插入图片描述

    展开全文
  • /* File name: bmpTest.cAuthor: WanChuan XianShengDate: Oct 01, 2011Description: Show all Info a bmp file has. includingFileHeader Info, InfoHeader Info and Data Part.Reference: BMP图像数据的C...

    /* File name:   bmpTest.c

    Author:      WanChuan XianSheng

    Date:        Oct 01, 2011

    Description: Show all Info a bmp file has. including

    FileHeader Info, InfoHeader Info and Data Part.

    Reference: BMP图像数据的C语言读取源码

    */

    #include

    #include

    #define BITMAPFILEHEADERLENGTH 14   // The bmp FileHeader length is 14

    #define BM 19778                    // The ASCII code for BM

    /* Test the file is bmp file or not */

    void bmpFileTest(FILE* fpbmp);

    /* To get the OffSet of header to data part */

    void bmpHeaderPartLength(FILE* fpbmp);

    /* To get the width and height of the bmp file */

    void BmpWidthHeight(FILE* fpbmp);

    /* Show bmp file tagBITMAPFILEHEADER info */

    void bmpFileHeader(FILE* fpbmp);

    /* Show bmp file tagBITMAPINFOHEADER info */

    void bmpInfoHeader(FILE* fpbmp);

    /* Show the Data Part of bmp file */

    void bmpDataPart(FILE* fpbmp);

    unsigned int OffSet = 0;    // OffSet from Header part to Data Part

    long BmpWidth = 0;          // The Width of the Data Part

    long BmpHeight = 0;         // The Height of the Data Part

    int main(int argc, char* argv[])

    {

    /* Open bmp file */

    FILE *fpbmp = fopen("lena.bmp", "r+");

    if (fpbmp == NULL)

    {

    fprintf(stderr, "Open lena.bmp failed!!!n");

    return 1;

    }

    bmpFileTest(fpbmp);                //Test the file is bmp file or not

    bmpHeaderPartLength(fpbmp);        //Get the length of Header Part

    BmpWidthHeight(fpbmp);             //Get the width and width of the Data Part

    //bmpFileHeader(fpbmp);            //Show the FileHeader Information

    //bmpInfoHeader(fpbmp);            //Show the InfoHeader Information

    bmpDataPart(fpbmp);                //Reserve the data to file

    fclose(fpbmp);

    return 0;

    }

    /* Test the file is bmp file or not */

    void bmpFileTest(FILE* fpbmp)

    {

    unsigned short bfType = 0;

    fseek(fpbmp, 0L, SEEK_SET);

    fread(&bfType, sizeof(char), 2, fpbmp);

    if (BM != bfType)

    {

    fprintf(stderr, "This file is not bmp file.!!!n");

    exit(1);

    }

    }

    /* To get the OffSet of header to data part */

    void bmpHeaderPartLength(FILE* fpbmp)

    {

    fseek(fpbmp, 10L, SEEK_SET);

    fread(&OffSet, sizeof(char), 4, fpbmp);

    //printf("The Header Part is of length %d.n", OffSet);

    }

    /* To get the width and height of the bmp file */

    void BmpWidthHeight(FILE* fpbmp)

    {

    fseek(fpbmp, 18L, SEEK_SET);

    fread(&BmpWidth, sizeof(char), 4, fpbmp);

    fread(&BmpHeight, sizeof(char), 4, fpbmp);

    //printf("The Width of the bmp file is %ld.n", BmpWidth);

    //printf("The Height of the bmp file is %ld.n", BmpHeight);

    }

    /* Show bmp file tagBITMAPFILEHEADER info */

    void bmpFileHeader(FILE* fpbmp)

    {

    unsigned short bfType;              //UNIT        bfType;

    unsigned int   bfSize;              //DWORD       bfSize;

    unsigned short bfReserved1;         //UINT        bfReserved1;

    unsigned short bfReserved2;         //UINT        bfReserved2;

    unsigned int   bfOffBits;           //DWORD       bfOffBits;

    fseek(fpbmp, 0L, SEEK_SET);

    fread(&bfType,      sizeof(char), 2, fpbmp);

    fread(&bfSize,      sizeof(char), 4, fpbmp);

    fread(&bfReserved1, sizeof(char), 2, fpbmp);

    fread(&bfReserved2, sizeof(char), 2, fpbmp);

    fread(&bfOffBits,   sizeof(char), 4, fpbmp);

    printf("************************************************n");

    printf("*************tagBITMAPFILEHEADER info***********n");

    printf("************************************************n");

    printf("bfType              is %d.n", bfType);

    printf("bfSize              is %d.n", bfSize);

    printf("bfReserved1         is %d.n", bfReserved1);

    printf("bfReserved2         is %d.n", bfReserved2);

    printf("bfOffBits           is %d.n", bfOffBits);

    }

    /* Show bmp file tagBITMAPINFOHEADER info */

    void bmpInfoHeader(FILE* fpbmp)

    {

    unsigned int biSize;              // DWORD        biSize;

    long         biWidth;                // LONG         biWidth;

    long         biHeight;               // LONG         biHeight;

    unsigned int biPlanes;               // WORD         biPlanes;

    unsigned int biBitCount;             // WORD         biBitCount;

    unsigned int biCompression;          // DWORD        biCompression;

    unsigned int biSizeImage;            // DWORD        biSizeImage;

    long         biXPelsPerMerer;        // LONG         biXPelsPerMerer;

    long           biYPelsPerMerer;        // LONG         biYPelsPerMerer;

    unsigned int biClrUsed;              // DWORD        biClrUsed;

    unsigned int biClrImportant;         // DWORD        biClrImportant;

    fseek(fpbmp, 14L, SEEK_SET);

    fread(&biSize,          sizeof(char), 4, fpbmp);

    fread(&biWidth,         sizeof(char), 4, fpbmp);

    fread(&biHeight,        sizeof(char), 4, fpbmp);

    fread(&biPlanes,        sizeof(char), 4, fpbmp);

    fread(&biBitCount,      sizeof(char), 4, fpbmp);

    fread(&biCompression,   sizeof(char), 4, fpbmp);

    fread(&biSizeImage,     sizeof(char), 4, fpbmp);

    fread(&biXPelsPerMerer, sizeof(char), 4, fpbmp);

    fread(&biYPelsPerMerer, sizeof(char), 4, fpbmp);

    fread(&biClrUsed,       sizeof(char), 4, fpbmp);

    fread(&biClrImportant,  sizeof(char), 4, fpbmp);

    printf("************************************************n");

    printf("*************tagBITMAPINFOHEADER info***********n");

    printf("************************************************n");

    printf("biSize              is %d. n", biSize);

    printf("biWidth             is %ld.n", biWidth);

    printf("biHeight            is %ld.n", biHeight);

    printf("biPlanes            is %d. n", biPlanes);

    printf("biBitCount          is %d. n", biBitCount);

    printf("biCompression       is %d. n", biCompression);

    printf("biSizeImage         is %d. n", biSizeImage);

    printf("biXPelsPerMerer     is %ld.n", biXPelsPerMerer);

    printf("biYPelsPerMerer     is %ld.n", biYPelsPerMerer);

    printf("biClrUsed           is %d. n", biClrUsed);

    printf("biClrImportant      is %d. n", biClrImportant);

    }

    /* Show the Data Part of bmp file */

    void bmpDataPart(FILE* fpbmp)

    {

    int i, j;

    unsigned char bmpPixel[BmpWidth][BmpHeight];

    unsigned char* bmpPixelTmp = NULL;

    FILE* fpDataBmp;

    /* New a file to save the data matrix */

    if((fpDataBmp=fopen("bmpData.dat","w+")) == NULL)

    {

    fprintf(stderr, "Failed to construct file bmpData.dat.!!!");

    exit(1);

    }

    fseek(fpbmp, OffSet, SEEK_SET);

    if ((bmpPixelTmp=(unsigned char*)malloc(sizeof(char)*BmpWidth*BmpHeight))==NULL)

    {

    fprintf(stderr, "Data allocation failed.!!!n");

    exit(1);

    }

    fread(bmpPixelTmp, sizeof(char), BmpWidth*BmpHeight, fpbmp);

    /* Read the data to Matrix and save it in file bmpData.dat */

    for(i =0; i < BmpHeight; i++)

    {

    fprintf(fpDataBmp, "The data in line %-3d:n", i+1);

    for(j = 0; j < BmpWidth; j++)

    {

    bmpPixel[i][j] = bmpPixelTmp[BmpWidth*(BmpHeight-1-i)+j];

    //fwrite(&chartmp, sizeof(char), 1, fpDataBmp);

    fprintf(fpDataBmp, "%-3d ", bmpPixel[i][j]);

    if ((j+1)%32 == 0)

    {

    fprintf(fpDataBmp, "n");

    }

    }

    }

    /* Used to test the data read is true or false

    You can open the file using Matlab to compare the data */

    //printf("bmpPixel[2][3]   is %d.n", bmpPixel[2][3]);

    //printf("bmpPixel[20][30] is %d.n", bmpPixel[20][30]);

    free(bmpPixelTmp);

    fclose(fpDataBmp);

    }

    展开全文
  • C语言读取BMP图像到数组 由四部分组成: A. 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构体,定义如下: typedef struct tagBITMAPFILEHEADER{  WORD bfType; /文件类型,必须是0x424D,即字符串“BM” ...
    C语言读取BMP图像到数组


    由四部分组成:
    A. 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构体,定义如下:
    typedef struct tagBITMAPFILEHEADER{
         WORD    bfType; /文件类型,必须是0x424D,即字符串“BM”
         DWORD   bfSize; /指定文件大小,包括这14个字节
         WORD    bfReserved1; /保留字,不用考虑
         WORD    bfReserved2; /保留字,不用考虑
         DWORD   bfOffBits; /从文件头到实际位图数据的偏移字节数
    }BITMAPFILEHEADER;
    这个结构的长度是固定的,为14个字节(WORD为无符号16位二进制整数,DWORD为无符号32位二进制整数)。
    B. 第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,定义如下:
    typedef struct tagBITMAPINFOHEADER{
    DWORD   biSize; /该结构的长度,为40
    LONG      biWidth; / 图像的宽度,单位是像素
    LONG      biHeight; / 图像的高度,单位是像素
    WORD      biPlanes; / 位平面数,必须是1,不用考虑
    WORD      biBitCount;/ 指定颜色位数,1为二值,4为16色,8为256色,16、24、32为真彩色 DWORD     biCompression; / 指定是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS
    DWORD     biSizeImage; / 实际的位图数据占用的字节数
    LONG      biXPelsPerMeter; / 目标设备水平分辨率,单位是每米的像素数
    LONG      biYPelsPerMeter; / 目标设备垂直分辨率,单位是每米的像素数
    DWORD     biClrUsed;/实际使用的颜色数,若该值为0,则使用颜色数为2的bitBitCount次方种
    DWORD     biClrImportant; /图像中重要的颜色数,若该值为0,则所有的颜色都是重要的
    } BITMAPINFOHEADER;
    这个结构的长度是固定的,为40个字节(LONG为32为二进制整数)。
    偏移 域的名称 长度/字节 内容
    000Eh(14) biSize4
    文件信息头的长度
    40(28h):Windows
    00012h(18) biWidth4 位图的宽度,以像素为单位
    00016h(22) biHeight4 位图的高度,以像素为点为
    001Ah(26) Biplanes2 位图的为平面数(该值总是为1)
    001Ch(28) biBitCount2
    每个像素的位平面数,有下面几种情况:
    1:单色位图
    4:16色位图
    8:256色位图
    16:16bit高彩色位图
    24:24bit真彩色位图
    32:32bit增强型真彩色位图
    001Eh(30) biCompression4
    压缩说明:
    0:不压缩(用BI_RGB表示)
    1:RLE8,使用8位RLE压缩方式(用BI_RLE8表示)
    2:RLE4,使用4位RLE压缩方式(用BI_RLE4表示)
    3:Bitfields:位域存放方式(用BI_BITFIELDS表示)
    0022h(34) biSizeImage4 位图数据的大小,以字节为单位。该数必须是4的倍数。当图像存储的是非压缩数据的时候,它的取值可以为0,实际上,此时位图数据的大小可以通过biBitCount,biWidth,biHeight等计算出来
    0026h(38) biXPelsPerMeter4 用像素/米表示的水平分辨率
    002Ah(42) biYPelsPerMeter4 用像素/米表示的垂直分辨率
    002Eh(46) biClrUsed4 位图使用的颜色数,如果为0则表示使用了全部可能的颜色
    0032h(50) biClrImportant4 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
    C. 第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。真彩色图像不需要调色板,BITMAPINFOHEADER后直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
        typedef struct tagRGBQUAD
    {
           BYTE rgbBlue;   //该颜色的蓝色分量
           BYTE rgbGreen;   //该颜色的绿色分量
           BYTE rgbRed;     //该颜色的红色分量
           BYTE rgbReserved;//保留值
    } RGBQUAD;
    D.第四部分是实际的图像数据,对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图像,图像数据就是实际的R、G、B值:
    • 对于2色位图:用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个
    字节就可以表示8个像素;
    • 对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素;
    • 对于256色位图,一个字节刚好可以表示1个像素;
    色深24位的位图
    ★     每一行的字节数必须是4的整数倍,如果不是,则需要补齐;(bitSizeImage中提到过)
    ★     BMP文件的数据存放是从下到上,从左到右的。也就是说,从文件中最先读到的是图像最下面的左边第一个像素,然后是左边第二个像素,接下来是倒数第二行左边第一个像素,左边第二个像素,依次类推

    每个像素用3个字节表示,顺序依次为红,绿和蓝的值。每行用0填充到4字节的边界。


    C语言实现

    #include <stdio.h>
    #include <stdlib.h>
    #include<windows.h> 

    char buf[1*1024];
    char* pc;
    int* pi;
    unsigned int offset=0;
    long width;
    long heigth;
    int biwidth,biheigth;
    unsigned char rgb[2000][2000*3];

    //struct tagBITMAPFILEHEADER{
    //     WORD    bfType; //文件类型,必须是0x424D,即字符串“BM”
    //     DWORD   bfSize; //指定文件大小,包括这14个字节
    //     WORD    bfReserved1; //保留字,不用考虑
    //     WORD    bfReserved2; //保留字,不用考虑
    //     DWORD   bfOffBits; //从文件头到实际位图数据的偏移字节数
    //} header;


    //typedef struct tagBITMAPINFOHEADER{
    // DWORD  biSize; //该结构的长度,为40
    // LONG      biWidth; // 图像的宽度,单位是像素
    // LONG      biHeight; // 图像的高度,单位是像素
    // WORD      biPlanes; // 位平面数,必须是1,不用考虑
    // WORD      biBitCount; // 指定颜色位数,1为二值,4为16色,8为256色,16、24、32为真彩色 DWORD     biCompression; / 指定是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS
    // DWORD     biSizeImage; // 实际的位图数据占用的字节数
    // LONG      biXPelsPerMeter; // 目标设备水平分辨率,单位是每米的像素数
    // LONG      biYPelsPerMeter; // 目标设备垂直分辨率,单位是每米的像素数
    // DWORD     biClrUsed; //实际使用的颜色数,若该值为0,则使用颜色数为2的bitBitCount次方种
    // DWORD     biClrImportant; //图像中重要的颜色数,若该值为0,则所有的颜色都是重要的
    //} BITMAPINFOHEADER;
    //
    // typedef struct tagRGBQUAD
    //{
    // BYTE rgbBlue; //该颜色的蓝色分量
    // BYTE rgbGreen; //该颜色的绿色分量
    //    BYTE rgbRed; //该颜色的红色分量
    //    BYTE rgbReserved; //保留值
    //} RGBQUAD;

    int main(int argc,char* argv[])
    {


    unsigned char* fp_temp;
    FILE* fpbmp;
    FILE* fpput;
    int i,hc;

    printf("sizeof(DWORD) = %d  sizeof(int) = %d\n",sizeof(DWORD),sizeof(int));
    printf("sizeof(long) = %d  sizeof(long) = %d\n",sizeof(long),sizeof(long));


    fpbmp=fopen("a.bmp","rb+");


    if(fpbmp == NULL)
    {
    printf("FOPEN ERR!\n");
    getchar();
    exit(0);
    }

    offset=fread(&header,1,sizeof(BITMAPFILEHEADER),fpbmp);
    printf("########################## offset=%d ##########################\n",offset);


    pc=(char*)(&header.bfType);
    printf("header.bfType = %c%c\n",pc[0],pc[1]);


    pi=(int*)(&header.bfSize);
    printf("header.bfSize = %d\n",*pi);


    pi=(int*)(&header.bfOffBits);
    printf("header.bfOffBits = %d\n",*pi);


    offset+=fread(&infoheader,1,sizeof(BITMAPINFOHEADER),fpbmp);
    printf("########################## offset=%d ##########################\n",offset);

    pc=(char*)(&infoheader.biSize);
    printf("infoheader.biSize = %d\n",pc[0]+pc[1]*256);

    biwidth=infoheader.biWidth;
    biheigth=infoheader.biHeight;
    printf("infoheader.biWidth = %d\n",biwidth);
    printf("infoheader.biHeight = %d\n",biheigth);


    pc=(char*)(&infoheader.biPlanes);
    printf("infoheader.biPlanes = %d\n",pc[0]+pc[1]*256);


    pc=(char*)(&infoheader.biBitCount);
    printf("infoheader.biBitCount = %d\n",pc[0]+pc[1]*256);

    pc=(char*)(&infoheader.biCompression);
    printf("infoheader.biCompression = %d\n",pc[0]+pc[1]*256);


    pc=(char*)(&infoheader.biSizeImage);
    printf("infoheader.biSizeImage = %d_%d_%d_%d\n",pc[0],pc[1],pc[2],pc[3]);

    printf("infoheader.biXPelsPerMeter = %d\n",infoheader.biXPelsPerMeter);
    printf("infoheader.biYPelsPerMeter = %d\n",infoheader.biYPelsPerMeter);

    pc=(char*)(&infoheader.biClrUsed);
    printf("infoheader.biClrUsed = %d\n",pc[0]+pc[1]*256);

    pc=(char*)(&infoheader.biClrImportant);
    printf("infoheader.biClrImportant = %d\n",pc[0]+pc[1]*256);

    hc=biwidth*3;
    while((hc%4)!=0)
    {
    hc++;
    }

    for(i=0;i<biheigth;i++)
    {
    fread(rgb[i],1,hc,fpbmp);
    }

    return 0;
    }


    转载地址:http://blog.sina.com.cn/s/blog_49dd59fe01011wbj.html

    展开全文
  • C语言读取BMP图像数据

    2014-07-31 10:40:01
    Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象...
  • c语言读取BMP图像

    千次阅读 2017-12-01 16:14:26
    bmp_header //这个结构体就是对上面那个图做一个封装。 { //bmp header U8 Signatue[ 2 ] ; // B M U32 FileSize ; //文件大小 U16 Reserv1 ; U16 Reserv2 ; U32 FileOffset ; //文件头偏移量 ...
    
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    #define  RGB(r,g,b)         (((r>>3)<<11)|((g>>2)<<5)|(b>>3))
    
    typedef  unsigned char  U8 ; 
    typedef  unsigned short U16 ; 
    typedef  unsigned int   U32 ; 
    
    #pragma  pack(1)
    struct bmp_header    //这个结构体就是对上面那个图做一个封装。
    {
        //bmp header
        U8  Signatue[2] ;   // B  M
        U32 FileSize ;     //文件大小
        U16 Reserv1 ; 
        U16 Reserv2 ; 
        U32 FileOffset ;   //文件头偏移量
    
        //DIB header
        U32 DIBHeaderSize ; //DIB头大小
        U32 ImageWidth   ;  //文件宽度
        U32 ImageHight   ;  //文件高度
        U16 Planes       ; 
        U16 BPP          ;  //每个相素点的位数
        U32 Compression  ; 
        U32 ImageSize    ;  //图文件大小
        U32 XPPM ; 
        U32 YPPM ; 
        U32 CCT ; 
        U32 ICC ;          
    };
    #pragma  pack()
    
    int main(int argc , char **argv)
    {
        //判断参数,传进来的参数不等于两个,那么就报错      ./a.out   xxx
        if(argc != 2)
            return -1 ; 
    
        int fd ; 
        int dest_fd ; 
        //以只读的方式打开一个文件  这个文件是rgb888
        fd = open(argv[1] , O_RDONLY);
        if(-1 == fd)
        {
            perror("open bmp file fail");
            return -2 ; 
        }
    
        //打开一个rgb565.bmp的图片
        dest_fd = open("rgb565.bmp" , O_RDWR | O_CREAT|O_TRUNC , 0777);
        if(dest_fd < 0 )
        {
            perror("open rgb565 fail");
            return -3 ; 
        }
    
    
        //定义一个bmp的头
        struct bmp_header  header ; 
    
        int ret ; 
    
        //读出bmp文件头的数据
        ret = read(fd , &header , sizeof(struct bmp_header));
    
        //以下是bmp图的相关数据
        printf(" Signatue[0]      : %c  \n " , header.Signatue[0]  );
        printf(" Signatue[1]      : %c  \n " , header.Signatue[1]  );
        printf(" FileSize         : %d  \n " , header.FileSize     );
        printf(" Reserv1          : %d  \n " , header.Reserv1      );
        printf(" Reserv2          : %d  \n " , header.Reserv2      );
        printf(" FileOffset       : %d  \n " , header.FileOffset   );
        printf(" DIBHeaderSize    : %d  \n " , header.DIBHeaderSize);
        printf(" ImageWidth       : %d  \n " , header.ImageWidth   );
        printf(" ImageHight       : %d  \n " , header.ImageHight   );
        printf(" Planes           : %d  \n " , header.Planes       );
        printf(" BPP              : %d  \n " , header.BPP          );
        printf(" Compression      : %d  \n " , header.Compression  );
        printf(" ImageSize        : %d  \n " , header.ImageSize    );
        printf(" XPPM             : %d  \n " , header.XPPM         );
        printf(" YPPM             : %d  \n " , header.YPPM         );
        printf(" CCT              : %d  \n " , header.CCT          );
        printf(" ICC              : %d  \n " , header.ICC          );
    
        char buffer[header.ImageSize] ; 
    
        read(fd , buffer , header.ImageSize);
    
        close(fd);
    
        //改变地方
        header.BPP = 16 ; 
        header.FileSize = header.ImageWidth*header.ImageHight*2+54 ; 
        header.ImageSize = header.ImageWidth*header.ImageHight*2;
    
        write(dest_fd , &header , sizeof(struct bmp_header));
    
        int row , col ; 
        short data ; 
        char *p = NULL ; 
    
        for(row = 0 ; row < header.ImageHight ; row++)
        {
            for(col = 0 ; col < header.ImageWidth ; col++)
            {
                p =( buffer+(row*header.ImageWidth + col)*3);
                data = RGB((unsigned char)(*(p+2)) , (unsigned char)(*(p                +1)) , (unsigned char )(*(p)));
                write(dest_fd , &data , 2);
            }
        }
    
        close(dest_fd);
    
        return 0 ; 
    }
    
    展开全文
  • C语言读取BMP图像,并进行反色操作

    热门讨论 2011-10-23 22:17:41
    用C/C++编写的读取一个BMP文件的数据,包括文件头,信息头,调色板和像素信息。然后对输入图像进行反色操作(只做了24色真彩图的反色)、、
  • NULL 博文链接:https://feng88724.iteye.com/blog/317013
  • #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &... * 函数功能:图像放缩 * scale = 1.5 裁剪区域图像放大1.5倍 * */ //#pragma DATA_SECTION(scale_...
  • C语言读取BMP图像数据(转)

    千次阅读 2014-07-31 10:30:50
    BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种...
  • BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种...
  • #include #include #include #include #include #include #define WIDTHBYTES(i) ((i+31)/32*4)//#pragma warning(disable: 4996)int main(){... //BMP文件头结构体BITMAPINFOHEADER bi; //BMP信息头结构体FILE...
  • c语言实现BMP图像读取,可运行,代码清楚
  • c语言读取bmp文件

    2016-05-05 15:19:31
    c语言读取bmp文件、vs2010工程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,953
精华内容 1,181
关键字:

c语言读取bmp图像

c语言 订阅