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