OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11406|回复: 19

emWin IMAGE控件的BMP图片不能显示

[复制链接]

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
发表于 2016-9-1 12:23:25 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 shuaigew88 于 2016-9-1 12:25 编辑

    我使用IMAGE控件的IMAGE_SetBMPEx()函数获取fatfs里面的bmp图片不能显示?我用GUI_BMP_DrawEx()函数能正常显示fatfs里面的BMP图片,但是使用IMAGE控件却不能显示:

    FIL bmp;
    FRESULT res;

    SET_hImage[0]= IMAGE_CreateEx(0, 20,240,30,WM_HBKWIN,WM_CF_SHOW,IMAGE_CF_TILE,ID_SET_TOUCH);  //创建一个IMAGE控件
    f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);  //打开文件系统中的bmp文件
    IMAGE_SetBMPEx(SET_hImage[0],_Get_BackImage,(void *)&bmp);  //加载bmp到控件显示
    f_close(&bmp); //关闭文件
    控件创建和文件打开都是正常的,但是上面的操作不能正常显示图片。



    f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
    GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,20);  //直接用位图函数却能正常显示图片。
    f_close(&bmp);
        请问这是为什么?为什么IMAGE控件显示图片不正常?

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-9-1 12:23:26 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-9-3 22:02:07 | 显示全部楼层
帮顶
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2016-10-8 19:38:28 | 显示全部楼层
请问楼主怎么解决的,能分享一下你的程序吗? 谢谢
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-10-9 14:58:15 | 显示全部楼层
JueSe 发表于 2016-10-8 19:38
请问楼主怎么解决的,能分享一下你的程序吗? 谢谢

因为IMAGE是一个控件,所以使用IMAGE的绘制图片函数时图片是不会立马显示的,而只是像IMAGE控件提供了一个图片句柄或说是图片路径,当ucGUI需要刷新屏幕时IMAGE控件会自己利用提供的图片句柄绘制显示。这样做需要保证的是提供的文件路径要一直有效。
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2016-10-9 22:12:11 | 显示全部楼层
shuaigew88 发表于 2016-10-9 14:58
因为IMAGE是一个控件,所以使用IMAGE的绘制图片函数时图片是不会立马显示的,而只是像IMAGE控件提供了一 ...

f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
    GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,20);  //直接用位图函数却能正常显示图片。
    f_close(&bmp);

我用的这一个也无法显示啊,(参考的BMP显示图片的例子,可以正常显示)
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-10-10 08:05:56 | 显示全部楼层
JueSe 发表于 2016-10-9 22:12
f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
    GUI_BMP_DrawEx(_Get_BackImage,(void *)&b ...

f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
    GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,20);  //直接用位图函数却能正常显示图片。
   // f_close(&bmp); 如果要用IMAGE控件的绘制函数就必须要注释这一句
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2016-10-10 17:18:34 | 显示全部楼层
shuaigew88 发表于 2016-10-10 08:05
f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
    GUI_BMP_DrawEx(_Get_BackImage,(void *)&bm ...

#if SYSTEM_SUPPORT_UCOS
#include "includes.h"                                        //ucos 使用          
#endif

#define ID_FRAMEWIN_0    (GUI_ID_USER + 0x00)
static char bmpBuffer[BMPPERLINESIZE];

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 240, 320, 0, 0x0, 0 },
};

static int BmpGetData(void * p, const U8 ** ppData, unsigned NumBytesReq, U32 Off)
{
        static int readaddress=0;
        FIL * phFile;
        UINT NumBytesRead;
        #if SYSTEM_SUPPORT_UCOS
                OS_CPU_SR cpu_sr;
        #endif
       
        phFile = (FIL *)p;
       
        if (NumBytesReq > sizeof(bmpBuffer))
        {
                NumBytesReq = sizeof(bmpBuffer);
        }

        //移动指针到应该读取的位置
        if(Off == 1) readaddress = 0;
        else readaddress=Off;
        #if SYSTEM_SUPPORT_UCOS
                OS_ENTER_CRITICAL();        //临界区
        #endif
        f_lseek(phFile,readaddress);
       
        //读取数据到缓冲区中
        f_read(phFile,bmpBuffer,NumBytesReq,&NumBytesRead);
        #if SYSTEM_SUPPORT_UCOS
                OS_EXIT_CRITICAL();        //退出临界区
        #endif
        *ppData = (U8 *)bmpBuffer;
        return NumBytesRead;//返回读取到的字节数
}

