图像分成了三块,改了好久也没改成功,求解啊~
下面是截图程序:
[mw_shl_code=c,true]int Camera_shot(unsigned short int Width,\
unsigned short int Height,\
unsigned char *filename)
{
bmp 文件头 54个字节 *
unsigned char header[54] =
{
0x42, 0x4d, 0, 0, 0, 0,
0, 0, 0, 0, 54, 0,
0, 0, 40,0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 8, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0
};
int i;
int j;
long file_size;
long width;
long height;
float Y;
unsigned char gray;
unsigned char r,g,b;
unsigned char tmp_name[30];
unsigned int mybw;
unsigned int read_data;
char kk[4]={0,0,0,0};
/* 宽*高 +补充的字节 + 头部信息 */
file_size = (long)Width * (long)Height + Height*(Width%4) + 54;
/* 文件大小 4个字节 */
header[2] = (unsigned char)(file_size &0x000000ff);
header[3] = (file_size >> 8) & 0x000000ff;
header[4] = (file_size >> 16) & 0x000000ff;
header[5] = (file_size >> 24) & 0x000000ff;
/* 位图宽 4个字节 */
width=Width;
header[18] = width & 0x000000ff;
header[19] = (width >> 8) &0x000000ff;
header[20] = (width >> 16) &0x000000ff;
header[21] = (width >> 24) &0x000000ff;
/* 位图高 4个字节 */
height = Height;
header[22] = height &0x000000ff;
header[23] = (height >> 8) &0x000000ff;
header[24] = (height >> 16) &0x000000ff;
header[25] = (height >> 24) &0x000000ff;
/* 将filename 按照一定的格式拷贝到 tmp_name */
sprintf((char*)tmp_name,"0:%s.bmp",filename);
/* 注册一个工作区,逻辑号为0 */
f_mount(0, &bmpfs[0]);
#if 0
/* 新建一个文件 */
bmpres = f_open( &bmpfsrc , (char*)tmp_name, FA_CREATE_NEW | FA_WRITE );
/* 新建文件之后要先关闭再打开才能写入 */
f_close(&bmpfsrc);
bmpres = f_open( &bmpfsrc , (char*)tmp_name, FA_OPEN_EXISTING | FA_WRITE);
#else
bmpres = f_open( &bmpfsrc , (char*)tmp_name, FA_OPEN_ALWAYS | FA_WRITE);
#endif
if ( bmpres == FR_OK )
{
/* 将预先定义好的bmp头部信息写进文件里面 */
bmpres = f_write(&bmpfsrc, header,sizeof(unsigned char)*54, &mybw);
//FIFO_PREPARE;
/* 下面是将指定窗口的数据读出来写到文件里面去 */
for(i=0; i<Height; i++)
{
if( !(Width%4) ) /* 刚好是4字节对齐 */
{
for(j=0; j<Width; j++)
{
READ_FIFO_PIXEL(read_data);
//read_data = pixel_data(); /*直接从FIFO中读取像素数据*/
r = GETR_FROM_RGB16(read_data);
g = GETG_FROM_RGB16(read_data);
b = GETB_FROM_RGB16(read_data);
Y=((float)(r*299 + g*587 + b*140)+500)/1000;
gray=(unsigned char)Y;
bmpres = f_write(&bmpfsrc, &gray,sizeof(unsigned char), &mybw);
//bmpres = f_write(&bmpfsrc, &b,sizeof(unsigned char), &mybw);
//bmpres = f_write(&bmpfsrc, &g,sizeof(unsigned char), &mybw);
//bmpres = f_write(&bmpfsrc, &r,sizeof(unsigned char), &mybw);
}
}
else
{
for(j=0;j<Width;j++)
{
read_data = pixel_data();
r = GETR_FROM_RGB16(read_data);
g = GETG_FROM_RGB16(read_data);
b = GETB_FROM_RGB16(read_data);
Y=((float)(r*299 + g*587 + b*140)+500)/1000;
gray=(unsigned char)Y;
bmpres = f_write(&bmpfsrc, &gray,sizeof(unsigned char), &mybw);
//bmpres = f_write(&bmpfsrc, &b,sizeof(unsigned char), &mybw);
//bmpres = f_write(&bmpfsrc, &g,sizeof(unsigned char), &mybw);
//bmpres = f_write(&bmpfsrc, &r,sizeof(unsigned char), &mybw);
}
/* 不是4字节对齐则需要补齐 */
bmpres = f_write(&bmpfsrc, kk,sizeof(unsigned char)*(Width%4), &mybw);
}
}/* 截屏完毕 */
f_close(&bmpfsrc);
return 0;
}
else if ( bmpres == FR_EXIST ) //如果文件已经存在
{
return FR_EXIST; //8
}
else/* 截图失败 */
{
return -1;
}
}
[/mw_shl_code]
下面是ov7725场中断服务程序:
[mw_shl_code=c,true]/* ov7725 场中断 服务程序 */
void EXTI0_IRQHandler(void)
{
if ( EXTI_GetITStatus(EXTI_Line0) != RESET ) //检查EXTI_Line0线路上的中断请求是否发送到了NVIC
{
if( Ov7725_vsync == 0 )
{
FIFO_WRST_L(); //拉低使FIFO写(数据from摄像头)指针复位
FIFO_WE_H(); //拉高使FIFO写允许
Ov7725_vsync = 1;
FIFO_WE_H(); //使FIFO写允许
FIFO_WRST_H(); //允许使FIFO写(数据from摄像头)指针运动
}
else if( Ov7725_vsync == 1 )
{
FIFO_WE_L(); //拉低使FIFO写暂停
Ov7725_vsync = 2;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI_Line0线路挂起标志位
}
}[/mw_shl_code]
|