黄山派使用lvgl使用png解码图片,怎么把图片缓冲区设到psram上

你可以手动调用解码器,将图像数据输出到psram。

这是jpeg的解码,你可以参考一下。

#include “tjpgd.h”

typedef struct {

FILE* fp;

uint8_t *fbuf;

uint32_t wfbuf;

} IODEV;

size_t in_func (JDEC* jd, unsigned char* buff, size_t nbyte)
{
    IODEV *dev = (IODEV*)jd->device;   /* Device identifier for the session (5th argument of jd_prepare function) */
 
 
    if (buff) {
        /* 从输入流读取一字节 */
        return (uint32_t)fread(buff, 1, nbyte, dev->fp);
    } else {
        /* 从输入流移除一字节 */
        return fseek(dev->fp, nbyte, SEEK_CUR) ? 0 : nbyte;
    }
}


int out_func (JDEC* jd, void* bitmap, JRECT* rect)
{
    IODEV *dev = (IODEV*)jd->device;
    uint8_t *src, *dst;
    uint32_t y, bws, bwd;
 
 
    /* 输出进度 */
    if (rect->left == 0) {
        printf("\r%lu%%", (rect->top << jd->scale) * 100UL / jd->height);
    }
 
    /* 拷贝解码的RGB矩形范围到帧缓冲区(假设RGB888配置) */
    src = (uint8_t*)bitmap;
    dst = dev->fbuf + 3 * (rect->top * dev->wfbuf + rect->left);  /* 目标矩形的左上 */
    bws = 3 * (rect->right - rect->left + 1);     /* 源矩形的宽度[字节] */
    bwd = 3 * dev->wfbuf;                         /* 帧缓冲区宽度[字节] */
    for (y = rect->top; y <= rect->bottom; y++) {
        memcpy(dst, src, bws);   /* 拷贝一行 */
        src += bws; dst += bwd;  /* 定位下一行 */
    }
 
    return 1;    /* 继续解码 */
}

然后再手动调用一下解码器:

devid.fp = fopen("bg.jpg", "rb");
    if(devid.fp == NULL)
    {
        rt_kprintf("Open image file failed!\n");
    }
    else
    {
        work = malloc(3100*2); // 分配解码工作区
        jres = jd_prepare(&jdec, in_func, work, 3100*2, &devid);
        if (jres == JDR_OK)
        {
            rt_kprintf("Image prepared: %d x %d\n", jdec.width, jdec.height);
            devid.fbuf = opus_heap_malloc(jdec.width * jdec.height * 3); // RGB888
            devid.wfbuf = jdec.width;
            jres = jd_decomp(&jdec, out_func, 0); // 开始解码
            if (jres == JDR_OK)
            {
                rt_kprintf("Image decoded successfully.\n");
            }
            else
            {
                rt_kprintf("Image decode failed: %d\n", jres);
            }
        }
        else
        {
            rt_kprintf("Image prepare failed: %d\n", jres);
        }
        fclose(devid.fp);
        free(work);
    }

图像数据在devid.fbuf里面。

关于psram内存分配可以参考: