OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6545|回复: 16

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第四十八章 照相机实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-10 22:55:35 | 显示全部楼层 |阅读模式
 

第四十八章 照相机实验

上一章,我们学习了图片解码,本章我们将学习bmp编码,结合前面的摄像头实验,实现一个简单的照相机。本章分为如下几个部分:

48.1 BMP编码简介

48.2 硬件设计

48.3 软件设计

48.4 下载验证

48.1 BMP编码简介

       上一章,我们学习了各种图片格式的解码。本章,我们介绍最简单的图片编码方法:BMP图片编码。通过前面的了解,我们知道BMP文件是由文件头、位图信息头、颜色信息和图形数据等四部分组成。我们先来了解下这几个部分。 

1BMP文件头(14字节):BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 

//BMP文件头

typedef __packed struct

{

    u16  bfType ;           //文件标志.只对'BM',用来识别BMP位图类型

    u32  bfSize ;            //文件大小,占四个字节

    u16  bfReserved1 ;       //保留

    u16  bfReserved2 ;       //保留

    u32  bfOffBits ;                //从文件开始到位图数据(bitmap data)开始之间的的偏移量

}BITMAPFILEHEADER ;

2、位图信息头(40字节):BMP位图信息头数据用于说明位图的尺寸等信息。 

typedef __packed struct

{

    u32 biSize ;                //说明BITMAPINFOHEADER结构所需要的字数。

    long  biWidth ;            //说明图象的宽度,以象素为单位

    long  biHeight ;         //说明图象的高度,以象素为单位

    u16  biPlanes ;           //为目标设备说明位面数,其值将总是被设为1

    u16  biBitCount ;       //说明比特数/象素,其值为1481624、或32

    u32 biCompression ;    //说明图象数据压缩的类型。其值可以是下述值之一:

       //BI_RGB:没有压缩;

       //BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成

    //BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成

      //BI_BITFIELDS:每个象素的比特由指定的掩码决定。

    u32 biSizeImage ;//说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为

    long  biXPelsPerMeter ;//说明水平分辨率,用象素/米表示

    long  biYPelsPerMeter ;//说明垂直分辨率,用象素/米表示

    u32 biClrUsed ;             //说明位图实际使用的彩色表中的颜色索引数

    u32 biClrImportant ;    //说明对图象显示有重要影响的颜色索引的数目,

//如果是0,表示都重要。

}BITMAPINFOHEADER ;

3、颜色表:颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。

typedef __packed struct

{

    u8 rgbBlue ;       //指定蓝色强度

    u8 rgbGreen ;        //指定绿色强度

    u8 rgbRed ;          //指定红色强度

    u8 rgbReserved ;    //保留,设置为0

}RGBQUAD ;

颜色表中RGBQUAD结构数据的个数由biBitCount来确定:当biBitCount=148时,分别有216256个表项;当biBitCount大于8时,没有颜色表项。 

BMP文件头、位图信息头和颜色表组成位图信息(我们将BMP文件头也加进来,方便处理),BITMAPINFO结构定义如下:

typedef __packed struct

{

       BITMAPFILEHEADER bmfHeader;

       BITMAPINFOHEADER bmiHeader;   

       RGBQUAD bmiColors[1]; 

}BITMAPINFO;   

4、位图数据:位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数

biBitCount=1时,8个像素占1个字节

biBitCount=4时,2个像素占1个字节;

biBitCount=8时,1个像素占1个字节;

biBitCount=16时,1个像素占2个字节;

biBitCount=24时,1个像素占3个字节;

biBitCount=32时,1个像素占4个字节;

biBitCount=1 表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。图像信息头装调色板中将有两个调色板项,称为索引0和索引1。图象数据阵列中的每一位表示一个象素。如果一个位是0,显示时就使用索引0RGB值,如果位是1,则使用索引1RGB值。   

