bbandpp 发表于 2013-7-8 13:28:30

求在emwin/ucgui中使用数据流作为图片格式实现的案例

现在用emwin的BMPCV软件把bmp图片转换成数据流的格式。
然后GUI_DrawStreamedBitmapAuto函数可以正常显示图片了
但是将该数据流文件作为ICO或button的背景图片就无法正常显示出来。
如以下两个函数都无法正常显示数据
ICONVIEW_AddStreamedBitmapItem
BUTTON_SetStreamedBitmap

不知道各位有没使用过数据流的格式作为按键背景使用的,
或者有没其他更加方式显示背景的。
谢了

senjet 发表于 2013-7-8 14:01:52

本帖最后由 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()差不多的

senjet 发表于 2013-7-8 14:07:03

不好意思,理解错楼主的意思了

senjet 发表于 2013-7-8 14:11:13

不过要实现楼主的要求,还是得实现上面的红字部分的函数。这个例程使用的RT-thread的文件读写函数,如是其它平台,直接套用就OKl了

bbandpp 发表于 2013-7-8 14:15:07

senjet 发表于 2013-7-8 14:11 static/image/common/back.gif
不过要实现楼主的要求,还是得实现上面的红字部分的函数。这个例程使用的RT-thread的文件读写函数,如是其 ...

如果有其他方式可以实现,按键的背景图片显示方式也可以考虑
图片数据较多,需要存储在外部flash里面

bbandpp 发表于 2013-7-8 14:17:36

目前用guibuilder创建的ico控件,加入数据后,一直显示蓝色

gnocy 发表于 2013-7-8 14:32:47

我是用GUI_DrawBitmap直接画位图是可以的。楼主emWinguibuilder哪里下载的,能否共享一下

bbandpp 发表于 2013-7-8 14:40:01

gnocy 发表于 2013-7-8 14:32 static/image/common/back.gif
我是用GUI_DrawBitmap直接画位图是可以的。楼主emWinguibuilder哪里下载的,能否共享一下 ...

MDK最新版,自带的

gnocy 发表于 2013-7-8 15:13:27

谢谢,看到了,都没有留意过

bbandpp 发表于 2013-7-10 22:12:32

现在用button,想用全部贴图的方式,不知道按键外部的边框如何消除掉?

xq13799775162 发表于 2013-8-25 10:13:44

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

jiangwei0802 发表于 2013-8-29 15:26:59

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() 函数获取数据。看你好像用过这种方式,请指点一下,谢谢

senjet 发表于 2013-8-30 10:47:07

jiangwei0802 发表于 2013-8-29 15:26 static/image/common/back.gif
你好,最近在看emWin的图片显示,现在我用把图片用BmpCvt工具转化后,存在外部flash里面,现在需要从外部 ...

是的,你说的没错,你只要实现上面红字部分的程序,即将存在FLASH中的图片文件数据读取出来,然后将ppData指向你读出的数据的缓冲区就可以了。

jxd701 发表于 2013-9-11 13:53:57

bbandpp 发表于 2013-7-8 14:17 static/image/common/back.gif
目前用guibuilder创建的ico控件,加入数据后,一直显示蓝色

你的GUIBuilder中的GRAPH可以用么,我的GUIBuilder中都没有这个选项呢?刚好要用,可以分享下吗?你的好像是全功能都有。。。

newhz 发表于 2013-7-8 13:28:31

见这个帖子
http://www.amobbs.com/thread-5541511-1-1.html

李贝 发表于 2015-9-17 13:49:58

senjet 发表于 2013-8-30 10:47
是的,你说的没错,你只要实现上面红字部分的程序,即将存在FLASH中的图片文件数据读取出来,然后将ppDat ...

您好,请问一下,看了您的 int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) 函数用到的是文件系统读写数据,我用的是SPI接口直接读数据,没有成功,是必须用到文件系统吗?

senjet 发表于 2015-9-17 14:40:26

李贝 发表于 2015-9-17 13:49
您好,请问一下,看了您的 int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) ...

不是必须用文件系统,只要将数据读出来然后将数据所在的数组指针传给ppData就行了

李贝 发表于 2015-9-17 16:02:13


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格式不一致,导致读不出函数

李贝 发表于 2015-9-17 16:07:51

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?

李贝 发表于 2015-9-17 16:09:08

senjet 发表于 2015-9-17 14:40
不是必须用文件系统,只要将数据读出来然后将数据所在的数组指针传给ppData就行了 ...

帮看一下,谢谢哈{:lol:}

senjet 发表于 2015-9-17 16:30:26

李贝 发表于 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不支持的格式则不会显示出图像。

李贝 发表于 2015-9-17 16:43:46

senjet 发表于 2015-9-17 16:30
NumBytesReq和Off这两个参数由emwin分析bmp文件头得出的,所以只要你存放的BMP文件数据完整且初始指针指 ...

明白了,就是说,我在SPI FLASH 中必须存入完整的BMP文件对吧,谢谢了{:handshake:}

shaozh_new 发表于 2015-9-21 12:56:39

做个标记!不错!
页: [1]
查看完整版本: 求在emwin/ucgui中使用数据流作为图片格式实现的案例