C语言 读取BMP图像 局部放大 代码

#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
}



发布了34 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/fuhanga123/article/details/80546066