OpenEdv-开源电子网

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

EMWIN图片存外部FLASH问题

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-8-25
在线时间
13 小时
发表于 2016-8-31 19:07:49 | 显示全部楼层 |阅读模式
2金钱
做大点的项目,大家肯定遇到图片太多,不能采样原始的方式,将图片用BMPCvt.exe工具转化成.C文件放于单片机的ROM的方式. 这里我以32位的带ALPHA通道的透明背景为例, 比如我想在一个按钮上放一个透明背景的图片.我开始想了两种方式: 第一: 将BMPCvt.exe转换好的.C文件里的数据部分转成BIN文件存储到FLASH,然后要用时将数据全部一次性读出来,放到RAM里面,然后调用类似BUTTON_SetBitmapEx(hWin, BUTTON_BI_UNPRESSED, &bmHistory, 0, 0);  bmHistory为软件转换后图片数据结构体GUI_BITMAP, 其中数据元素_acHistory为存储于ROM区域的const数组.本来的想法是想将_acHistory用一个全局数组或动态分配一片能存储整个图片大小的空间的指针代替,试验结果是这个指针只能是const指针,而const区域数据不能更改,这种方式只能做罢.
GUI_CONST_STORAGE GUI_BITMAP bmHistory = {

  110, // xSize
  110, // ySize
  440, // BytesPerLine
  32, // BitsPerPixel
  //(U8 *)aMemory;
  (unsigned char* )_acHistory,  // Pointer to picture data
  NULL,  // Pointer to palette
  GUI_DRAW_BMP8888
};

第二种方式是采用原始带ALPHA通道的32位图片数据, 将原始图片BMP数据存储为BIN文件,将BIN数据直接存到FLASH,要显示图片时再读出来, 显示函数当然不能再用BUTTON_SetBitmapEx(),因为它的原型是void             BUTTON_SetBitmapEx        (BUTTON_Handle hObj, unsigned int Index, const GUI_BITMAP * pBitmap, int x, int y);
图片数据这里是GUI_BITMAP的指针,也就是上一种图片存储在ROM的方式. 这里我想用BUTTON_SetBMP(hWin, 0, (unsigned long*)bmHistory);直接显示位图数据流.实验结果,图片是能显示出来,但是我的位图是32位带ALPHA通道的,而实际显示透明底显示不出来! 哪位有更好的办法解决这个问题?

最佳答案