biBitCount=16 表示位图最多有65536种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555565,在555格式下,红、绿、蓝的掩码分别是:0x7C000x03E00x001F,而在565格式下,它们则分别为:0xF8000x07E00x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。

biBitCount=32 表示位图最多有4294967296(232次方)种颜色。这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32位中有24位用于存放RGB值,顺序是:最高位—保留,红8位、绿8位、蓝8位。这种格式也被成为888 32位图。如果 biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、绿、蓝分量在32位中所占的位置。在Windows 95(or 98)中,系统只接受888格式,也就是说三个掩码的值将只能是:0xFF00000xFF000xFF。而在NT系统中,你只要注意使掩码之间不产生重叠就行。(注:这种图像格式比较规整,因为它是DWORD对齐的,所以在内存中进行图像处理时可进行汇编级的代码优化(简单))。

通过以上了解,我们对BMP有了一个比较深入的了解,本章,我们采用16BMP编码(因为我们的LCD就是16位色的,而且16BMP编码比24BMP编码更省空间),故我们需要设置biBitCount的值为16,这样得到新的位图信息(BITMAPINFO)结构体:

typedef __packed struct

{

       BITMAPFILEHEADER bmfHeader;

       BITMAPINFOHEADER bmiHeader; 

       u32 RGB_MASK[3];                   //调色板用于存放RGB掩码.

}BITMAPINFO;

其实就是颜色表由3RGB掩码代替。最后,我们来看看将LCD的显存保存为BMP格式的图片文件的步骤:

1)创建BMP位图信息,并初始化各个相关信息

这里,我们要设置BMP图片的分辨率为LCD分辨率(240*320)、BMP图片的大小(整个BMP文件大小)、BMP的像素位数(16位)和掩码等信息。

2)创建新BMP文件,写入BMP位图信息

我们要保存BMP,当然要存放在某个地方(文件),所以需要先创建文件,同时先保存BMP位图信息,之后才开始BMP数据的写入。

3)保存位图数据。

这里就比较简单了,只需要从LCDGRAM里面读取各点的颜色值,依次写入第二步创建的BMP文件即可。注意:保存顺序(即读GRAM顺序)是从左到右,从下到上。

4)关闭文件。

使用FATFS,在文件创建之后,必须调用f_close,文件才会真正体现在文件系统里面,否则是不会写入的!这个要特别注意,写完之后,一定要调用f_close

BMP编码就介绍到这里。

48.2 硬件设计

本章实验功能简介:开机的时候先检测字库,然后检测SD卡根目录是否存在PHOTO文件夹,如果不存在则创建,如果创建失败,则报错(提示拍照功能不可用)。在找到SD卡的PHOTO文件夹后,开始初始化OV7670,在初始化成功之后,就一直在屏幕显示OV7670拍到的内容。当按下WK_UP按键的时候,即进行拍照,此时DS1亮,拍照保存成功之后,蜂鸣器会发出“滴”的一声,提示拍照成功,同时DS1灭。DS0还是用于指示程序运行状态。

所要用到的硬件资源如下:

1)  指示灯DS0DS1

2)  WK_UP按键

3)  蜂鸣器

4)  串口

5)  TFTLCD模块

6)  SD

7)  SPI FLASH

8)  摄像头模块

这几部分,在之前的实例中都介绍过了,我们在此就不介绍了。

48.3 软件设计

打开上一章的工程,然后打开PICTURE组下的bmp.c文件,在该文件里面添加bmp编码函数bmp_encode,该函数代码如下:

//BMP编码函数

//将当前LCD屏幕的指定区域截图,存为16位格式的BMP文件 RGB565格式.

//保存为rgb565则需要掩码,利用原来的调色板位置增加掩码.这里我们已经增加了掩码.

//保存为rgb555格式则需要颜色转换,耗时间比较久,所以保存为565是最快速的办法.

//filename:存放路径

//x,y:在屏幕上的起始坐标 

//mode:模式.0,仅仅创建新文件的方式编码;1,如果之前存在文件,则覆盖之前的文件.

