求在emwin/ucgui中使用数据流作为图片格式实现的案例
现在用emwin的BMPCV软件把bmp图片转换成数据流的格式。然后GUI_DrawStreamedBitmapAuto函数可以正常显示图片了
但是将该数据流文件作为ICO或button的背景图片就无法正常显示出来。
如以下两个函数都无法正常显示数据
ICONVIEW_AddStreamedBitmapItem
BUTTON_SetStreamedBitmap
不知道各位有没使用过数据流的格式作为按键背景使用的,
或者有没其他更加方式显示背景的。
谢了 本帖最后由 senjet 于 2013-7-8 14:04 编辑
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_TEXT_0 (GUI_ID_USER + 0x01)
#define ID_TEXT_1 (GUI_ID_USER + 0x02)
#define ID_TEXT_2 (GUI_ID_USER + 0x03)
#define ID_TEXT_3 (GUI_ID_USER + 0x04)
#define ID_TEXT_4 (GUI_ID_USER + 0x05)
#define ID_TEXT_5 (GUI_ID_USER + 0x06)
#define ID_IMAGE_0 (GUI_ID_USER + 0x18)
unsigned char *_acBuffer=RT_NULL;
char VerInfo_TEXT_0;
char VerInfo_TEXT_1;
char *VerInfo_Title=RT_NULL;
char *VerInfo_TEXT_2=RT_NULL;
char *VerInfo_TEXT_3=RT_NULL;
char *VerInfo_TEXT_4=RT_NULL;
char *VerInfo_TEXT_5=RT_NULL;
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "", ID_FRAMEWIN_0, 21, 6, 200, 130, 0, 0x0, 0 },
{ IMAGE_CreateIndirect, "Image", ID_IMAGE_0, 4, 4, 64, 64, 0, 0, 0 },
{ TEXT_CreateIndirect, VerInfo_TEXT_0, ID_TEXT_0, 60, 6, 128, 16, 0, 0x0, 0 },
{ TEXT_CreateIndirect, VerInfo_TEXT_1, ID_TEXT_1, 60, 22, 128, 16, 0, 0x0, 0 },
{ TEXT_CreateIndirect, "", ID_TEXT_2, 60, 38, 128, 16, 0, 0x0, 0 },
{ TEXT_CreateIndirect, "", ID_TEXT_3, 4, 54, 180, 16, 0, 0x0, 0 },
{ TEXT_CreateIndirect, "", ID_TEXT_4, 4, 70, 180, 16, 0, 0x0, 0 },
{ TEXT_CreateIndirect, "", ID_TEXT_5, 4, 86, 180, 16, 0, 0x0, 0 },
// USER START (Optionally insert additional widgets)
// USER END
};
int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) {
int *phFile;
uint32_t NumBytesRead;
phFile = (int*)p;
//
// Check buffer size
//
if (NumBytes >512) {
NumBytes = 512;
}
//
// Set file pointer to the required position
//
lseek(*phFile,Off,SEEK_SET);
//
// Read data into buffer
//
NumBytesRead=read(*phFile, _acBuffer, NumBytes);
//
// Set data pointer to the beginning of the buffer
//
*ppData = _acBuffer;
//
// Return number of available bytes
//
return NumBytesRead;
}
static void _cbDialog(WM_MESSAGE * pMsg) {
WM_HWIN hItem;
// USER START (Optionally insert additional variables)
// USER END
switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
//
// Initialization of 'Image'
//
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_2);
TEXT_SetText(hItem,VerInfo_TEXT_2);
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_3);
TEXT_SetText(hItem,VerInfo_TEXT_3);
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_4);
TEXT_SetText(hItem,VerInfo_TEXT_4);
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_5);
TEXT_SetText(hItem,VerInfo_TEXT_5);
// USER START (Optionally insert additional code for further widget initialization)
// USER END
break;
// USER START (Optionally insert additional message handling)
// USER END
default:
WM_DefaultProc(pMsg);
break;
}
}
WM_HWIN CreateVersionInfo() {
WM_HWIN hWin;
TEXT_SetDefaultFont(&FontHZ12_Ex);
FRAMEWIN_SetDefaultFont(&FontHZ12_Ex);
FRAMEWIN_SetDefaultBarColor(1,GUI_BLACK);
FRAMEWIN_SetDefaultTextColor(1,GUI_WHITE);
FRAMEWIN_SetDefaultClientColor(GUI_WHITE);
FRAMEWIN_SetDefaultTitleHeight(16);
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
FRAMEWIN_SetText(hWin,VerInfo_Title);
FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,0);
WM_MakeModal(hWin);
WM_SetFocus(hWin);
WM_PaintWindowAndDescs(WM_HBKWIN);
return hWin;
}
void VersionInfo(void)
{
int flogo;
uint8_t OnExit=0;
rt_uint32_t event;
WM_HWIN hWin;
IMAGE_Handle hImage;
sprintf(VerInfo_TEXT_0,"SN:%02X%02X%02X%02X%02X%02X%02X%02X",Device_SN,Device_SN,Device_SN,Device_SN,Device_SN,Device_SN,Device_SN,Device_SN);
sprintf(VerInfo_TEXT_1,"FW:%s build %s",VERNUM,BUILDNUM);
hWin=CreateVersionInfo();
_acBuffer=rt_malloc(512);
if(_acBuffer==RT_NULL)
{ rt_kprintf("No memory for image\r\n");
}else
{ flogo =open("/Logo.bmp", O_RDONLY, 0);
if(flogo<0)
{ rt_kprintf("Logo.bmp does not exists!\r\n");
}else
{ hImage = WM_GetDialogItem(hWin, ID_IMAGE_0);
IMAGE_SetBMPEx(hImage, BMP_GetData, (void*)&flogo);
}
}
OnExit=0;
while (OnExit==0)
{ if (rt_event_recv(&SYS_event, 0x000001fe,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER, &event) == RT_EOK)
{ if (event&(1<<1))
{
GUI_SendKeyMsg(GUI_KEY_UP,1);
}
if (event&(1<<2))
{
GUI_SendKeyMsg(GUI_KEY_DOWN,1);
}
if (event&(1<<3))
{ GUI_SendKeyMsg(GUI_KEY_LEFT,1);
}
if (event&(1<<4))
{ GUI_SendKeyMsg(GUI_KEY_RIGHT,1);
}
if(event&(1<<5))
{
OnExit=1;
}
if(event&(1<<6))
{
OnExit=2;
}
if (event&(1<<7))
{ GUI_SendKeyMsg(GUI_KEY_SPACE,1);
}
if (event&(1<<8))
{ GUI_SendKeyMsg(GUI_KEY_TAB,1);
}
}
}
close(flogo);
rt_free(_acBuffer);
GUI_EndDialog(hWin,1);
}
红色部分是关键。使用的是emwin 5.2的Image控件,但实际上与GUI_BMP_DrawEx()差不多的 不好意思,理解错楼主的意思了 不过要实现楼主的要求,还是得实现上面的红字部分的函数。这个例程使用的RT-thread的文件读写函数,如是其它平台,直接套用就OKl了 senjet 发表于 2013-7-8 14:11 static/image/common/back.gif
不过要实现楼主的要求,还是得实现上面的红字部分的函数。这个例程使用的RT-thread的文件读写函数,如是其 ...
如果有其他方式可以实现,按键的背景图片显示方式也可以考虑
图片数据较多,需要存储在外部flash里面 目前用guibuilder创建的ico控件,加入数据后,一直显示蓝色 我是用GUI_DrawBitmap直接画位图是可以的。楼主emWinguibuilder哪里下载的,能否共享一下 gnocy 发表于 2013-7-8 14:32 static/image/common/back.gif
我是用GUI_DrawBitmap直接画位图是可以的。楼主emWinguibuilder哪里下载的,能否共享一下 ...
MDK最新版,自带的 谢谢,看到了,都没有留意过 现在用button,想用全部贴图的方式,不知道按键外部的边框如何消除掉? bbandpp 发表于 2013-7-10 22:12 static/image/common/back.gif
现在用button,想用全部贴图的方式,不知道按键外部的边框如何消除掉?
试过在BUTTON.c中禁止3D模式
#ifndef BUTTON_USE_3D
#define BUTTON_USE_3D 0
#endif senjet 发表于 2013-7-8 14:01 static/image/common/back.gif
#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_TEXT_0 (GUI_ID_USER + 0x01)
#define ID_TEXT_1...
你好,最近在看emWin的图片显示,现在我用把图片用BmpCvt工具转化后,存在外部flash里面,现在需要从外部flash取出数据并显示,flash用spi方式读写。看了手册要用IMAGE_SetBMPEx来显示,用使用...Ex() 函数获取数据。看你好像用过这种方式,请指点一下,谢谢 jiangwei0802 发表于 2013-8-29 15:26 static/image/common/back.gif
你好,最近在看emWin的图片显示,现在我用把图片用BmpCvt工具转化后,存在外部flash里面,现在需要从外部 ...
是的,你说的没错,你只要实现上面红字部分的程序,即将存在FLASH中的图片文件数据读取出来,然后将ppData指向你读出的数据的缓冲区就可以了。 bbandpp 发表于 2013-7-8 14:17 static/image/common/back.gif
目前用guibuilder创建的ico控件,加入数据后,一直显示蓝色
你的GUIBuilder中的GRAPH可以用么,我的GUIBuilder中都没有这个选项呢?刚好要用,可以分享下吗?你的好像是全功能都有。。。 见这个帖子
http://www.amobbs.com/thread-5541511-1-1.html senjet 发表于 2013-8-30 10:47
是的,你说的没错,你只要实现上面红字部分的程序,即将存在FLASH中的图片文件数据读取出来,然后将ppDat ...
您好,请问一下,看了您的 int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) 函数用到的是文件系统读写数据,我用的是SPI接口直接读数据,没有成功,是必须用到文件系统吗? 李贝 发表于 2015-9-17 13:49
您好,请问一下,看了您的 int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) ...
不是必须用文件系统,只要将数据读出来然后将数据所在的数组指针传给ppData就行了
uint32_t flogo=0x0057AC00;
IMAGE_SetDTAEx(WM_GetDialogItem(pMsg->hWin, GUI_ID_IMAGE0), DTAE_GetData, (void*)&flogo);
unsigned char _acBuffer;
static int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{
static int FileAddress = 0;
uint32_t NumBytesRead;
uint32_t phFile;
//FIL *PicFile;
//PicFile = (FIL *)p;
phFile =*(uint32_t*)p;
if (NumBytesReq > sizeof(_acBuffer)) {
NumBytesReq = sizeof(_acBuffer);
}
if(Off == 1) FileAddress =phFile;
else FileAddress =phFile+Off;
w25_ReadBuffer(_acBuffer,FileAddress,NumBytesReq);
*ppData = (const U8 *)_acBuffer;
return NumBytesRead;
}
我按照如上写的读不出来,我想因为不是文件系统所以 unsigned NumBytesReq, U32 Off这两个参数EMWIN系统不知道,另外*ppData 第一次读取的值与BMP格式不一致,导致读不出函数
senjet 发表于 2015-9-17 14:40
不是必须用文件系统,只要将数据读出来然后将数据所在的数组指针传给ppData就行了 ...
uint32_t flogo=0x0057AC00;
IMAGE_SetDTAEx(WM_GetDialogItem(pMsg->hWin, GUI_ID_IMAGE0), DTAE_GetData, (void*)&flogo);
unsigned char _acBuffer;
static int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{
static int FileAddress = 0;
uint32_t NumBytesRead;
uint32_t phFile;
//FIL *PicFile;
//PicFile = (FIL *)p;
phFile =*(uint32_t*)p;
if (NumBytesReq > sizeof(_acBuffer)) {
NumBytesReq = sizeof(_acBuffer);
}
if(Off == 1) FileAddress =phFile;
else FileAddress =phFile+Off;
w25_ReadBuffer(_acBuffer,FileAddress,NumBytesReq);
*ppData = (const U8 *)_acBuffer;
return NumBytesRead;
}
我按照如上写的读不出来,我想因为不是文件系统所以 unsigned NumBytesReq, U32 Off这两个参数EMWIN系统不知道,另外*ppData 第一次读取的值与BMP格式不一致,导致读不出函数,不知道这样理解对不对?如果不用文件系统读取数据,是否要做个假数据将这些参数传给EMWIN? senjet 发表于 2015-9-17 14:40
不是必须用文件系统,只要将数据读出来然后将数据所在的数组指针传给ppData就行了 ...
帮看一下,谢谢哈{:lol:} 李贝 发表于 2015-9-17 16:07
uint32_t flogo=0x0057AC00;
IMAGE_SetDTAEx(WM_GetDialogItem(pMsg->hWin, GUI_ID_IMAGE0), DTAE_GetDat ...
NumBytesReq和Off这两个参数由emwin分析bmp文件头得出的,所以只要你存放的BMP文件数据完整且初始指针指向正确的BMP数据所在的数组开头,肯定能读出。如果你的BMP格式不对,或emwin不支持的格式则不会显示出图像。 senjet 发表于 2015-9-17 16:30
NumBytesReq和Off这两个参数由emwin分析bmp文件头得出的,所以只要你存放的BMP文件数据完整且初始指针指 ...
明白了,就是说,我在SPI FLASH 中必须存入完整的BMP文件对吧,谢谢了{:handshake:} 做个标记!不错!
页:
[1]