硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4953|回复: 2
收起左侧

[emWin] emWin的PNG图片显示库,版本V4.18,V5.00,V5.18和V5.28

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2015-4-13 21:38:48 | 显示全部楼层 |阅读模式
emwin_png.zip (1.32 MB, 下载次数: 166)
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2015-4-21 15:20:19 | 显示全部楼层
请教下楼主,为什么我能显示JPG,GIF,BMP,但就是PNG图片显示不出来,图片用的是你们的例程里自带的PNG图片,代码如下:
#define DATA_BUFFER_SIZE    10*1024
static uint8_t *_acBuffer;

static int _GetData(void *p, const U8 **ppData, unsigned NumBytesReq, U32 Off)
{
    static int FileAddress = 0;
    UINT NumBytesRead;
    FIL *PicFile;
    FRESULT result;

    PicFile = (FIL *)p;

    /*
      * Check buffer size
      */
    if (NumBytesReq > DATA_BUFFER_SIZE)
    {
        NumBytesReq = DATA_BUFFER_SIZE;
    }

    /*
    * Set file pointer to the required position
    */
    if(Off == 1) FileAddress = 0;
    else FileAddress = Off;
    result = f_lseek(PicFile, FileAddress);
    if(result != FR_OK)
        return 0;
    /*
    * Read data into buffer

      */
    result = f_read(PicFile, _acBuffer, NumBytesReq, &NumBytesRead);
    if(result != FR_OK)
        return 0;
    /*
    * Set data pointer to the beginning of the buffer
    */
    *ppData = (const U8 *)_acBuffer;

    /*
    * Return number of available bytes
    */
    return NumBytesRead;
}

void show_png(const char *filename, uint16_t x, uint16_t y)
{
    FRESULT result;
   
    FIL *file;

    file = pvPortMalloc(sizeof(FIL));
    _acBuffer = pvPortMalloc(DATA_BUFFER_SIZE);
    if(file == 0 || _acBuffer == 0)
    {
        printf("jpg buffer alloc failed!\\n\\r");
        goto exit;
    }
    result = f_open(file, filename, FA_OPEN_EXISTING | FA_READ);
    if (result != FR_OK)
    {
        goto exit;
    }
    GUI_PNG_DrawEx(_GetData, file, x, y);
    f_close(file);
exit:
    vPortFree(file);
    vPortFree(_acBuffer);
}

我给GUI分配的堆空间是
#define GUI_NUMBYTES  (1024) *  384   // 使用外部SRAM堆空间
GUI没有创建其他内容,初始化后只是显示了一个字符串,然后调用show_png("2.png", 0, 0)显示图片,
字符串显示出来了但是PNG一点也没显示出来,PNG代码已添加到工程,编译通过。不知道是不是哪里漏掉了什么步骤?

另外还有个关于汉字显示的问题:
在第19章汉字显示的void GUIPROP_X_DispChar(U16P c)函数,想问一下STemWin在内部会将要显示的所有字符都扩展成16位的吗,比如我代码里调用GUI_DispString("This is a test"), 那么最终GUI会调用GUIPROP_X_DispChar(U16P c)这个函数,那么GUI会把字符串里的‘T'字符(0x54)转换成0x0054吗?如果我的代码编辑器使用的是GB2312编码那么GUI会怎么处理?还是会在调用GUIPROP_X_DispChar(U16P c)前判断每一个字节最高位是否为1,大于0x80的就取2字节送入GUIPROP_X_DispChar(U16P c)显示?
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2015-4-23 22:02:47 | 显示全部楼层
我错了,上面PNG读取图片数据的函数跟JPG、GIF、BMP的不同,PNG读取数据的时候缓冲区是PNG库内部已经分配好了,读的时候直接把数据往ppData指向的缓冲区放就好了,不需要另开辟缓冲区[s:125]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 07:13 , Processed in 0.037830 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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