精华内容
下载资源
问答
  • 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图片

    2017-09-07 12:03:35
    压缩包内包含报告及说明文档。源码环境是VC6,在VS内稍做修改之后也可运行。代码是我大一时所写,可能有部分不妥之处,欢迎指正...由于是比赛作品直接压缩上传,压缩包内包含作者信息、还望尊重作者,不喜勿喷,谢谢!
  • C语言读取BMP文件

    2015-02-03 14:09:04
    C语言读取BMP图片并存入工程文件夹中,适用于初学者理解BMP文件的结构和格式。开发环境:VS2010
  • C语言实现BMP图像读取,显示,简单处理!通过结构体变量存储文件头信息,定义动态二维数组实现像素信息的存储!
  • c语言读取BMP

    2011-10-09 18:47:53
    c语言读取BMP,比较冷门,但应该有朋友用的上
  • 【原创】C语言读取BMP格式图片

    千次阅读 2014-05-28 15:54:30
    【原创】C语言读取BMP格式图片


    【原创】C语言读取BMP格式图片


    BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。


    BMP文件格式分析  
    简介
    BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。


    位图文件结构表
    位图文件 位图文件头 14 字节
    位图信息头 40 字节
    彩色表(调色板) 4N 字节
    位图数据 x  字节
     
    构件详解:


    位图文件头  
    位图文件头包含文件类型、文件大小、存放位置等信息。结构定义如下:


      typedef struct tagBITMAPFILEHEADER
      {
            UNIT    bfType;
            DWORD   bfSize;
            UINT    bfReserved1;
            UINT    bfReserved2;
            DWORD   bfOffBits;
      }BITMAPFILEHEADER;
      
    其中:
    bfType    说明文件类型,在windows系统中为BM。
    bfSize    说明文件大小。
    bfReserved1 bfReserved2 保留,设置为0。
    bfOffBits 说明实际图形数据的偏移量。
     


    位图信息头
    位图信息头包含位图的大小、压缩类型、和颜色格式,结构定义如下:


     


      typedef struct tagBITMAPINFOHEADER
      {
            DWORD   biSize;
            LONG    biWidth;
            LONG    biHeight;
            WORD    biPlanes;
            WORD    biBitCount;
            DWORD   biCompression;
            DWORD   biSizeImage;
            LONG    biXPelsPerMerer;
            LONG    biYPelsPerMerer;
            DWORD   biClrUsed;
            DWORD   biClrImportant;
      }BITMAPINFOHEADER;
            
    其中: 
    biSize    说明BITMAPINFOHEADER结构所需字节数,在windows系统中为28h
    biWidth   说明图像宽度
    biHeight  说明图像高度
    biPlanes  为目标设备说明位面数,其值设为1
    biBitCount每个像素的位数,单色位图为1,256色为8,24bit为24。
    biCompression压缩说明,BI_RGB:无压缩,BI_RLE8:8位RLE压缩,BI_RLE4:4位RLE压缩
    biSizeImage说明图像大小,如无压缩,可设为0
    biXPelsPerMeter水平分辨率
    biYPelsPerMeter垂直分辨率
    biClrUsed 位图使用的颜色数
    biImportant重要颜色数目
     


    彩色表
    彩色表包含的元素与位图所具有的颜色数目相同,像素颜色用结构RGBQUAD来表示:


    typedef struct tagRGBQUAD
    {
            BYTE    rgbBlue;
            BYTE    rgbGreen;
            BYTE    rgbRed;
            BYTE    rgbReserved;
    }RGBQUAD;
    其中:
    rgbBlue    指定蓝色强度
    rgbGreen   指定绿色强度
    rgbRed     指定红色强度
    rgbReserved保留,设为0
     


    位图数据
    紧跟在彩色表后的是图像数据阵列,图像每一扫描行由连续的字节组成,扫描行由底向上存储,阵列中第一字节为左下角像素,最后一字节为右上角像素。


    源代码1

    /* File name:   bmpTest.c
       Description: Show all Info a bmp file has. including 
       FileHeader Info, InfoHeader Info and Data Part.
       Reference: BMP图像数据的C语言读取源码
    */
    
    #include "stdafx.h"
    //#include <stdio.h>
    #include <stdlib.h>
    
    #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 = 0L;          // The Width of the Data Part
    long BmpHeight = 0L;         // The Height of the Data Part
    
    int main(int argc, char* argv[])
    {
         /* Open bmp file */
    //   FILE *fpbmp = fopen("lena.bmp", "r+");
         FILE *fpbmp = fopen("picture.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 bmpPixel[1000][1000];
    	 //因为暂时还未找到好的方法,暂且长和宽都设为1000,如果图像的尺寸大于1000,则要重新设置
    
    
         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);
    }
    


    源代码2

    // 读取图像2.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    //#include <stdio.h>
    #include <stdlib.h>
    
    
    #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);
    //get r,g,b data
    void bmpDataPart(FILE* fpbmp);
    // output data to corresponding txt file
    void bmpoutput(FILE *fpout);
    
    unsigned int OffSet = 0;    // OffSet from Header part to Data Part
    long width ;          // The Width of the Data Part
    long height ;         // The Height of the Data Part
    unsigned char r[2000][2000],output_r[2000][2000];
    unsigned char g[2000][2000],output_g[2000][2000];
    unsigned char b[2000][2000],output_b[2000][2000];
    
    
    int main(int argc, char* argv[])
    {
         /* Open bmp file */
    	unsigned char *fp_temp;
    
    
        FILE *fpbmp;
        FILE *fpout;
    
    
        fpbmp= fopen("lena.bmp", "rb");
    
    
        if (fpbmp == NULL)
        {
    		printf("Open bmp failed!!!\n");
    		return 1;
        }
    
    
        fpout= fopen("out.bmp", "wb+");
        if (fpout == NULL)
        {
    		printf("Open out.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
         
         
    	//
    	fseek(fpbmp, 0L, SEEK_SET);
    	fseek(fpout, 0L, SEEK_SET);
    	 
    	fp_temp=(unsigned char *)malloc(OffSet);
    	fread(fp_temp, 1, OffSet, fpbmp);
    	fwrite(fp_temp,1,OffSet,fpout);
    		 
    	bmpDataPart(fpbmp);                //Reserve the data to file 
         
    
    	/*
    	 
    	 
    	 如果您想对图片进行处理,请您再这里插入处理函数!!!!!!!!!!!!!!!!!!
    	 
    	*/
    	bmpoutput(fpout);
    	fclose(fpbmp);
    	fclose(fpout);
        return 0;
    }
    
    
    void bmpoutput(FILE* fpout)
    {
    	int i, j=0;
    	int stride;
    	unsigned char* pixout=NULL;
    	   
    	stride=(24*width+31)/8;
    	stride=stride/4*4;
    	pixout=(unsigned char *)malloc(stride);
    	 
    	fseek(fpout, OffSet, SEEK_SET);
    	for(j=0;j<height;j++)
    	{
    	   for(i=0;i<width;i++)
    			{
    				pixout[i*3+2]=output_r[height-1-j][i];
    				pixout[i*3+1]=output_g[height-1-j][i];
    				pixout[i*3]  =output_b[height-1-j][i];
    			}
    		fwrite(pixout, 1, stride, fpout);
    
    	}
    }
    
    
    void bmpDataPart(FILE* fpbmp)
    {
        int i, j=0;
    	int stride;
    	unsigned char* pix=NULL;
    
    	FILE* fpr;
    	FILE* fpg;
    	FILE* fpb;
         
        if((fpr=fopen("bmpr.txt","w+")) == NULL)
        {
    		printf("Failed to construct file bmpr.txt.!!!");
    		exit(1);
        }
        if((fpg=fopen("bmpg.txt","w+")) == NULL)
        {
    		printf("Failed to construct file bmpg.txt.!!!");
    		exit(1);
        }
    	if((fpb=fopen("bmpb.txt","w+")) == NULL)
        {
    	printf("Failed to construct file bmpb.txt.!!!");
    	exit(1);
        }
     
        fseek(fpbmp, OffSet, SEEK_SET);
    	stride=(24*width+31)/8;
    	stride=stride/4*4;
    	pix=(unsigned char *)malloc(stride);
     
    	for(j=0;j<height;j++)
    	{
    		fread(pix, 1, stride, fpbmp);
    
    		for(i=0;i<width;i++)
    		{
    			r[height-1-j][i] = pix[i*3+2];
    			g[height-1-j][i] = pix[i*3+1];
    			b[height-1-j][i] = pix[i*3];
    
    
    			output_r[height-1-j][i] = pix[i*3+2];
    			output_g[height-1-j][i] = pix[i*3+1];
    			output_b[height-1-j][i] = pix[i*3];
    		}
    	}
    
    	for(i =0; i < height; i++)
        {
    		for(j = 0; j < width-1; j++)
    		{   
    			fprintf(fpb,"%4d",b[i][j]);
    			fprintf(fpg,"%4d",g[i][j]);
    			fprintf(fpr,"%4d",r[i][j]);
    		}
    		fprintf(fpb,"%4d\n",b[i][j]);
    		fprintf(fpg,"%4d\n",g[i][j]);
    		fprintf(fpr,"%4d\n",r[i][j]);
    	}
      
    	fclose(fpr);
    	fclose(fpg);
    	fclose(fpb); 
    }
    
    
    void bmpFileTest(FILE* fpbmp)
    {     
         unsigned short bfType = 0;
     
         fseek(fpbmp, 0L, SEEK_SET);//seek_set 起始位置
         fread(&bfType, sizeof(char), 2, fpbmp);
         if (BM != bfType)
         {
    		 printf("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(&width, sizeof(char), 4, fpbmp);
        fseek(fpbmp, 22L, SEEK_SET);
        fread(&height, sizeof(char), 4, fpbmp);
        printf("The Width of the bmp file is %ld.\n", width);
        printf("The Height of the bmp file is %ld.\n", height);
    }
    



    展开全文
  • c语言读取bmp文件

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

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

    2019-03-14 15:10:36
    c语言实现BMP图像的读取与复制,读取BMP文件表头54个的字节的表头,和再生成一个图片
  • c语言读取BMP图片的RGB数据

    万次阅读 2013-04-08 11:32:59
    BMP图片是位图(bitmap),一般未压缩,要读取BMP文件只要指导它的文件结构就可以了,具体格式可以百度或者google,就不多说了,几个重要的点在代码里面有注释。 /** c语言读取位图信息 **/ #include #include ...

    BMP图片是位图(bitmap),一般未压缩,要读取BMP文件只要知道它的文件结构就可以了,具体格式可以百度或者google,就不多说了,几个重要的点在代码里面有注释。

    /**
    	c语言读取位图信息 
    **/
    
    #include<stdio.h>
    #include<malloc.h>
    
    #define BM 19778		// 位图的标志
    
    #define PATH "d:\\test.bmp"  //打开的文件路径 
    
    //判断是否是位图,在0-1字节 
    int IsBitMap(FILE *fp)
    {
    	unsigned short s;
    	fread(&s,1,2,fp);
    	if(s==BM)
    		return 1;
    	else
    		return 0;
    } 
    
    //获得图片的宽度,在18-21字节 
    long getWidth(FILE *fp)
    {
    	long width;
    	fseek(fp,18,SEEK_SET);
    	fread(&width,1,4,fp);
    	return width;	
    }
    
    //获得图片的高度 ,在22-25字节 
    long getHeight(FILE *fp)
    {
    	long height;
    	fseek(fp,22,SEEK_SET);
    	fread(&height,1,4,fp);
    	return height;	
    }  
    
    //获得每个像素的位数,在28-29字节 
    unsigned short getBit(FILE *fp)
    {
    	unsigned short bit;
    	fseek(fp,28,SEEK_SET);
    	fread(&bit,1,2,fp);
    	return bit;
    } 
    
    //获得数据的起始位置
    unsigned int getOffSet(FILE *fp)
    {
    	unsigned int OffSet;
    	fseek(fp,10L,SEEK_SET);
    	fread(&OffSet,1,4,fp);
    	return OffSet;
    }
    
    //获得图像的数据
    void getData(FILE* fp,unsigned char *r,unsigned char *g,unsigned char *b)
    {
        FILE* fpr;
    	FILE* fpg;
    	FILE* fpb;
    	
    	int i, j=0;
    	int stride;
    	unsigned char* pix=NULL;
    	long height,width;
    	height=getHeight(fp);
    	width=getWidth(fp);
    
    	fseek(fp, getOffSet(fp), SEEK_SET);	//找到位图的数据区 
    	
    	stride=(24*width+31)/8;	//对齐,计算一个width有多少个8位 
    	stride=stride/4*4;		//取四的倍数 r,g,b,alph 
    	
    	//写入数组 
    	pix=(unsigned char *)malloc(stride);
    	for(j=0;j<height;j++)
    	{
    	   fread(pix, 1, stride, fp);
    	   for(i=0;i<width;i++)
    		{
    			*(r+(height-1-j)+i)=pix[i*3+2];
    			*(g+(height-1-j)+i)=pix[i*3+1];
    			*(b+(height-1-j)+i)=pix[i*3];
    		}
    	}
    	
    	//写入文件 
    	fpr=fopen("d:\\bmpr.txt","w+");
    	fpg=fopen("d:\\bmpg.txt","w+");
    	fpb=fopen("d:\\bmpb.txt","w+");
    	
    	for(i =0; i < height; i++)
         {
    		for(j = 0; j < width-1; j++)
    		{   
    		fprintf(fpr,"%4d",*(r+i+j));
    		fprintf(fpg,"%4d",*(g+i+j));
    		fprintf(fpb,"%4d",*(b+i+j));
    		}
    		fprintf(fpr,"%4d",*(r+i+j));
    		fprintf(fpg,"%4d",*(g+i+j));
    		fprintf(fpb,"%4d",*(b+i+j));
     	}
    	  
    	fclose(fpr);
    	fclose(fpg);
    	fclose(fpb);
    		 
    } 
    
    
    int main()
    {
    	long width,height;
    	FILE *fp=fopen(PATH,"r");
    	unsigned char *r,*g,*b;
    	int i,j;
    	r=(unsigned char *)malloc(4000);
    	b=(unsigned char *)malloc(4000);
    	g=(unsigned char *)malloc(4000);
    	
    	if(IsBitMap(fp))
    		printf("该文件是位图!\n");
    	else
    		{
    			printf("该文件不是位图!\n");
    			fclose(fp);
    			return 0; 
    		} 
    			
    	printf("width=%ld\nheight=%ld\n",getWidth(fp),getHeight(fp));
    	
    	printf("该图像是%d位图\n",getBit(fp));
    	
    	printf("OffSet=%d\n",getOffSet(fp));
    		
    	getData(fp,r,g,b);
    	
    	return 1;
    }


    展开全文
  • C语言读取BMP格式图片

    万次阅读 多人点赞 2012-09-08 10:06:24
    C语言读取BMP格式图片 BMP 维基百科,自由的百科全书 汉漢▼ 位图 扩展名 .bmp 开发者 Microsoft 格式 图像文件格式  本文介绍的是一种图像文件...

                                                                                                                                               C语言读取BMP格式图片


    BMP

    维基百科,自由的百科全书
    位图
    扩展名 .bmp
    开发者 Microsoft
    格式 图像文件格式

    BMP取自位图BitMaP的缩写,也称为DIB(与设备无关的位图)是微软视窗图形子系统(Graphics Device Interface)内部使用的一种位图图形格式,它是微软视窗平台上的一个简单的图形文件格式

    图像通常保存的颜色深度有2(1位)、16(4位)、256(8位)、65536(16位)和1670万(24位)种颜色(其中位是表示每点所用的数据位)。8位图像可以是索引彩色图像外,也可以是灰阶图像。表示透明alpha通道也可以保存在一个类似于灰阶图像的独立文件中。带有集成的alpha通道的32位版本已经随着Windows XP出现,它在视窗的登录和主题系统中都有使用,但是还没有多少图像编辑软件支持。

    目录

      [隐藏

    [编辑]存储算法

    BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其他低速或者有容量限制的媒介上进行传输。

    根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。图片浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。

    n位2n种颜色的包含调色板的位图近似字节数可以用下面的公式计算:

    BMP文件大小 \approx 54+4 \cdot 2^n+\frac{{\rm width} \cdot {\rm height} \cdot n}{8},其中高度(height)和宽度(width)都以像素为单位。

    需要注意的是上面公式中的54是位图文件的文件头4 \cdot 2^n是彩色调色板的大小。 如果位图文件不包含调色板,如24位,32位位图,则位图的近似字节数可以用下面的公式计算:

    BMP文件大小 \approx 54+\frac{{\rm width} \cdot {\rm height} \cdot n}{8},其中高度(height)和宽度(width)都以像素为单位。

    另外需要注意的是这是一个近似值,对于n位的位图图像来说,尽管可能有最多2^n种颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于4 \cdot 2^n

    如果想知道这些值是如何得到的,请参考下面文件格式的部分。

    由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。

    [编辑]典型的文件格式

    典型的位图文件格式通常包含下面几个数据块:

    • 位图头:保存位图文件的总体信息。
    • 位图信息:保存位图图像的详细信息。
    • 调色板:保存所用颜色的定义。
    • 位图数据:保存一个又一个像素的实际图像。

    下面的部分将会详细地描述位图文件中保存的数据。需要注意的是这是标准位图的文件格式,其他一些位图图像可能根据生成文件的应用程序不同所使用格式可能会有细微的区别。

    [编辑]位图头

    这部分是识别信息,典型的应用程序会首先普通读取这部分数据以确保的确是位图文件并且没有损坏。

    • 字节 #0-1 保存位图文件的标识符,这两个字节的典型数据是BM
    • 字节 #2-5 使用一个dword保存位图文件大小。
    • 字节 #6-9 是保留部分,留做以后的扩展使用,对实际的解码格式没有影响。
    • 字节 #10-13 保存位图数据位置的地址偏移,也就是起始地址。

    [编辑]位图信息

    这部分告诉应用程序图像的详细信息,在屏幕上显示图像将会使用这些信息,它从文件的第15个字节开始。

    • 字节 #14-17 定义以下用来描述影像的区块(BitmapInfoHeader)的大小。它的值是:40 - Windows 3.2、95、NT、12 - OS/2 1.x、240 - OS/2 2.x
    • 字节 #18-21 保存位图宽度(以像素个数表示)。
    • 字节 #22-25 保存位图高度(以像素个数表示)。
    • 字节 #26-27 保存所用彩色位面的个数。不经常使用。
    • 字节 #28-29 保存每个像素的位数,它是图像的颜色深度。常用值是1、4、8(灰阶)和24(彩色)。
    • 字节 #30-33 定义所用的压缩算法。允许的值是0、1、2、3、4、5。
    0 - 没有压缩(也用BI_RGB表示)
    1 - 行程长度编码 8位/像素(也用BI_RLE8表示)
    2 - 行程长度编码4位/像素(也用BI_RLE4表示)
    3 - Bit field(也用BI_BITFIELDS表示)
    4 - JPEG图像(也用BI_JPEG表示)
    5 - PNG图像(也用BI_PNG表示)
    

    然而,由于大多数位图文件都是不压缩的,所以最常用的值是0。

    • 字节 #34-37 保存图像大小。这是原始(en:raw)位图数据的大小,不要与文件大小混淆。
    • 字节 #38-41 保存图像水平方向分辨率。
    • 字节 #42-45 保存图像竖直方向分辨率。
    • 字节 #46-49 保存所用颜色数目。
    • 字节 #50-53 保存所用重要颜色数目。当每个颜色都重要时这个值与颜色数目相等。

    [编辑]调色板

    这部分定义了图像中所用的颜色。如上所述,位图图像一个像素接着一个像素储存,每个像素使用一个或者多个字节的值表示,所以调色板的目的就是要告诉应用程序这些值所对应的实际颜色。

    典型的位图文件使用RGB彩色模型。在这种模型中,每种颜色都是由不同强度(从0到最大强度)的红色(R)、绿色(G)和蓝色(B)组成的,也就是说,每种颜色都可以使用红色、绿色和蓝色的值所定义。

    在位图文件的实现中,调色板可以包含很多条目,条目个数就是图像中所使用的颜色的个数。每个条目包含4个字节:其中三个表示红色、绿色和蓝色,第四个字节没有使用(大多数应用程序将它设为0)。对于每个字节,数值0表示相应的颜色在当前的图像文件中没有使用,而数值255表示那个颜色使用最大的强度。

    [编辑]位图数据

    这部分逐个像素表示图像。像素是从下到上、从左到右保存的。每个像素使用一个或者多个字节表示。如果一个图像水平线的字节数不是4的倍数,这行就使用空字节补齐,通常是ASCII码0。

    范例: 有一张5*5的图片,应该会有25个pixels,但是因为5不是4的倍数所以会显示成: xxxxx000 xxxxx000 xxxxx000 xxxxx000 xxxxx000

    x代表调色盘的编号 0代表Null_character

    有一张4*4的图片,应该会有16个pixels,但是因为是4的倍数所以会显示成:

    xxxx xxxx xxxx xxxx

    [编辑]其他

    尽管文件大小比较大,但是位图文件的简单性、在微软视窗和其他地方的广泛使用以及这种格式的优秀文档标准以及没有专利约束,使得它成为其他操作系统图像处理程序能够读写的一种最为常用的格式。

    X Window System使用类似的.XBM格式表示一位黑白图像以及.XPMpixelmap)表示彩色图像。另外还有一种.RAW格式,它除了保存原始数据之外没有任何其他信息。其他还有Portable Pixmap file format.PPM)和Truevision TGA.TGA),但是它们用得很少或者只用于特殊目的。尽管其他格式也保存为“位图”(与矢量图不同),但是它们使用数据压缩或者颜色索引,所以它们不是严格意义上的位图。

    由于包含有冗余信息,许多BMP文件使用类似于ZIP这样的无损数据压缩算法能够取得很好的压缩效果。


    如果您已经详细阅读维基百科对bmp文件格式的描述,就不难发现,读取bmp大致只需要用到fseek,fopen,fread等函数即可以完成,下面我给出相应的C代码,读取的图像头文件信息主要是offset,width,height,数据信息主要是r[][],g[][],b[][],同时把数据输出到相应的txt文件中。


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


    #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);
    //get r,g,b data
    void bmpDataPart(FILE* fpbmp);
    // output data to corresponding txt file
    void bmpoutput(FILE *fpout);

    unsigned int OffSet = 0;    // OffSet from Header part to Data Part
    long width ;          // The Width of the Data Part
    long height ;         // The Height of the Data Part
    unsigned char r[2000][2000],output_r[2000][2000];
    unsigned char g[2000][2000],output_g[2000][2000];
    unsigned char b[2000][2000],output_b[2000][2000];


    int main(int argc, char* argv[])
    {
         /* Open bmp file */
    unsigned char *fp_temp;


         FILE *fpbmp;
         FILE *fpout;


         fpbmp= fopen("1.bmp", "rb");

         if (fpbmp == NULL)
         {
     printf("Open bmp failed!!!\n");
     return 1;
         }


         fpout= fopen("out.bmp", "wb+");
         if (fpout == NULL)
         {
     printf("Open out.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
         
         
    //
    fseek(fpbmp, 0L, SEEK_SET);
    fseek(fpout, 0L, SEEK_SET);
     
    fp_temp=malloc(OffSet);
             fread(fp_temp, 1, OffSet, fpbmp);
    fwrite(fp_temp,1,OffSet,fpout);
         
    bmpDataPart(fpbmp);                //Reserve the data to file 
         

    /*
     
     
     如果您想对图片进行处理,请您再这里插入处理函数!!!!!!!!!!!!!!!!!!
     
    */
    bmpoutput(fpout);
    fclose(fpbmp);
    fclose(fpout);
             return 0;
    }


    void bmpoutput(FILE* fpout)
    {
             int i, j=0;
             int stride;
    unsigned char* pixout=NULL;
       
    stride=(24*width+31)/8;
    stride=stride/4*4;
    pixout=malloc(stride);
     
    fseek(fpout, OffSet, SEEK_SET);


    for(j=0;j<height;j++)
    {



       for(i=0;i<width;i++)
            {
                pixout[i*3+2]=output_r[height-1-j][i];
                pixout[i*3+1]=output_g[height-1-j][i];
                pixout[i*3]  =output_b[height-1-j][i];
            }
    fwrite(pixout, 1, stride, fpout);

    }
    }


    void bmpDataPart(FILE* fpbmp)
    {
             int i, j=0;
    int stride;
    unsigned char* pix=NULL;

    FILE* fpr;
             FILE* fpg;
    FILE* fpb;
         
         if((fpr=fopen("bmpr.txt","w+")) == NULL)
         {
        printf("Failed to construct file bmpr.txt.!!!");
    exit(1);
         }


         if((fpg=fopen("bmpg.txt","w+")) == NULL)
         {
     printf("Failed to construct file bmpg.txt.!!!");
     exit(1);
         }


    if((fpb=fopen("bmpb.txt","w+")) == NULL)
         {
    printf("Failed to construct file bmpb.txt.!!!");
    exit(1);
         }
     
         fseek(fpbmp, OffSet, SEEK_SET);
    stride=(24*width+31)/8;
    stride=stride/4*4;
    pix=malloc(stride);
     
    for(j=0;j<height;j++)
    {
    fread(pix, 1, stride, fpbmp);

       for(i=0;i<width;i++)
            {
                r[height-1-j][i]   =pix[i*3+2];
                g[height-1-j][i]   =pix[i*3+1];
                b[height-1-j][i]   =pix[i*3];


    output_r[height-1-j][i]   =pix[i*3+2];
                output_g[height-1-j][i]   =pix[i*3+1];
                output_b[height-1-j][i]   =pix[i*3];
            }

    }


     for(i =0; i < height; i++)
         {
    for(j = 0; j < width-1; j++)
    {   
    fprintf(fpb,"%4d",b[i][j]);
    fprintf(fpg,"%4d",g[i][j]);
    fprintf(fpr,"%4d",r[i][j]);
    }
    fprintf(fpb,"%4d\n",b[i][j]);
    fprintf(fpg,"%4d\n",g[i][j]);
    fprintf(fpr,"%4d\n",r[i][j]);
     }
      
    fclose(fpr);
    fclose(fpg);
    fclose(fpb);
     
    }


    void bmpFileTest(FILE* fpbmp)
    {     
         unsigned short bfType = 0;
     
         fseek(fpbmp, 0L, SEEK_SET);//seek_set 起始位置
         fread(&bfType, sizeof(char), 2, fpbmp);
         if (BM != bfType)
         {
     printf("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(&width, sizeof(char), 4, fpbmp);
         fseek(fpbmp, 22L, SEEK_SET);
         fread(&height, sizeof(char), 4, fpbmp);
         printf("The Width of the bmp file is %ld.\n", width);
         printf("The Height of the bmp file is %ld.\n", height);
    }

    展开全文
  • BMP文件信息读取并在CMD窗口显示图片 位图的基本格式可以参考其它博客,这里不进行详细说明。 原始图片及文件信息 原始图片可以在网上下载24位颜色的位图,然后用画图工具进行裁剪编辑,为简单起见,我们限定只...

    C语言读取BMP文件信息并在CMD窗口显示图片

    位图的基本格式可以参考其它博客,这里不进行详细说明。该实验可以更加深入地理解位图的文件结构,以及C语言文件操作的方法。并且理解字节对齐的根本含义。

    原始图片及文件信息

    原始图片可以在网上下载24位颜色的位图,然后用画图工具进行裁剪编辑,为简单起见,我们限定只使用黑白两种颜色,位图的大小建议不要过大,因为CMD窗口无法显示完全。

    这里写图片描述
    这里写图片描述

    效果图


    效果图

    字节对齐

    不使用单字节对齐系统默认四字节对齐。

    这里写图片描述

    代码及说明

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <malloc.h> 
    //单字节对齐
    #pragma pack(1)
    typedef struct BitmapFileHeader
    {
        unsigned char bfType[2];//文件格式
        unsigned long bfSize;//文件大小
        unsigned short bfReserved1;//保留
        unsigned short bfReserved2;//保留
        unsigned long bfOffBits; //图片数据在文件中的偏移量
    }fileHeader;
    typedef struct BitmapInfoHeader
    {
        unsigned long biSize;//该结构的大小
        long biWidth;//文件宽度
        long biHeight;//文件高度
        unsigned short biPlanes;//平面数
        unsigned short biBitCount;//颜色位数
        unsigned long biCompression;//压缩类型
        unsigned long biSizeImage;//DIB数据区大小
        long biXPixPerMeter;
        long biYPixPerMeter;
        unsigned long biClrUsed;//颜色索引表数目
        unsigned long biClrImporant;//重要颜色数目
    }fileInfo;
    
    int main(void)
    {
        FILE *fpaa;
        if ((fpaa = fopen("aa.bmp", "rb") )== NULL)
        {
            printf("打开文件失败");
            exit(0);
        }
        printf("fpaa偏移量:  %d\n", ftell(fpaa));
        fileHeader *fh;
        printf("fileHeader结构体大小:   %d字节\n", sizeof(fileHeader));
        //如果不采样单字节对齐,申请内存时相对于aa.bmp就多出两个字节
        fh= (fileHeader *)malloc(sizeof(fileHeader));
        fread(fh, sizeof(fileHeader), 1, fpaa);
        printf("头文件格式:  %c%cP\n", fh->bfType[0], fh->bfType[1]);
        printf("头文件大小:  %d字节\n", fh->bfSize);
        printf("DIB数据在文件中的偏移量:  %d字节\n", fh->bfOffBits);
        printf("fpaa读取头文件后偏移量:  %d\n",ftell(fpaa));
        fileInfo * fi;
        fi = (fileInfo *)malloc(sizeof(fileInfo));
        fread(fi, sizeof(fileInfo), 1, fpaa);
        printf("fpaa读取信息文件后偏移量:  %d\n", ftell(fpaa));
        printf("位图信息大小: %d\n",fi->biSize);
        printf("文件宽度: %d\n", fi->biWidth);
        printf("文件高度: %d\n", fi->biHeight);
        printf("平面数: %d\n", fi->biPlanes);
        printf("颜色位数: %d\n", fi->biBitCount);
        printf("压缩类型: %d\n", fi->biCompression);
        printf("DIB数据区大小: %d\n", fi->biCompression);
        printf("颜色索引表: %d\n", fi->biClrUsed);
        printf("重要颜色: %d\n", fi->biClrImporant);
    
        printf("\n");
    
        struct color 
        {
            char r;
            char g;
            char b;
        };
        struct color *fc;
        fc = (struct color *)malloc(sizeof(struct color));
        for (int i = 1; i <=fi->biHeight; i ++)
        {
            fseek(fpaa, -((((fi->biBitCount * fi->biWidth) + 31) >> 5) << 2)*i, SEEK_END);
            for (int j = 1; j <= fi->biWidth; j ++ )
            {
                fread(fc, sizeof(struct color), 1, fpaa);
                if (fc->r == 0 & fc->g == 0 & fc->b == 0) printf("%c ",3);
                else printf("%c ", 46);
            }
            printf("\n");
            //((图像宽度*每个像素bites+31)/32)*4可保证每一列为4字节对齐,因为计算机为了速度每次取四字节,不足的要填0
            //下方表达式显示每行多出几个字节
            int k = ((((fi->biBitCount * fi->biWidth) + 31) >> 5) << 2) - ((fi->biBitCount * fi->biWidth) >> 3);
            //再将文件指针移出这几个填充字节
            fseek(fpaa, k, SEEK_CUR);
        }
    
        //可以用不同符号代替黑白
        /*int m=10;
        for (int l=1;l<100;l++)
        {
            printf("%d:%c  ", l,l);
                if (m==0)
                {
                    m = 10;
                    printf("\n");
                }
                m--;
        }
        */
        getchar();
        return 0;
    }
    展开全文
  • C语言读取BMP图像数据的源码,需要的朋友可以参考一下
  • C语言读取BMP图像到数组 由四部分组成: A. 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构体,定义如下: typedef struct tagBITMAPFILEHEADER{  WORD bfType; /文件类型,必须是0x424D,即字符串“BM” ...
  • C语言读取BMP位图文件

    2010-10-14 10:35:08
    C语言读取BMP位图文件 , 用C写的 , 可以读取 BMP 文件的位置 , 方便对图档作修正
  • C语言读取BMP格式的图片

    千次阅读 2015-02-03 14:02:55
    转载一篇文章: BMP文件格式分析 把BMP图片的格式解释的很清楚。 其中BMP头文件的格式可以定义为: #ifndef BITMAPINFO_H #define BITMAPINFO_H typedef unsigned char BYTE; typedef unsigned short WORD;...
  • /* 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...
  • 关于C语言读取BMP文件

    2019-03-01 19:40:52
    关于图像分割和hough变换(19_03_01学习进度) 之前MATLAB部分遇到一个问题,我在Hough变换完成之后得到的图像需要进一步的...C语言读取BMP文件 以下为按照BMP格式相搭配的读取头文件 /* 位图文件头 (位图头的...
  • C语言读取bmp图像并做简单显示

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

    2020-03-08 20:59:39
    code #include "stdio.h" #include <windows.h> void read_bmp() { FILE *fp=NULL; fp = fopen("p.bmp","rb"); if(fp==0) { return ; } BITMAPFILEHEADER filehead...
  • //BMP 头typedef struct{char id[2]; //bmp 文件标志 "BM"unsigned long fileSize; //文件大小unsigned long reserved0;unsigned long bitmapDataOffset;unsigned long...
  • c语言读取bmp文件完整版

    万次阅读 多人点赞 2016-06-24 15:43:55
    #include #include /* 定义WORD为两个字节的类型 */ typedef unsigned short WORD;.../* 位图文件头主要是对位图文件的一些描述 位图信息头主要是对位图图像方面信息的描述 */ /*************************** 位图
  • C语言读取BMP格式图片C 语言读取BMP 格式图片以下摘自维基百科,自由的百科全书BMP 取自位图BitMaP 的缩写,也称为DIB (与设备无关的位图)是微软视窗图形子系统(Graphics Device Interface)内部使用的一种位图图形...
  • 利用C语言读取BMP文件

    千次阅读 多人点赞 2020-03-09 14:15:24
    文章目录什么是bmp文件1.文件头信息块2.图像描述信息块3.颜色表4.图像数据区编写代码C文件h头文件存储算法 什么是bmp文件 BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。它一般由4部分组成:...
  • C语言打开BMP位图文件的代码,包括注解等

空空如也

空空如也

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

c语言读取bmp图片信息

c语言 订阅