//如果没有,则创建新的文件.

//返回值:0,成功;其他,错误码

u8 bmp_encode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 mode)

{                         

       FIL* f_bmp;

       u16 bmpheadsize;                 //bmp头大小      

      BITMAPINFO hbmp;           //bmp 

       u8 res=0;

       u16 tx,ty;                                 //图像尺寸

       u16 *databuf;                       //数据缓存区地址      

       u16 pixcnt;                          //像素计数器

       u16 bi4width;                 //水平像素字节数    

       if(width==0||height==0)return PIC_WINDOW_ERR;               //区域错误

       if((x+width-1)>lcddev.width)return PIC_WINDOW_ERR;        //区域错误

       if((y+height-1)>lcddev.height)return PIC_WINDOW_ERR;      //区域错误     

#if BMP_USE_MALLOC == 1     //使用malloc 

       databuf=(u16*)mymalloc(SRAMIN,1024);  //开辟至少bi4width大小的字节的内存区域

//240宽的屏,480个字节就够了.

       if(databuf==NULL)return PIC_MEM_ERR;              //内存申请失败.

       f_bmp=(FIL *)mymalloc(SRAMIN,sizeof(FIL)); //开辟FIL字节的内存区域

       if(f_bmp==NULL)                                           //内存申请失败.

       {           

              myfree(SRAMIN,databuf);

              return PIC_MEM_ERR;                     

       }      

#else

       databuf=(u16*)bmpreadbuf;

       f_bmp=&f_bfile;

#endif          

       bmpheadsize=sizeof(hbmp);//得到bmp文件头的大小  

       mymemset((u8*)&hbmp,0,sizeof(hbmp));//置零空申请到的内存.       

       hbmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);//信息头大小

       hbmp.bmiHeader.biWidth=width;       //bmp的宽度

       hbmp.bmiHeader.biHeight=height;      //bmp的高度

       hbmp.bmiHeader.biPlanes=1;                   //恒为1

       hbmp.bmiHeader.biBitCount=16;       //bmp16位色bmp

       hbmp.bmiHeader.biCompression=BI_BITFIELDS;//每个象素的比特由指定的掩码决定。     hbmp.bmiHeader.biSizeImage=hbmp.bmiHeader.biHeight*hbmp.bmiHeader.biWidth*

hbmp.bmiHeader.biBitCount/8;//bmp数据区大小                             

       hbmp.bmfHeader.bfType=((u16)'M'<<8)+'B';//BM格式标志

       hbmp.bmfHeader.bfSize=bmpheadsize+hbmp.bmiHeader.biSizeImage;//整个bmp的大小

     hbmp.bmfHeader.bfOffBits=bmpheadsize;//到数据区的偏移

       hbmp.RGB_MASK[0]=0X00F800;                  //红色掩码

       hbmp.RGB_MASK[1]=0X0007E0;                  //绿色掩码

       hbmp.RGB_MASK[2]=0X00001F;                  //蓝色掩码

       if(mode==1)res=f_open(f_bmp,(const TCHAR*)filename,FA_READ|FA_WRITE);

//尝试打开之前的文件

      if(mode==0||res==0x04)res=f_open(f_bmp,(const TCHAR*)filename,FA_WRITE|

FA_CREATE_NEW);//模式0,或者尝试打开失败,则创建新文件              

      if((hbmp.bmiHeader.biWidth*2)%4)//水平像素(字节)不为4的倍数

       {

              bi4width=((hbmp.bmiHeader.biWidth*2)/4+1)*4;

//实际要写入的宽度像素,必须为4的倍数.      

       }else bi4width=hbmp.bmiHeader.biWidth*2;              //刚好为4的倍数 

      if(res==FR_OK)//创建成功

       {

              res=f_write(f_bmp,(u8*)&hbmp,bmpheadsize,&bw);//写入BMP首部 

              for(ty=y+height-1;hbmp.bmiHeader.biHeight;ty--)

              {

                     pixcnt=0;

                    for(tx=x;pixcnt!=(bi4width/2);)

                     {

if(pixcnt<hbmp.bmiHeader.biWidth)databuf[pixcnt]=LCD_ReadPoint(tx,ty) ;

//读取坐标点的值

                            else databuf[pixcnt]=0Xffff;//补充白色的像素

                            pixcnt++; tx++;

                     }

                     hbmp.bmiHeader.biHeight--;

                     res=f_write(f_bmp,(u8*)databuf,bi4width,&bw);//写入数据

              }

              f_close(f_bmp);

       }        

