stm32用摄像头拍照存储成为bmp格式不正确

2019-03-23 18:39发布

求帮助。。。。上图先,昨天晚上太急着走了,我是这样子的一个工作的过程,stm32驱动ov7670摄像头,出来的数据是RGB565的数据,直接送到LCD显示,有按键按下的时候就拍下照片,存储成为bmp格式的图像。我的摄像头出来的数据是: 从右上角往下一列的数据这样排列到最左边最下角是最后一个数据。,还有就是想问问 我16位的数据不用调 {MOD}板可以不???部分程序:
if(KeyNum == 1)   //第一个按键按下,表示拍一张照片
   {
  if(Bmp_Num == 256) Bmp_Num=0;
  Bmp_Num++;    //照片的名字加1
  //printf("/IMG%4.4d.BMP", id_no);
  f_mount(0, &fs);
  sprintf(m_FileName, "/IMG%4.4d.BMP", Bmp_Num);  //把BMP格式的名字放在m_FileName数组中
  res = f_open(&fsrc, m_FileName, FA_CREATE_ALWAYS | FA_WRITE); //创建一个BMP图片文件
  if (res != FR_OK)
  {
   printf(" 创建文件失败!");
   return FALSE;
  }
           /**********************文件头*****************************/
      bmfh.bfType = 0x4D42;  //"BM"是4d42-----------问题解决---------------------
   bmfh.bfReserved1 = 0;  //保留字
   bmfh.bfReserved2 = 0;  //保留字
   bmfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  //文件头到图像数据的字节偏移量
   bmfh.bfSize = bmfh.bfOffBits + IMG_WIDTH*IMG_HEIGHT*2;//说明位图的大小
    /**********************文件头*****************************/
    /**********************信息头*****************************/
   bmi.biSize = sizeof(BITMAPINFOHEADER);  //=40
   bmi.biWidth = IMG_WIDTH;
   bmi.biHeight = IMG_HEIGHT; //高度是正的,所以解码的时候要注意是从左下角开始解码
   bmi.biPlanes = 1;
   bmi.biBitCount = 16;
   bmi.biCompression = 0;     //不压缩的位图
   bmi.biSizeImage = 0;
   bmi.biXPelsPerMeter = 0x1000;
   bmi.biYPelsPerMeter = 0x1000;
      bmi.biClrUsed = 0;
      bmi.biClrImportant = 0;
   /**********************信息头*****************************/
   
  // clmap[0] = 0xF800;     //定义调 {MOD}板
  //  clmap[1] = 0x07E0;
  // clmap[2] = 0x001F;
   
   filesize = 0;
   res |= f_write(&fsrc, &bmfh, sizeof(BITMAPFILEHEADER), &bytewr); //写bmp格式的文件头
   filesize += bytewr;
   res |= f_write(&fsrc, &bmi, sizeof(BITMAPINFOHEADER), &bytewr);  //写bmp格式文件的信息头
   filesize += bytewr;
  // res |= f_write(&fsrc, &clmap, 12, &bytewr);  //定义调 {MOD}板的函数
  // filesize += bytewr;
  
      FIFO_RRST_L();
      FIFO_RD_L();
      FIFO_RD_H();
      FIFO_RD_L();
      FIFO_RRST_H();
      FIFO_RD_H();
    for(y=0; y<IMG_HEIGHT; y++)
    {  
     for(x=0; x<IMG_WIDTH; x++)
     {
      FIFO_RD_L();
      buffer_c[0]=(GPIOA->IDR)&0xff; //读高位,
      //c_data = c_data<<8;
      FIFO_RD_H();
               FIFO_RD_L();
               buffer_c[1]=(GPIOA->IDR)&0xff;//读低位
               FIFO_RD_H();
      res = f_write(&fsrc, buffer_c, 2, &bytewr);   //小端模式
     }
    }
  f_close(&fsrc);   
        f_mount(0, NULL);

  }//end key_Num;

[ 本帖最后由 qinsong 于 2013-1-18 09:40 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。