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