#if BMP_USE_MALLOC == 1     //使用malloc 

       myfree(SRAMIN,databuf);   

       myfree(SRAMIN,f_bmp);           

#endif    

       return res;

}

该函数实现了对LCD屏幕的任意指定区域进行截屏保存,用到的方法就是48.1节我们所介绍的方法,该函数实现了将LCD任意指定区域的内容,保存个为16BMP格式,存放在指定位置(由filename决定)。注意,代码中的BMP_USE_MALLOC是在bmp.h定义的一个宏,用于设置是否使用malloc,本章我们选择使用malloc

保存bmp.c,然后在bmp.h里面添加bmp_encode函数的申明,并保存bmp.h文件。

剩下的,我们就只需要修改主函数即可了,打开test.c,修改该文件代码如下:

extern u8 ov_sta;           //exit.c里面定义

extern u8 ov_frame;      //timer.c里面定义      

//更新LCD显示

void camera_refresh(void)

{

       u32 j;

      u16 color;      

       if(ov_sta==2)

       {

              LCD_Scan_Dir(U2D_L2R);         //从上到下,从左到右

              LCD_SetCursor(0x00,0x0000);     //设置光标位置

              LCD_WriteRAM_Prepare();     //开始写入GRAM

              OV7670_RRST=0;                      //开始复位读指针

              OV7670_RCK=0;

              OV7670_RCK=1;

              OV7670_RCK=0;

              OV7670_RRST=1;                      //复位读指针结束

              OV7670_RCK=1; 

              for(j=0;j<76800;j++)

              {

                     OV7670_RCK=0;

                     color=GPIOC->IDR&0XFF; //读数据

                     OV7670_RCK=1;

                     color<<=8; 

                     OV7670_RCK=0;

                     color|=GPIOC->IDR&0XFF;       //读数据

                     OV7670_RCK=1;

                     LCD->LCD_RAM=color;   

              }                                                     

              EXTI->R=1<<8;                          //清除LINE8上的中断标志位

              ov_sta=0;                                   //开始下一次采集

             ov_frame++;

              LCD_Scan_Dir(DFT_SCAN_DIR);      //恢复默认扫描方向

       }

}       

//文件名自增(避免覆盖)

//组合成:形如"0HOTO/PIC13141.bmp"的文件名

void camera_new_pathname(u8 *pname)

{    

       u8 res;                                

       u16 index=0;

       while(index<0XFFFF)

       {

              sprintf((char*)pname,"0HOTO/PIC%05d.bmp",index);

              res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件

              if(res==FR_NO_FILE)break;              //该文件名不存在=正是我们需要的.

              index++;

       }

}        

int main(void)