static void _cbDialog(WM_MESSAGE * pMsg) {
         WM_HWIN hItem;
        static FIL BMPFile;
  u8 *BMPFileName="0:/PICTURE/ji.bmp";
  switch (pMsg->MsgId) {
        case WM_PAINT:
                WM_SelectWindow(pMsg->hWin);
        f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_READ);        //打开文件
        GUI_BMP_DrawEx(BmpGetData,&BMPFile,1,20);
        f_close(&BMPFile);                //关闭BMPFile文件
        break;
         case WM_INIT_DIALOG:
    hItem = pMsg->hWin;
    FRAMEWIN_SetTitleVis(hItem, 0);
    break;
    default:
    WM_DefaultProc(pMsg);
    break;
  }
}

WM_HWIN CreateFramewin(void) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

这是哪个程序,在WM_PAINT里面使用GUI_BMP_DrawEx不成功,不知道为什么?,能帮忙看一下吗?  谢谢
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-10-10 19:09:07 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-10-10 19:13 编辑

.......
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-10-10 19:12:58 | 显示全部楼层
shuaigew88 发表于 2016-10-10 08:05
f_open(&bmp,"picture/set/touch/touch.bmp",FA_READ);
    GUI_BMP_DrawEx(_Get_BackImage,(void *)&bm ...

f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_READ);        //打开文件
        GUI_BMP_DrawEx(BmpGetData,&BMPFile,1,20);
     //   f_close(&BMPFile);                //注释这句,保存BMPFile
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2016-10-15 10:12:45 | 显示全部楼层
shuaigew88 发表于 2016-10-10 19:12
f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_READ);        //打开文件
        GUI_BMP_DrawEx(BmpG ...

谢谢,问题解决啦。
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2016-10-15 22:20:02 | 显示全部楼层
shuaigew88 发表于 2016-10-10 19:12
f_open(&BMPFile,(const TCHAR*)BMPFileName,FA_READ);        //打开文件
        GUI_BMP_DrawEx(BmpG ...

大神,原来的问题解决啦,可以显示图片啦,但是我设置显示3个图片,为什么这三个图片都显示的是最后一个IMAGE_SetBMPEx函数设置的图片啊?(图标都是一个)
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-10-16 12:09:11 | 显示全部楼层
JueSe 发表于 2016-10-15 22:20
大神,原来的问题解决啦,可以显示图片啦,但是我设置显示3个图片,为什么这三个图片都显示的是最后一个I ...

如果有3副图片需要显示那么你需要FIL* BMPFile[3];

f_open(&BMPFile[0],"图片1");
f_open(&BMPFile[1],"图片2");
f_open(&BMPFile[2],"图片3");

3个文件句柄都需要保存,这样其实是比较浪费内存
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2016-10-16 20:18:48 | 显示全部楼层
shuaigew88 发表于 2016-10-16 12:09
如果有3副图片需要显示那么你需要FIL* BMPFile[3];

f_open(&BMPFile[0],"图片1");

那你点击一个IMAGE界面生成另一个IMAGE界面怎么写的函数?(是整个屏幕的切换)
case ID_IMAGE_0: //ID_IMAGE_0知代码,控制LED1
switch(NCode)
{
     case WM_NOTIFICATION_CLICKED:
     f_open(&BMPFile,(const TCHAR*)"PICTURE/1.bmp",FA_READ);       
     IMAGE_SetBMPEx(SET_hImage[0],BmpGetData,(void *)&BMPFile);
      break;
      case WM_NOTIFICATION_RELEASED:
    LED1=~LED1;                //LED1反转
   zhujiemian_demo();
  WM_DeleteWindow(SET_hImage[0]);                               
     break;   
     }
这是我参考的你的程序,没有成功。
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-10-16 22:27:12 | 显示全部楼层
JueSe 发表于 2016-10-16 20:18
那你点击一个IMAGE界面生成另一个IMAGE界面怎么写的函数?(是整个屏幕的切换)
case ID_IMAGE_0: //ID_ ...


1.jpg
#define ID_SET_TOUCH     (GUI_ID_USER + 0)
#define ID_SET_TIME      (GUI_ID_USER + 2)
#define ID_SET_BKIMAGE   (GUI_ID_USER + 3)
#define ID_SET_HELP      (GUI_ID_USER + 4)
#define ID_SET_EXIT      (GUI_ID_USER + 5)

IMAGE_Handle SET_hImage[5];
static void _cbDialog(WM_MESSAGE * pMsg)
{
  static bool app=false;
  int i; FIL bmp;
  switch(pMsg ->MsgId)
  {
   case WM_PAINT:               
     if(app==false)
     {
       f_open(&bmp,(char *)bImage,FA_READ);
       GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,20);
       f_close(&bmp);
     }
    break;
               

    case WM_NOTIFY_PARENT:
      switch(WM_GetId(pMsg ->hWinSrc))
      {
       case ID_SET_TOUCH:               
         switch(pMsg ->Data.v)
         {
          case WM_NOTIFICATION_CLICKED:
            f_open(&bmp,"picture/set/touch/_touch.bmp",FA_READ);
            GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,20);
            f_close(&bmp);
            break;
                                                                       
          case WM_NOTIFICATION_RELEASED:

            for(i=0;i<5;i++)
              WM_DeleteWindow(SET_hImage);
               
            app =true;
            IS_Touch(true);
            app =false;

            Create_SetDesktop();      
            break;
         }                                               
         break;
                                                               
                                                               
      case ID_SET_TIME:                 
        switch(pMsg ->Data.v)
        {
         case WM_NOTIFICATION_CLICKED:
           f_open(&bmp,"picture/set/time/_time.bmp",FA_READ);
           GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,50);
           f_close(&bmp);
           break;
                                                                       
         case WM_NOTIFICATION_RELEASED:

           break;
        }
        break;
                                                               
                                                               
       case ID_SET_BKIMAGE:            
         switch(pMsg ->Data.v)
         {
          case WM_NOTIFICATION_CLICKED:
            f_open(&bmp,"picture/set/bkimage/_bkimage.bmp",FA_READ);
            GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,80);
            f_close(&bmp);
            break;
                                                                       
          case WM_NOTIFICATION_RELEASED:

            for(i=0;i<5;i++)
              WM_DeleteWindow(SET_hImage);
               
            Create_bkImageDesktop();       
            break;
         }
         break;
                                         
                                                               
      case ID_SET_HELP:                 
        switch(pMsg ->Data.v)
        {
         case WM_NOTIFICATION_CLICKED:
           f_open(&bmp,"picture/set/help/_help.bmp",FA_READ);
           GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,110);
           f_close(&bmp);
           break;
                                                                       
         case WM_NOTIFICATION_RELEASED:

           break;                       
        }
        break;
                                                       
                                                               
      case ID_SET_EXIT:               
        switch(pMsg ->Data.v)
        {
         case WM_NOTIFICATION_CLICKED:
           f_open(&bmp,"picture/set/exit/_exit.bmp",FA_READ);
           GUI_BMP_DrawEx(_Get_BackImage,(void *)&bmp,0,140);
           f_close(&bmp);
           break;
                                                                       
         case WM_NOTIFICATION_RELEASED:
           app =false;
           for(i=0;i<5;i++)
             WM_DeleteWindow(SET_hImage);

           Create_HomeDesktop();
           break;               
        }                                               
        break;
      }                                         
      break;
               
               
   default:
     WM_DefaultProc(pMsg);
     break;
  }
}

