在用jpg和png解码在sd卡上的图片时,怎么设置那个解码缓冲区到psram上,我看宏设置好像只有2-128k这样子。
如果我想设置整个屏幕大小的背景还有一些其他图片就不够用了,应该怎么设置大一些解码缓存区,或者还有其他方法设置多一些图片?
大佬捞捞
你可以手动调用解码器,将图像数据输出到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内存分配可以参考:
好的,大概看懂思路了,不知道实现难不难