|
发表于 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)显示? |
|