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

    }

    展开全文
  • #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &... * 函数功能:图像放缩 * scale = 1.5 裁剪区域图像放大1.5倍 * */ //#pragma DATA_SECTION(scale_...
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "define.h"
    #include "math.h"
    
    
    
    /*
     * 函数功能:图像放缩
     *			scale = 1.5		裁剪区域图像放大1.5倍
     * */
    //#pragma DATA_SECTION(scale_image,"data")
    unsigned char scale_image[384*288];// image scale
    void func_image_scale(unsigned char *image,
    		int src_width,
    		int src_height,
    		int direction,
    		float scale)
    {
    	int i,j;
    	int i_index[4] = {0};
    	int j_index[4] = {0};
    	float factor = 1.0/scale;
    	int scale_width = src_width/scale;	//裁剪后图像宽度
    	int scale_height = src_height/scale;//裁剪后图像高度
    
    	/*******	step 1 裁剪图像		*******/
    	int point_index = 48*src_width;
    	if(direction == 1)		//左部图像
    	{
    		for(i=0;i<scale_height;i++)
    		{
    			for(j=0;j<scale_width;j++)
    			{
    				scale_image[i*scale_width + j] = image[i*src_width + j + point_index];
    			}
    		}
    	}
    	else if(direction == 2)//右部图像
    	{
    		for(i=0;i<scale_height;i++)
    		{
    			for(j=0;j<scale_width;j++)
    			{
    				scale_image[i*scale_width + j] = image[i*src_width + j + point_index + 2*64];
    			}
    		}
    	}
    	else		//中间图像
    	{
    		for(i=0;i<scale_height;i++)
    		{
    			for(j=0;j<scale_width;j++)
    			{
    				scale_image[i*scale_width + j] = image[i*src_width + j + point_index + 64];
    			}
    		}
    	}
    	/*******	step 2 图像放大		*******/
    
    	for(i=0;i<src_height;i++)//临近插值,坐标向下取整
    	{
    		for(j=0;j<src_width;j++)
    		{
    			i_index[0] = (int)i*factor;
    			j_index[0] = (int)j*factor;
    			i_index[1] = (int)i*factor + 1;
    			j_index[1] = (int)j*factor;
    
    			i_index[2] = (int)i*factor;
    			j_index[2] = (int)j*factor + 1;
    			i_index[3] = (int)i*factor + 1;
    			j_index[3] = (int)j*factor + 1;
    			image[i*384+j] = (scale_image[i_index[0]*scale_width + j_index[0]]
    			                              + scale_image[i_index[1]*scale_width + j_index[1]]
    			                              + scale_image[i_index[2]*scale_width + j_index[2]]
    			                              + scale_image[i_index[3]*scale_width + j_index[3]])/4;
    		}
    	}
    }
    void main(void)
    {
    	//FILE *fpBmp;
    
    		if((fpBmp = fopen("E:/workspace_v5_5/func_test00/24384288.bmp","rb")) == NULL)
    		{
    			printf("the bmp file can not open! \n");
    			return;
    		}
    		//read the BITMAPFILEHEADER
    		fread(&bmpHeader.bfType,2,1,fpBmp);
    		fread(&bmpHeader.bfSize,4,1,fpBmp);
    		fread(&bmpHeader.bfReserved1,2,1,fpBmp);
    		fread(&bmpHeader.bfReserved2,2,1,fpBmp);
    		fread(&bmpHeader.bfOffBits,4,1,fpBmp);
    
    		fread(&bmpInfHeader.biSize,4,1,fpBmp);				//结构所需的字节数
    		fread(&bmpInfHeader.biWidth,4,1,fpBmp);				//位图的宽度,以像素为单位
    		fread(&bmpInfHeader.biHeight,4,1,fpBmp);			//位图的高度,以像素为单位
    		fread(&bmpInfHeader.biPlanes,2,1,fpBmp);			//目标设备的平面数,必须为1
    		fread(&bmpInfHeader.biBitCount,2,1,fpBmp);			//一个像素的位数
    		fread(&bmpInfHeader.biCompression,4,1,fpBmp);		//自下而上的压缩的位图的压缩类型,可以是BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS,BI_JPEG
    		fread(&bmpInfHeader.biSizeImage,4,1,fpBmp);			//指定图像的大小,以字节为单位。BI_RGB位图设置为0
    		fread(&bmpInfHeader.biXPelsPerMeter,4,1,fpBmp);		//指定目标设备的位图水平分辨率,以每米像素为单位
    		fread(&bmpInfHeader.biYPelsPerMeter,4,1,fpBmp);		//指定目标设备的位图垂直分辨率,以每米像素为单位
    		fread(&bmpInfHeader.biClrUsed,4,1,fpBmp);			//指定实际应用于位图中的颜色表中的颜色索引数
    		fread(&bmpInfHeader.biClrImportant,4,1,fpBmp);		//指定用于显示位图需要的颜色索引数。若为0,则所有颜色都需要。
    
    		lineByte = (bmpInfHeader.biWidth * bmpInfHeader.biBitCount / 8 + 3) / 4 * 4;
    
    		printf("It is: %3d bit \n Width is: %3d \n Height: is %3d \n Linestride: is %3d \n",
    					bmpInfHeader.biBitCount,
    					bmpInfHeader.biWidth,
    					bmpInfHeader.biHeight,
    					lineByte);
    		fseek(fpBmp,bmpHeader.bfOffBits,0);
    		tempData=(unsigned char*)malloc(3*lineByte*bmpInfHeader.biHeight);
    		fread(tempData,1,lineByte*bmpInfHeader.biHeight,fpBmp);    //读入图像数据
    
     	    int p,q,temp;
     	    for(q=0;q<(bmpInfHeader.biHeight)/2;q++)//上下数据互换
    		{
     	    	for(p=0;p<lineByte;p++)
    		   	{
    		   	    n=tempData+q*lineByte+p;
    		   	    m=tempData+(bmpInfHeader.biHeight-1-q)*lineByte+p;
    		   	    temp=*n;
    		   	    *n=*m;
    		   	    *m=temp;
    		   	}
    		}
    
    		p01=tempData;
    		if(bmpInfHeader.biBitCount / 8 == 1)//8bitgrey
    		{
    			grey = tempData;
    			printf("greyimage dat is: grey ");
    
    		}
    		if(bmpInfHeader.biBitCount / 8 == 3)//24bitrgb
    		{
    			blue = (unsigned char*)malloc(lineByte*bmpInfHeader.biHeight);
    			green = (unsigned char*)malloc(lineByte*bmpInfHeader.biHeight);
    			red = (unsigned char*)malloc(lineByte*bmpInfHeader.biHeight);
    			int i,j,k;
    			for(i=0;i<bmpInfHeader.biHeight;i++)
    			{
    				for(j=0,k=0;j<bmpInfHeader.biWidth*3;j=j+3,k++)
    				{
    					blue[i*bmpInfHeader.biWidth + k] = *(p01+i*lineByte+j);
    					green[i*bmpInfHeader.biWidth + k] = *(p01+i*lineByte+j+1);
    					red[i*bmpInfHeader.biWidth + k] = *(p01+i*lineByte+j+2);
    				}
    			}
    			func_image_scale(red,384,288,1,1.5);
    			func_image_scale(green,384,288,2,1.5);
    			func_image_scale(blue,384,288,3,1.5);
    
    			free(blue);
    			free(green);
    			free(red);
    
    		    printf("reddat is: red \n"
    		    		  "greendat is: green \n "
    		    		  "bluedat is: blue \n ");
    		}
    
    
    	   free(tempData);
    
    }
    
    
    
    
    
    #ifndef DEFINE_H_
    #define DEFINE_H_
    
    FILE *fpBmp;
    unsigned char*tempData;
    int lineByte;
    unsigned char*m;
    unsigned char*n;
    unsigned char*red;
    unsigned char*green;
    unsigned char*blue;
    unsigned char*grey;
    unsigned char*p01;
    //unsigned char*p02;
    //unsigned char*p03;
    
    
    /*
    //说明:定义数据存放变量
    #pragma        DATA_SECTION(blue,"tempData");
    unsigned char  blue[];
    #pragma        DATA_SECTION(red,"tempData");
    unsigned char  red[];
    #pragma        DATA_SECTION(green,"tempData");
    unsigned char  green[];
    
    #pragma        DATA_SECTION(tempData,"data");
    unsigned char  B_IMG[20000];
    
    #pragma        DATA_SECTION(Gray_IMG,"data");
    unsigned char  Gray_IMG[20000];
    */
    
    //void swap(unsigned char*p1,unsigned char*p2);
    
    typedef struct tagBITMAPFILEHEADER
    {
       int bfType;// 0x4D42
       int bfSize; //AA (170Bytes)
       int bfReserved1;// 0
       int bfReserved2; //0
       int bfOffBits; //3E (62)
    } BITMAPFILEHEADER;
    
    typedef struct tagBITMAPINFOHEADER
    {
       int biSize; //表示本结构的大小 28 (40Bytes)
       int biWidth; //位图的宽度 60 (96)
       int biHeight; //位图的高度 09 (09)
       int biPlanes; // 1
       int biBitCount; //位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究 1
       int biCompression; //本以为压缩类型,但是却另外有作用,稍候解释 0
       int biSizeImage; //表示位图数据区域的大小以字节为单位 6c (108)
       int biXPelsPerMeter;// 0EC4
       int biYPelsPerMeter; //0EC4
       int biClrUsed;// 0
       int biClrImportant;// 0
    } BITMAPINFOHEADER;
    
    
    typedef struct tagRGBQUAD
    {
    	int rgbBlue; 	// 蓝色的亮度(值范围为0-255)BYTE
    	int rgbGreen; 	// 绿色的亮度(值范围为0-255)BYTE
    	int rgbRed; 	// 红色的亮度(值范围为0-255)BYTE
    	int rgbReserved; // 保留,必须为0
    } RGBQUAD;
    
    
    BITMAPFILEHEADER bmpHeader;//包含文件类型、大小和布局的信息
    BITMAPINFOHEADER bmpInfHeader;//包含位图的尺寸和颜色格式
    
    typedef struct tagMyPointzxh
    {
    	int x;
    	int y;
    	int endx;
    	int endy;
    	int startx;
    	int starty;
    	int width1;
    	int width2;
    	int width_t1;
    	int width_t2;
    	int d;
    	int no;     //线的编号
    }MyPointzxh;
    #endif /* DEFINE_H_ */
    

    /****************************************************************************/
    /*                                                                          */
    /*              OMAPL138 及 DSP C6748 内存空间分配定义                      */
    /*                                                                          */
    /*              2014年05月16日                                              */
    /*                                                                          */
    /****************************************************************************/
    -stack 0x10000
    -heap 0x00900000
    MEMORY
    {
    #ifdef DSP_CORE
    /****************************************************************************/
    /*                                                                          */
    /*              DSP 专有内存区域                                            */
    /*                                                                          */
    /****************************************************************************/
        DSPL2ROM     o = 0x00700000  l = 0x00100000  /* 1MB   L2 DSP 本地 ROM (DSP ROM Bootloader) */
        DSPL2RAM     o = 0x00800000  l = 0x00040000  /* 256kB L2 DSP 本地 RAM */
        DSPL1PRAM    o = 0x00E00000  l = 0x00008000  /* 32kB  L1 DSP 本地程序 RAM */
        DSPL1DRAM    o = 0x00F00000  l = 0x00008000  /* 32kB  L1 DSP 本地数据 RAM */
    #endif
    
    /****************************************************************************/
    /*                                                                          */
    /*              公共内存区域                                                */
    /*                                                                          */
    /****************************************************************************/
        SHDSPL2ROM   o = 0x11700000  l = 0x00100000  /* 1MB   L2 共享内置 ROM */
        SHDSPL2RAM   o = 0x11800000  l = 0x00040000  /* 256KB L2 共享内置 RAM */
        SHDSPL1PRAM  o = 0x11E00000  l = 0x00008000  /* 32KB  L1 共享内置程序 RAM */
        SHDSPL1DRAM  o = 0x11F00000  l = 0x00008000  /* 32KB  L1 共享内置数据 RAM */
    
        EMIFACS0     o = 0x40000000  l = 0x20000000  /* 512MB SDRAM (CS0) */
        EMIFACS2     o = 0x60000000  l = 0x02000000  /* 32MB  异步          (CS2) */
        EMIFACS3     o = 0x62000000  l = 0x02000000  /* 32MB  异步          (CS3) */
        EMIFACS4     o = 0x64000000  l = 0x02000000  /* 32MB  异步          (CS4) */
        EMIFACS5     o = 0x66000000  l = 0x02000000  /* 32MB  异步          (CS5) */
    
        SHRAM        o = 0x80000000  l = 0x00020000  /* 128KB 共享 RAM */
        DDR2         o = 0xC0001000  l = 0x08000000  /* 128MB  DDR2 分配给 DSP */
    
    	EntryPoint   o = 0xC0000000  l = 0x00000800  /* 2 KB  C 语言入口点 */
    	Vector       o = 0xC0000800  l = 0x00000800  /* 2 KB  中断向量表 */
    
    /****************************************************************************/
    /*                                                                          */
    /*              外设内存区域                                                */
    /*                                                                          */
    /****************************************************************************/
        SYSCFG0      o = 0x01C14000  l = 0x00001000  /* 4K    SYSCFG0 */
        uPP          o = 0x01E16000  l = 0x00001000  /* 4K    uPP */
        GPIO         o = 0x01E26000  l = 0x00001000  /* 4K    GPIO */
        McBSP1       o = 0x01D11000  l = 0x00000800  /* 2K    McBSP1 */
    
    #ifndef DSP_CORE
    /****************************************************************************/
    /*                                                                          */
    /*              ARM 专有内存区域                                            */
    /*                                                                          */
    /****************************************************************************/
        ARMROM       o = 0xFFFD0000  l = 0x00010000  /* 64kB  ARM 本地 ROM (ARM ROM Bootloader) */
        ARMRAM       o = 0xFFFF0000  l = 0x00002000  /* 8kB   ARM 本地 RAM */
    #endif
    }
    
    SECTIONS
    {
        .text:_c_int00	>  EntryPoint 				 /* 可执行代码 C 程序入口点*/
        .text			>  DDR2 				     /* 可执行代码 */
        .stack			>  DDR2 				     /* 软件系统栈 */
        .bss			>  DDR2 				     /* 未初始化全局及静态变量 */
        .cio			>  DDR2                      /* C 输入输出缓存 */
        ".vectors"		>  Vector    				 /* 中断向量表 */
        .const			>  DDR2                      /* 常量 */
        .data			>  DDR2                      /* 已初始化全局及静态变量 */
        .switch			>  DDR2                      /* 跳转表 */
        .sysmem			>  DDR2                      /* 动态内存分配区域 */
        .far			>  DDR2                      /* 远程全局及静态变量 */
        .args			>  DDR2
        .ppinfo			>  DDR2
        .ppdata			>  DDR2
    
        /* TI-ABI 或 COFF */
        .pinit			>  DDR2                      /* C++ 结构表 */
        .cinit			>  DDR2                      /* 初始化表 */
    
        /* EABI */
        .binit			>  DDR2
        .init_array		>  DDR2
        .neardata		>  DDR2
        .fardata		>  DDR2
        .rodata			>  DDR2
        .c6xabi.exidx	>  DDR2
        .c6xabi.extab	>  DDR2
    
    	/* DDR2 */
        .buffer			>  DDR2
    
    	/* 外设  */
    	.Reg_SYSCFG0	>  SYSCFG0
    	.Reg_uPP		>  uPP
    	.Reg_GPIO		>  GPIO
    	.Reg_McBSP1		>  McBSP1
    }
    



    展开全文
  • 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图像到数组 由四部分组成: 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图像

    千次阅读 2017-12-01 16:14:26
    bmp_header //这个结构体就是对上面那个图做一个封装。 { //bmp header U8 Signatue[ 2 ] ; // B M U32 FileSize ; //文件大小 U16 Reserv1 ; U16 Reserv2 ; U32 FileOffset ; //文件头偏移量 ...
  • C语言读取BMP图像,并进行反色操作

    热门讨论 2011-10-23 22:17:41
    用C/C++编写的读取一个BMP文件的数据,包括文件头,信息头,调色板和像素信息。然后对输入图像进行反色操作(只做了24色真彩图的反色)、、
  • NULL 博文链接:https://feng88724.iteye.com/blog/317013
  • C语言读取BMP图像数据(转)

    千次阅读 2014-07-31 10:30:50
    BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种...
  • c语言实现BMP图像读取,可运行,代码清楚
  • BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,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语言 订阅