//以上就是一个独立的界面,如果还有其他界面可以单独用一个c文件按照以上架构编写函数和消息处理,然后在A消息中创建B界面,创建后删除A界面资源切换至B界面。也可以在B界面中创建A界面后删除B界面,两个界面资源互不相干,相对独立。
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2016-10-18 16:34:59 | 显示全部楼层
shuaigew88 发表于 2016-10-16 22:27
#define ID_SET_TOUCH     (GUI_ID_USER + 0)
#define ID_SET_TIME      (GUI_ID_USER + 2)
#defin ...

谢谢您回答了我那么多的问题。那么显示的图片不是透明的,利用IconWorkshop转换成透明的也不可以。在设置一个整个背景图片的时候,小IMAGE图标都带有边框,请问您是怎么解决的啊?
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
972
金钱
972
注册时间
2016-6-15
在线时间
473 小时
 楼主| 发表于 2016-10-18 17:35:16 | 显示全部楼层
JueSe 发表于 2016-10-18 16:34
谢谢您回答了我那么多的问题。那么显示的图片不是透明的,利用IconWorkshop转换成透明的也不可以。在设置 ...

想要图片透明就必须要png格式,
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-8-16
在线时间
17 小时
发表于 2019-8-17 16:55:18 | 显示全部楼层

