OpenEdv-开源电子网

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

关于保存QCIF图像至SD卡却无法查看图像的问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-9-9
在线时间
8 小时
发表于 2023-3-13 21:36:05 | 显示全部楼层 |阅读模式
20金钱
程序功能为模拟一张QICF分辨率(176*144)的RGB565图像,随后将此图像以BMP文件格式保存在SD卡中
程序流程为----生产一个50688(176*144*2)大小的u8数组----生成bmp编码文件头----写入文件头----按从下至上,从左至右的顺序循环写入每一行----关闭文件

这是一个为了测试相机拍照功能的测试程序,之前因为不太懂FATFS系统所以那这个练手,但是问题在于如今文件操作没有什么问题,但是保存的图像PIC_1.bmp文件在电脑上居然显示不支持此格式,让我非常困惑,然而将编码程序对照例程,并未发现错误,所以想请教论坛各位大佬帮忙分析一下,共同探讨一下,帮我解决这个问题

以下我贴出编码程序
u8 bmp_encode565(char * filename)
{
    UINT fnum;
    FIL* f_bmp;
    u16 bmpheadsize;     //bmp头大小
    BITMAPINFO hbmp;
    volatile FRESULT res_bmp;

    u8 databuf[352]={0};

    /////////BMP文件头部数据结构定义///////////

    bmpheadsize = sizeof(hbmp);

    hbmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    hbmp.bmiHeader.biWidth = 176;
    hbmp.bmiHeader.biHeight = 144;     //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;
    hbmp.bmiHeader.biYPelsPerMeter = 0;
    hbmp.bmiHeader.biXPelsPerMeter = 0;
    hbmp.bmiHeader.biClrUsed = 0;
    hbmp.bmiHeader.biClrImportant = 0;
    //bmp数据区大小

    hbmp.bmfHeader.bfType = ((u16)'M'<<8)+'B';//BM格式标志
    hbmp.bmfHeader.bfSize = bmpheadsize+hbmp.bmiHeader.biSizeImage;//整个bmp的大小
    hbmp.bmfHeader.bfOffBits = bmpheadsize;
    hbmp.bmfHeader.bfReserved1 = 0;
    hbmp.bmfHeader.bfReserved2 = 0;

    hbmp.RGB_MASK[0] = 0X00F800;
    hbmp.RGB_MASK[1] = 0X0007E0;
    hbmp.RGB_MASK[2] = 0X00001F;

    /////////BMP文件写入///////////
    res_bmp = f_open(f_bmp,(char*)filename,FA_WRITE|FA_CREATE_ALWAYS);
    f_close(f_bmp);/* 新建文件之后要先关闭再打开才能写入 */

    res_bmp = f_open(f_bmp,(char*)filename,FA_OPEN_EXISTING | FA_WRITE);




    if (res_bmp==FR_OK)
    {
        res_bmp = f_write(f_bmp,(u8*)&hbmp,bmpheadsize,&fnum);
        for (int i = 0; i < 144; i++)
        {
            for (int j = 0; j < 352; j++)
            {
                u16 a=((352*(143-i))+j);
                databuf[j]=pic[a];
            }
            res_bmp = f_write(f_bmp,(u8*)databuf,352,&fnum);
        }
        res_bmp = f_close(f_bmp);
    }
    return res_bmp;
}

我会常来帖子的,还请大家帮帮忙

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-3-14 17:28:40 | 显示全部楼层
虽然不太了解原因,但有个方法你可以试一下,逆向思维,先找一张相同格式的电脑能查看的图,再对比一下二者的头部信息。或者找一下有没有图片格式转换工具可以得到这种格式。
如果电脑本身不支持这种格式,那你可能要换个图片查看器或换一种格式。

提醒一下,要注意数据的“大小端”。
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 17:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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