ZYNQ开发板SD卡读写BMP图片

本文介绍如何在ZYNQ开发板上从SD卡读取BMP格式的灰度图像,并解析其文件头以获取图像尺寸及数据起始位置,最后将图像数据加载到内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  上一次讲到ZYNQ开发板SD卡读写操作,但是里面的读写操作比较简单,现在学习了一下关于SD卡读取BMP文件的操作,在这里进行一下总结。
  本文主要参考了以下一些博客、网页:
  [1].http://blog.youkuaiyun.com/o_sun_o/article/details/8351037
  [2].http://blog.youkuaiyun.com/love_ljq/article/details/79117738
  [3].黑金开发板源码

  这个文章的主要架构跟上一节SD卡简单读写相似,关于ZYNQ系统搭建的我就不在这里细讲了,把参考[2]先实现了之后再来看这篇文章,在这篇文章里面呢,就是自己实现了一个bmp_load函数。
  首先我们需要准备一张图片,网上随便找一张图片,然后把这张图片裁成200x200大小,并且设置为灰度图像,我之前打算用Windows自带的画图来将图片转换为灰度图像的,但是发现转换出来的图像跟我想象中的不一样,于是我用Matlab实现了。原因似乎是这样的,原来的这张图片是三通道彩色图,虽然看起来是灰度图,另存为256色图并不是转换为灰度图,而且三通道共计256色,所以就是说另存为256色并不是转换为灰度图,而我们用Matlab实现的则是转换为灰度图了。把得到的灰度图像放到SD卡根目录下边。
  下面讲一下关于BMP图片的图片格式,学过相关知识的同学应该都知道,图片是由文件头以及图片数据构成的,文件头里面包含了比如图片的格式,图片的大小等的信息,关于这部分的知识,主要参考了[1],大家有兴趣的话也可以了解一下,对于我们事先从SD卡进行BMP图片读取的话,要了解的主要是图像的大小,图像的起始位置这些信息。我们首先读取文件头的前54个字符,这里面有很多有用的信息,图像的长宽放在[18][19],[20][21]这些位置,而图像的起始位置在[10][11]这些位置,也就是通过读取[10][11]的值可以确定图像数据的第一个像素点值。
  要注意是是,图像读取出来的第一个像素值的Value值是图像左下角的像素值,并不是我们常识中认为的左上方的第一个像素点的值,而最后一个像素值是右上角的值,在BMP文件中,图像是从下到上,从左到右来进行读取的。
  以下是源代码

#include "platform.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "ff.h"
#include "xdevcfg.h"
#include <stdio.h>

static FATFS fatfs;

int SD_Init()
{
    FRESULT rc;
    rc = f_mount(&fatfs,"",0);
    if(rc)
    {
        xil_printf("ERROR: f_mount returned %d\r\n",rc);
        return XST_FAILURE;
    }
    return XST_SUCCESS;
}

void bmp_load(char *bmp,u8 *frame,)
{
    short y,x;
    short XImage,YImage;
    FIL fil;
    u32 iPixelAddr = 0;
    FRESULT res;
    unsigned char TMPBUF[64];
    u32 br;

    res = f_open(&fil,bmp,FA_OPEN_EXISTING | FA_READ);
    if(res != FR_OK)
    {
        return;
    }
    res = f_read(&fil,&TMPBUF,54,&br);
    xil_printf("brValue:%d",br);
    if(res != FR_OK)
    {
        return;
    }
    XImage = (unsigned short int)TMPBUF[19]*256 + TMPBUF[18]; //这里计算的是图像的Width和Height
    YImage = (unsigned short int)TMPBUF[23]*256 + TMPBUF[22];

    xil_printf("Begin%d ",TMPBUF[11]);xil_printf("%dEnd",TMPBUF[10]); //这里表明前多少数据是无效的

    xil_printf("%d",XImage);
    xil_printf("%dEnd",YImage);
    //从前64个数据里之后,图像数据从第1079开始,-54是因为前面已经读取了54个数据了
    //这里的1078是直接手算的,并不是程序算的。
    res = f_read(&fil,&line_buf[0],1078-54,&br); 
    xil_printf("BR%d",br);
    int i;

    f_read(&fil,frame,200*200,&br);
    xil_printf("N%d K%d K%d,",br,frame[0],frame[200*200-1]);

    xil_printf("Yes");
    f_close(&fil);
}

int main()
{
    init_platform();
    int rc;

    xil_printf("hello");

    rc = SD_Init();
    if(XST_SUCCESS != rc)
    {
        xil_printf("fail to init SD Card.");
    }
    else
    {
        xil_printf("success to init SD Card.");
    }

    u8 frameGet[200*200];
    bmp_load("girl.bmp",&frameGet);
    xil_printf("V%d V%d",frameGet[0],frameGet[200*200-1]);//输出两个像素点的值

    cleanup_platform();
    return 0;
}
FPGA读写SD读取BMP图片通过LCD显示例程实验 Verilog逻辑源码Quartus工程文件+文档说明,FPGA型号Cyclone4E系列中的EP4CE6F17C8,Quartus版本17.1。 1 实验简介 在前面的实验中我们练习了 SD 读写,VGA 视频显示等例程,本实验将 SD 里的 BMP 图 片读出,写入到外部存储器,再通过 VGA、LCD 等显示。 本实验如果通过液晶屏显示,需要有液晶屏模块。 2 实验原理 在前面的实验中我们在 VGA、LCD 上显示的是彩条,是 FPGA 内部产生的数据,本实验将彩 条替换为 SD 内的 BMP 图片数据,但是 SD 读取速度远远不能满足显示速度的要求,只能先写 入外部高速 RAM,再读出后给视频时序模块显示 module top( input clk, input rst_n, input key1, output [5:0] seg_sel, output [7:0] seg_data, output vga_out_hs, //vga horizontal synchronization output vga_out_vs, //vga vertical synchronization output[4:0] vga_out_r, //vga red output[5:0] vga_out_g, //vga green output[4:0] vga_out_b, //vga blue output sd_ncs, //SD card chip select (SPI mode) output sd_dclk, //SD card clock output sd_mosi, //SD card controller data output input sd_miso, //SD card controller data input output sdram_clk, //sdram clock output sdram_cke, //sdram clock enable output sdram_cs_n, //sdram chip select output sdram_we_n, //sdram write enable output sdram_cas_n, //sdram column address strobe output sdram_ras_n, //sdram row address strobe output[1:0] sdram_dqm, //sdram data enable output[1:0] sdram_ba, //sdram bank address output[12:0] sdram_addr, //sdram address inout[15:0] sdram_dq //sdram data ); parameter MEM_DATA_BITS = 16 ; //external memory user interface data width parameter ADDR_BITS = 24
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值