外部flash的路径能具体说一下嘛,有图片看一下谢谢

本帖最后由 Lianglulu123 于 2019-8-21 18:00 编辑

//
        // Initialization of 'Image'
        //
        hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1MAIN);
        f_open(&Imagefil[1],(const TCHAR*)"1:/SYSTEM/ICON/phone96.BMP",FA_READ);        //打开文件
        IMAGE_SetBMPEx(hItem, (GUI_GET_DATA_FUNC *)BmpGetData, &Imagefil[1]);
        //

为什么一张照片要变为三张,而且是png格式

为什么一张照片要变为三张,而且是png格式
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2018-11-9
在线时间
43 小时
发表于 2020-3-20 17:50:47 | 显示全部楼层
Lianglulu123 发表于 2019-8-17 16:55
//
        // Initialization of 'Image'
        //

请问能从sd卡里把这个图片显示到image控件上吗,为什么我用了类似的没有反应
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2015-12-23
在线时间
20 小时
发表于 2022-11-22 17:18:28 | 显示全部楼层
本帖最后由 goldbirderman 于 2022-11-22 17:24 编辑

你好,我也是用IMAGE控件上传了PNG格式得图片可是开机一直黑屏,请问有什么办法解决?



static void _cbDialog(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        int     NCode;
        int     Id;
  U32          FileSize;
        const void * pData;
        GUI_HMEM hMem;
        char *_acBuffer;
        hMem = GUI_ALLOC_AllocZero(100000);
        _acBuffer = GUI_ALLOC_h2p(hMem);
        GUI_ALLOC_Free(hMem);
        switch (pMsg->MsgId)
        {
                case WM_INIT_DIALOG:
                        //3&#245;ê&#188;&#187;ˉ&#182;&#212;&#187;°&#191;ò
                        hItem = pMsg->hWin;
                        FRAMEWIN_SetTitleHeight(hItem, 30);
                        FRAMEWIN_SetText(hItem, "ALIENTE BUTTON USE");
                        FRAMEWIN_SetFont(hItem, GUI_FONT_24_ASCII);
                        FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                        FRAMEWIN_SetTextColor(hItem, 0x0000FFFF);
               
                        //3&#245;ê&#188;&#187;ˉBUTTON0
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
                        BUTTON_SetFont(hItem, GUI_FONT_24_ASCII);
                        BUTTON_SetText(hItem, "LED1");
                        
                        //3&#245;ê&#188;&#187;ˉBUTTON1
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
                        BUTTON_SetText(hItem, "BEEP");
                        BUTTON_SetFont(hItem, GUI_FONT_24_ASCII);
               
                 hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
            f_open(&_accolor_0,"/icon/setting/model.png",FA_READ);        //????
            IMAGE_SetPNGEx(hItem,PngGetData,&_accolor_0);   
                        break;
                        
                        case WM_DELETE:
        f_close(&_accolor_0);
                        break;
                case WM_NOTIFY_PARENT:
                        Id    = WM_GetId(pMsg->hWinSrc);
                        NCode = pMsg->Data.v;
                        switch(Id)
                        {
                                case ID_BUTTON_0: //BUTTON_0μ&#196;í¨&#214;a′ú&#194;&#235;£&#172;&#191;&#216;&#214;&#198;LED1
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED: //°′&#197;¥±&#187;°′&#207;&#194;2¢êí·&#197;
                                                        LED1=~LED1;                //LED1·′×a
                                                        //BEEP=~BEEP;
                                                        break;        
                                        }
                                        break;
                                case ID_BUTTON_1: //BUTTON_1μ&#196;í¨&#214;a′ú&#194;&#235;£&#172;&#191;&#216;&#214;&#198;BEEP
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        BEEP=~BEEP;                //·&#228;&#195;ù&#198;÷·′×a
                                                        //LED1=~LED1;
                                                        break;
                                        }
                                        break;
                        }
                        break;
                default:
                        WM_DefaultProc(pMsg);
                        break;
        }
}
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 11:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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