硬件课程设计:基于STM32的多功能播放器之图片浏览

2 图片浏览

2.1 功能介绍

2.1.1 设计思路

       在单片机上显示自己喜欢的照片将是一件非常有趣的事,在该模块中,我将实现图片浏览的功能,能够显示各种尺寸的照片,并通过按键1和按键2进行图片切换,按键3返回目录。

2.1.2 成果展示

             

2.2 关键技术

2.2.1 图片取模

1)打开要取模的图片:以例程的40x40企鹅图片为例

2)观察左下角的输入图像,如果显示如下这样,请看3

 如果显示无效的输入图像,那么请使用电脑自带的画图软件将图片转化为16色位的bmp格式图片。

 3)打开图片后 设置如下

输出数据类型:   

扫描模式:       

输出灰度:       

 在16位彩色的颜色数据排列为 :红色 绿色  蓝色

最大宽度和高度:  

设置好后点击一下:

注意:此软件只能缩小图片不能放大图片!缩小是等比例缩小!

然后观察右下角这个输出图像是实际生成的图片的大小

然后点击保存,然后将生成的数组复制到到头文件内

2.3 我的工作

2.3.1 对图片进行取模

2.3.2 解析bin文件

•原理

       开发板的内部Flash只有512KB,但一张图片取模数组就有数十KB,直接烧录的话会导致内存不足,所以用C2B转换助手将取模数组转换成bin文件,然后存储在SD卡中,再通过解析bin文件将图片显示出来。

程序代码 

void picture()
{
    u8 curindex = 0;  //图片索引值
    u8 i;
    u8 image[2];    //存放像素宽高
    //SD卡存放4张图片
    char picname[4][10] = {"me.bin", "xnh.bin", "xhr.bin", "atm.bin"};   flag2 = 3;
    while(flag1 == 1)
    {
        if(flag2 == 1)
        {
            if(curindex == 0) curindex = 3;
            else curindex--;
        }
        if(flag2 == 2)
        {
            if(curindex == 3) curindex = 0;
            else curindex++;
        }
        if(flag2 != 0)
        {
            f_open(&file0,picname[curindex], FA_READ);
            f_lseek(&file0, 2);
            f_read(&file0, image, 1, &num_read);//bin文件第3个字节存放像素宽度
            f_lseek(&file0, 4);
            f_read(&file0, image+1, 1, &num_read);//bin文件第5个字节存放像素高度
            f_lseek(&file0, 8);
            LCD_Fill(1, 1, 130, 160, BLACK);
            for(i = 1; i <= image[1]; i++)     //每次读取一行像素数据并显示
            {
                f_read(&file0, rbuff, image[0] * 2, &num_read);
                LCD_Image(1, i, image[0], 1, (u8 *)rbuff);
            }
            f_close(&file0);
        }
        flag2 = 0;
    }
}

2.4 问题与解决思路

问题描述:如下图所示,图片非常模糊

                                                 

我的思路:采用16位真彩色对图片进行取模后,两个字节存储一个像素点,且像素点的值为data = mByte << 8 | lByte,mByte是高位字节,lByte是低位字节,我在解析图片的时候是按照低位在前解析的,但是取模的时候却是按照高位在前进行取模的,这就导致图片模糊,只要在取模的时候不勾选MSB选项,问题得到解决。

工程源码:硬件课程设计:基于STM32的多功能播放器-单片机文档类资源-CSDN下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

观察者555

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值