{           

       u8 res;                                              

       u8 *pname;                   //带路径的文件名

       u8 key;                         //键值              

       u8 i;                                   

       u8 sd_ok=1;                  //0,sd卡不正常;1,SD卡正常.

     Stm32_Clock_Init(9);    //系统时钟设置

       delay_init(72);                     //延时初始化

       uart_init(72,9600);        //串口1初始化      

       LCD_Init();                  //初始化液晶

       LED_Init();            //LED初始化

       BEEP_Init();          //蜂鸣器初始化    

       KEY_Init();                  //按键初始化 

       usmart_dev.init(72);      //usmart初始化    

      mem_init(SRAMIN);     //初始化内部内存池    

      exfuns_init();                //fatfs相关变量申请内存 

      f_mount(0,fs[0]);         //挂载SD

      f_mount(1,fs[1]);         //挂载FLASH.

       piclib_init();                 //初始化画图        

       POINT_COLOR=RED;     

      while(font_init())         //检查字库

       {        

              LCD_ShowString(60,50,200,16,16,"Font Error!"); delay_ms(200);  

              LCD_Fill(60,50,240,66,WHITE);//清除显示          

       }     

      Show_Str(60,50,200,16,"战舰 STM32开发板",16,0);                                       

       Show_Str(60,70,200,16,"照相机实验",16,0);                                      

       Show_Str(60,90,200,16,"WK_UP:拍照",16,0);                                    

       Show_Str(60,110,200,16,"正点原子@ALIENTEK",16,0);                                  

       Show_Str(60,130,200,16,"2012810",16,0);

       res=f_mkdir("0:/PHOTO");          //创建PHOTO文件夹

       if(res!=FR_EXIST&&res!=FR_OK)    //发生了错误

       {               

              Show_Str(60,150,240,16,"SD卡错误!",16,0); delay_ms(200);

              Show_Str(60,170,240,16,"拍照功能将不可用!",16,0);sd_ok=0; 

       }else

       {

              Show_Str(60,150,240,16,"SD卡正常!",16,0); delay_ms(200);

              Show_Str(60,170,240,16,"KEY_UP:拍照",16,0); sd_ok=1;

       }                                                                                                                

      pname=mymalloc(SRAMIN,30);  //为带路径的文件名分配30个字节的内存                 

      while(pname==NULL)                 //内存分配出错

      {        

              Show_Str(60,190,240,16,"内存分配失败!",16,0); delay_ms(200);

              LCD_Fill(60,190,240,146,WHITE); delay_ms(200);//清除显示   

       }                                                                                  

       while(OV7670_Init())//初始化OV7670

       {

              Show_Str(60,190,240,16,"OV7670 错误!",16,0) ;delay_ms(200);

           LCD_Fill(60,190,239,206,WHITE); delay_ms(200);

       }

      Show_Str(60,190,200,16,"OV7670 正常",16,0); delay_ms(1500);                       

       TIM6_Int_Init(10000,7199);               //10Khz计数频率,1秒钟中断

       EXTI8_Init();                                    //使能定时器捕获

       OV7670_Window_Set(10,174,240,320);//设置窗口     

      OV7670_CS=0;                                                

      while(1)

       {    

              key=KEY_Scan(0);//不支持连按

              if(key==KEY_UP)

              {

                     if(sd_ok)

                     {

                            LED1=0; //点亮DS1,提示正在拍照

                            camera_new_pathname(pname);//得到文件名               

                            if(bmp_encode(pname,0,0,240,320,0))//拍照有误

                            {

                                   Show_Str(40,130,240,12,"写入文件错误!",12,0);            

                            }else

                            {

                                   Show_Str(40,130,240,12,"拍照成功!",12,0);

                                   Show_Str(40,150,240,12,"保存为:",12,0);

                                  Show_Str(40+42,150,240,12,pname,12,0);            

                                  BEEP=1; //蜂鸣器短叫,提示拍照完成

                                   delay_ms(100);

                           }

                     }else //提示SD卡错误

                     {                                    

                            Show_Str(40,130,240,12,"SD卡错误!",12,0);

                           Show_Str(40,150,240,12,"拍照功能不可用!",12,0);                   

                    }

                   BEEP=0;//关闭蜂鸣器

                     LED1=1;//关闭DS1

                     delay_ms(1800);//等待1.8秒钟

              }else delay_ms(10);

             camera_refresh();//更新显示

              i++;

              if(i==20) { i=0; LED0=!LED0;}//DS0闪烁.

       }                                                                                                      

}         

