阅读背景:

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);

}




#include <stdio.h>
#include <string.h>



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: