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

qinsong   2013-1-17 22:59 楼主
求帮助。。。。上图先,昨天晚上太急着走了,我是这样子的一个工作的过程,stm32驱动ov7670摄像头,出来的数据是RGB565的数据,直接送到LCD显示,有按键按下的时候就拍下照片,存储成为bmp格式的图像。我的摄像头出来的数据是: 从右上角往下一列的数据这样排列到最左边最下角是最后一个数据。,还有就是想问问 我16位的数据不用调色板可以不???部分程序:
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("\r\n创建文件失败!");
   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;     //定义调色板
  //  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);  //定义调色板的函数
  // filesize += bytewr;
  
      FIFO_RRST_L();
      FIFO_RD_L();
      FIFO_RD_H();
      FIFO_RD_L();
      FIFO_RRST_H();
      FIFO_RD_H();
    for(y=0; y     {  
     for(x=0; 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 编辑 ]
  • IMG0001.jpg
  • IMG0001.BMP

回复评论 (7)

是从LCD中读取并保存的吧?
读取出来的数据 要转换下 再存的。
点赞  2013-1-18 09:24
解决不了的啊
点赞  2013-1-18 16:59
有谁知道不?指点下子啦
点赞  2013-1-18 16:59
您能把您这个项目的代码发一份给我吗?或者我向您买一份,我也在做类似项目,很多东西不熟悉。。麻烦谢谢了397402680@qq.com
点赞  2013-3-6 13:18
各自徘徊的
点赞  2013-8-13 10:35

读取出来的数据 要转换下 再存的。
点赞  2014-4-28 10:02
不懂,帮顶。我也想做图像采集
点赞  2015-4-1 23:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复