查看完整内容[请看2#楼]

可以使用流位图方式,EMWIN手册里面如下: 8.5 使用 ...Ex() 函数获取数据 同流位图一样,使用 BMP、 GIF、 JPEG 和 PNG 文件也能够运行,而不必将整个图像加载到 RAM。对 于此种情况,可使用 ...Ex() 函数。所有这些函数的共同之处在于都使用 “GetData”函数。请注意, 根据使用 “GetData”函数的实际任务不同,该函数的运行也稍有差异。请参见以下参数和示例表。 “ GetData”函数的原型 int GUI_GET_DATA_FUNC(void * p ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-8-31 19:07:50 | 显示全部楼层
可以使用流位图方式,EMWIN手册里面如下:
8.5 使用 ...Ex() 函数获取数据
同流位图一样,使用 BMP、 GIF、 JPEG 和 PNG 文件也能够运行,而不必将整个图像加载到 RAM。对
于此种情况,可使用 ...Ex() 函数。所有这些函数的共同之处在于都使用 “GetData”函数。请注意,
根据使用 “GetData”函数的实际任务不同,该函数的运行也稍有差异。请参见以下参数和示例表。
“ GetData”函数的原型
int GUI_GET_DATA_FUNC(void * p, const U8 * * ppData,
unsigned NumBytes, U32 Off)
示例 ( BMP、 GIF 和 JPEG)
下列代码节选显示了如何实施 “GetData”函数以用于 BMP、 GIF 和 JPEG 数据:
static char _acBuffer[0x200];
int APP_GetData(void * p, const U8 * * ppData, unsigned NumBytesReq, U32 Off) {
HANDLE * phFile;
DWORD NumBytesRead;
phFile = (HANDLE *)p;
//
// Check buffer size
//
if (NumBytesReq > sizeof(_acBuffer)) {
NumBytesReq = sizeof(_acBuffer);
}
//
// Set file pointer to the required position
//
SetFilePointer(*phFile, Off, 0, FILE_BEGIN);
//
// Read data into buffer
//
ReadFile(*phFile, _acBuffer, NumBytesReq, &NumBytesRead, NULL);
//
// Set data pointer to the beginning of the buffer
//
*ppData = _acBuffer;
//
// Return number of available bytes
//
return NumBytesRead;
}
参数 描述
p 应用程序定义的 Void 指针。
ppData
BMP、 GIF 和 JPEG:
指向到 U8 的指针。“GetData”函数必须将指针设置到请求数据所在的位置。
流位图和 PNG:
指向 U8。必须使用 “GetData”函数填充指针指向的位置。
NumBytesReq 请求的字节数。
StartOfFile 如果此标记为 1,应将数据指针设置到数据流的起始

示例 ( PNG 和流位图)
以下代码节选显示了如何实施 “GetData”函数以用于 PNG 和流位图数据:
static char acBuffer[0x200];
int APP_GetData(void * p, const U8 * * ppData, unsigned NumBytesReq, U32 Off) {
HANDLE * phFile;
DWORD NumBytesRead;
U8 * pData;
pData = (U8 *)*ppData;
phFile = (HANDLE *)p;
//
// Set file pointer to the required position
//
SetFilePointer(*phFile, Off, 0, FILE_BEGIN);
//
// Read data into buffer
//
ReadFile(*phFile, pData, NumBytesReq, &NumBytesRead, NULL);
//
// Return number of available bytes
//
return NumBytesRead;
}
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-8-25
在线时间
13 小时
 楼主| 发表于 2016-9-1 11:03:30 | 显示全部楼层
yyx112358 发表于 2016-8-31 19:07
可以使用流位图方式,EMWIN手册里面如下:
8.5 使用 ...Ex() 函数获取数据
同流位图一样,使用 BMP、 GIF ...

我的问题并不是一次显示整张图片的问题!我有外挂RAM,开个60K的RAM显示图片没什么压力. 直接调用GUI_BMP_Draw()直接显示BMP图片就好,而不要GUI_BMP_DrawEx()分批显示. 但两种方式显示都有一个共同问题,我用的是32位带ALPHA通道的BMP图片,但是调用这两个函数显示出来的图片,透明背景根本显示不出来, 我的根本目的是想显示透明的BMP,而不是把图片简单的显示出来!
回复

使用道具 举报

3

主题

36

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
227
金钱
227
注册时间
2014-3-13
在线时间
64 小时
发表于 2016-12-26 00:15:59 | 显示全部楼层
Costar 发表于 2016-9-1 11:03
我的问题并不是一次显示整张图片的问题!我有外挂RAM,开个60K的RAM显示图片没什么压力. 直接调用GUI_BMP_D ...

请问你是怎么解决这个问题的,我现在项止也是把很多图片存到外部的flash里面去,但是有些图片转换成GUI_CONST_STORAGE GUI_BITMAP 这个结构体的格式给按钮用的,想请教你是怎么处理?
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-8-25
在线时间
13 小时
 楼主| 发表于 2016-12-28 09:29:08 | 显示全部楼层
/**************************************************************************
  * 函数名称:_ShowMemDevStreamBitmap
  * 功能描述:将流位图数据读取到缓存中
  * 输入参数:sFilename 要读取的文件名
                XSize/YSize: 流位图大小(流位图数据里无该信息,需手动输入)
                缺点: 窗体关闭时需另外增加释放图片句柄的操作
                优点: 显示速度快
  * 输出参数:None
  * 返 回 值:GUI_MEMDEV_Handle: 流位图存储设备句柄
  * 其它说明:GUI_BMP_Draw()不能自动解码透明信息,不能显示透明图片
                在WM_PAINT中使用GUI_MEMDEV_WriteAt(hMemBMP[0], x, y);显示图片
  * 修改日期: 16/12/16   
        * 修改人  : Frank
***************************************************************************/
GUI_MEMDEV_Handle _ShowMemDevStreamBitmap(const char * sFilename, int XSize, int YSize)
{
    GUI_HMEM hMem;
    char *_acBuffer;        
    FRESULT result;
    GUI_MEMDEV_Handle hMemBMP;

    #ifndef Method1
    GUI_BITMAP Bitmap;
    GUI_LOGPALETTE Palette;
    #endif   

    _ReadBitmapFile(sFilename, &_acBuffer);
   
    /* 创建内存设备,并将 BMP 图片绘制到此内存设备里面,此内存设备要在主程序中用到
    所以退出此函数前,不要释放。
    */
    hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
    GUI_MEMDEV_Select(hMemBMP);
    GUI_DrawStreamedBitmapAuto(_acBuffer, 0, 0); //将流文件写入内存设备
    GUI_MEMDEV_Select(0);

    hMem = GUI_ALLOC_p2h(_acBuffer);
    /* 释放动态内存 hMem */
    GUI_ALLOC_Free(hMem);
    /* 关闭文件 */
    f_close(file);
   
    return hMemBMP;  
}

static GUI_MEMDEV_Handle hMemBMP[2];

创建窗体时:
hMemBMP[0] = _ShowMemDevStreamBitmap("0:/PHOTO/Entity/Container.dta", 218, 320);
hMemBMP[1] = _ShowMemDevStreamBitmap("0:/PHOTO/Entity/Diastimeter.dta", 64, 64);

然后在回调函数WM_PAINT:
           /* The org point is the lcd  */
            GUI_MEMDEV_WriteOpaqueAt(hMemBMP[0], 262, 330 + 70);
            GUI_MEMDEV_WriteOpaqueAt(hMemBMP[1], 48, 585 + 70);
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2014-4-17
在线时间
11 小时
发表于 2017-9-8 16:59:55 | 显示全部楼层
Costar 发表于 2016-12-28 09:29
/**************************************************************************
  * 函数名称:_ShowM ...

求GUI_ALLOC_p2h的实现函数
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-2-17
在线时间
0 小时
发表于 2019-2-17 08:43:53 | 显示全部楼层
long909026 发表于 2016-12-26 00:15
请问你是怎么解决这个问题的,我现在项止也是把很多图片存到外部的flash里面去,但是有些图片转换成GUI_C ...

你好,我也想请教你这个问题,我用image2lcd把jpg图片转成2进制bin文件存放到flash,页面初始化的时候从flash读取出来,希望通过BUTTON_SetBitmapEx接口设置button的背景,但是发现通过image3lcd转成bin文件时缺少GUI_LOGPALETTE这部分的信息,请教下你时怎么解决这个问题的?谢谢
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-2-17
在线时间
0 小时
发表于 2019-2-17 08:55:11 | 显示全部楼层
Costar 发表于 2016-12-28 09:29
/**************************************************************************
  * 函数名称:_ShowM ...

你好,请问你说的这个问提解决了吗?想求教下你的解决方案,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-23 19:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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