此部分代码,和第四十一章的代码有点类似,只是这里我们多了一个camera_new_pathname函数,用于获取新的bmp文件名字(不覆盖旧的)。在main函数里面,我们通过WK_UP按键控制拍照(调用bmp_encode函数实现),其他部分我们就不多介绍了,至此照相机实验代码编写完成。

最后,本实验可以通过USMART来测试BMP编码函数,将bmp_encode函数添加到USMART管理,即可通过串口自行控制拍照,方便测试。

48.4 下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,得到如图48.4.1所示界面:


48.4.1 程序运行效果图

随后,进入监控界面。此时,我们可以按下WK_UP即可进行拍照。拍照得到的照片效果如图48.4.2所示:


48.4.2 拍照样图

       最后,我们还可以通过USMART调用bmp_encode函数,实现串口控制拍照,还可以拍成各种尺寸哦(不过必须小于240*320)!

 

《STM32开发指南》第四十八章 照相机实验.rar

546.97 KB, 下载次数: 596

实验43 照相机实验.rar

819.7 KB, 下载次数: 2697

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-4-11 08:03:50 | 显示全部楼层
有意思的东西,顶一下
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-13 16:14:02 | 显示全部楼层
bmp.c 文件第440行
res=f_write(f_bmp,(u8*)databuf,bi4width,&bw);//写入数据

这里bw并没有声明,为什么没有报错啊,我在移植时候就报错了。


jepg.c 文件第201行
f_read(f_jpeg,pbase,1024,&br); //读取1024个字节.
br也遇到同样问题。

为什么您的例程里没有报错呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-5-13 16:43:01 | 显示全部楼层
回复【3楼】wwjdwy:
---------------------------------
我在其他地方申明了,你goto definition一下就知道了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-13 16:52:24 | 显示全部楼层
哎,真没找到,我再声明一下吧,反正局部变量么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-5-13 17:16:52 | 显示全部楼层
回复【5楼】wwjdwy:
---------------------------------
全局变量,是。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-14 19:50:05 | 显示全部楼层
bmp文件显示正确,也竖屏了。
没有摄像头,想把之前液晶显示的直接保存,来测试效果。
bmp_encode("0:/picture/wwjdtest2.bmp",0,0,240,320,1);
可是保存文件错误,没有写入,图片查看器无法打开。

如果写 bmp_encode("0:/picture/wwjdtest2.bmp",0,0,100,100,1);  保存的图片就是一团黑。

encode函数里应该就LCD_ReadPoint函数调用自己的接口吧。

原子哥帮忙看下从哪里下手来解决问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-5-14 22:51:30 | 显示全部楼层
回复【7楼】wwjdwy:
---------------------------------
战舰板?
直接用我们的例程测试下先!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-5-14 23:14:23 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
是自己的一个板子测的。bmp.c直接贴过来的。前面的输出图片都差不多OK了
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-30
在线时间
0 小时
发表于 2013-11-9 16:46:13 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,这个例程mini的板子可以做吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-11-9 18:47:19 | 显示全部楼层
回复【10楼】张小泉1992:
---------------------------------
不太好做。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2014-5-4 13:35:24 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-4-17
在线时间
0 小时
发表于 2014-5-7 23:31:57 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-4-16
在线时间
0 小时
发表于 2014-10-25 11:42:24 | 显示全部楼层
原子哥,我在做这个实验的时候是按照实验说明来的 ,可是最后得到的照片 图形非常模糊,这是怎么回事啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-10-25 23:19:20 | 显示全部楼层
回复【14楼】水林日夕:
---------------------------------
调节焦距
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-4-16
在线时间
0 小时
发表于 2014-10-27 10:20:44 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
嗯,就是这个问题。谢谢原子哥
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2014-4-2
在线时间
23 小时
发表于 2014-12-19 23:51:13 | 显示全部楼层
能不能不用LCD的显存,直接从FIFO里面捕获同样的图片?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 17:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表