搜索
bottom↓
回复: 22

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

[复制链接]

出0入4汤圆

发表于 2013-7-8 13:28:30 | 显示全部楼层 |阅读模式
现在用emwin的BMPCV软件把bmp图片转换成数据流的格式。
然后GUI_DrawStreamedBitmapAuto函数可以正常显示图片了
但是将该数据流文件作为ICO或button的背景图片就无法正常显示出来。
如以下两个函数都无法正常显示数据
ICONVIEW_AddStreamedBitmapItem
BUTTON_SetStreamedBitmap

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

出0入0汤圆

发表于 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[21];
char VerInfo_TEXT_1[21];
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[0],Device_SN[1],Device_SN[2],Device_SN[3],Device_SN[4],Device_SN[5],Device_SN[6],Device_SN[7]);
        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()差不多的

出0入0汤圆

发表于 2013-7-8 14:07:03 | 显示全部楼层
不好意思,理解错楼主的意思了

出0入0汤圆

发表于 2013-7-8 14:11:13 | 显示全部楼层
不过要实现楼主的要求,还是得实现上面的红字部分的函数。这个例程使用的RT-thread的文件读写函数,如是其它平台,直接套用就OKl了

出0入4汤圆

 楼主| 发表于 2013-7-8 14:15:07 | 显示全部楼层
senjet 发表于 2013-7-8 14:11
不过要实现楼主的要求,还是得实现上面的红字部分的函数。这个例程使用的RT-thread的文件读写函数,如是其 ...

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

出0入4汤圆

 楼主| 发表于 2013-7-8 14:17:36 | 显示全部楼层
目前用guibuilder创建的ico控件,加入数据后,一直显示蓝色

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-8 14:32:47 | 显示全部楼层
我是用GUI_DrawBitmap直接画位图是可以的。楼主emWinguibuilder哪里下载的,能否共享一下

出0入4汤圆

 楼主| 发表于 2013-7-8 14:40:01 | 显示全部楼层
gnocy 发表于 2013-7-8 14:32
我是用GUI_DrawBitmap直接画位图是可以的。楼主emWinguibuilder哪里下载的,能否共享一下 ...

MDK最新版,自带的

出0入0汤圆

发表于 2013-7-8 15:13:27 | 显示全部楼层
谢谢,看到了,都没有留意过

出0入4汤圆

 楼主| 发表于 2013-7-10 22:12:32 | 显示全部楼层
现在用button,想用全部贴图的方式,不知道按键外部的边框如何消除掉?

出0入0汤圆

发表于 2013-8-25 10:13:44 | 显示全部楼层
bbandpp 发表于 2013-7-10 22:12
现在用button,想用全部贴图的方式,不知道按键外部的边框如何消除掉?

试过在BUTTON.c中禁止3D模式

#ifndef   BUTTON_USE_3D
  #define BUTTON_USE_3D 0
#endif

出0入0汤圆

发表于 2013-8-29 15:26:59 | 显示全部楼层
senjet 发表于 2013-7-8 14:01
#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() 函数获取数据。看你好像用过这种方式,请指点一下,谢谢

出0入0汤圆

发表于 2013-8-30 10:47:07 | 显示全部楼层
jiangwei0802 发表于 2013-8-29 15:26
你好,最近在看emWin的图片显示,现在我用把图片用BmpCvt工具转化后,存在外部flash里面,现在需要从外部 ...

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

出0入0汤圆

发表于 2013-9-11 13:53:57 | 显示全部楼层
bbandpp 发表于 2013-7-8 14:17
目前用guibuilder创建的ico控件,加入数据后,一直显示蓝色

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

出0入0汤圆

发表于 2013-7-8 13:28:31 | 显示全部楼层
见这个帖子
http://www.amobbs.com/thread-5541511-1-1.html

出0入0汤圆

发表于 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接口直接读数据,没有成功,是必须用到文件系统吗?

出0入0汤圆

发表于 2015-9-17 14:40:26 | 显示全部楼层
李贝 发表于 2015-9-17 13:49
您好,请问一下,看了您的 int BMP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) ...

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

出0入0汤圆

发表于 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[512*1];
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格式不一致,导致读不出函数

出0入0汤圆

发表于 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[512*1];
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?

出0入0汤圆

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

帮看一下,谢谢哈

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2015-9-21 12:56:39 | 显示全部楼层
做个标记!不错!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 08:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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