uC/GUI NIOSII移植之2D图形库
今天继续昨天的话题。
来看2D图形库。这里面uC/GUI提供了强大的功能。先看看有什么函数。
里面有不少东西,这是截的图懒的一个一个把他们敲上来了。
先看第一个函数,GUI_SetDrawMode();设置GUI的绘图模式。靠上去好像很高深。这个函数就有一个参数mode。
mode又两个选项GUI_DRAWMODE_NORMAL和GUI_DRAWMODE_XOR。
先看一个例子大家就明白这个MODE是什么意思了。
void MainTask(void) {
unsigned int i;
GUI_Init();
GUI_SetFont(&GUI_FontHZ_Times_New_Roman_14);
GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);设置为GUI_DRAWMODE_NORMAL
GUI_SetBkColor(GUI_YELLOW);
GUI_Clear(); //这句话比较有意思,执行了之后他会将整个窗口填充为Bk设置的颜色,要不只有在在绘制的图形的下面才有Bk色。 GUI_SetColor(GUI_RED);
GUI_FillCircle(300, 200, 130); //画第一个园,红色的,显眼一点。
GUI_SetColor(GUI_GREEN); //设置绘图颜色为GREEN
GUI_FillCircle(140, 200, 130); //以NORMAL方式画第二个圆
GUI_SetDrawMode(GUI_DRAWMODE_XOR); //设置绘图方式为XOR
GUI_FillCircle(460, 200, 130); //以XOR方式绘制第三个圆,这里大家仔细看看同样绘制了一GREEN颜色的圆,为什么不是GREEN的?XOR惹的祸。这个函数在黑白显示里面尤为重要!
GUI_SetColor(GUI_BLUE);
GUI_DispStringAt("First Circle", 300, 340);
GUI_DispStringAt("Seconde Circle", 140, 340);
GUI_DispStringAt("Third Circle", 460, 340); //这些是为了观察方便添上去的
GUI_SetColor(GUI_BLACK);
GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
GUI_FillCircle(300, 200, 3);
GUI_FillCircle(140, 200, 3);
GUI_FillCircle(460, 200, 3);
GUI_DrawCircle(300, 200, 131); //画圆,但是画出来的只有轮廓,上面调用的函数GUI_FillCircle()是将这员填充颜色的。uC/GUI里面所有的在封闭图形比如说圆和长方形的绘图函数Fill和Draw都有类似的关系
GUI_Delay(5000);
}
效果图
接下来就应该显示位图了及BMP文件。但是大多数的嵌入式系统不支持文件系统那该怎么办?
uC/GUI提供了一个解决方案,把位图转化为.C文件。
这个工具就叫uC-GUI-BitmapConvert.exe
执行这个工具,打开一个我事先准备好的位图文件。
然后如图选择转换该文件。
其实在这里选择把位图转换成多少色的都没有关系,gui会自动适佩目标系统的颜色。
之所以这么选择是为了节省存储空间,毕竟嵌入式系统容量有限。
在界面的最上方显示的是这个位图的大小这里可看到是419*490。
下面显示的就是调色板,即这个位图所有能显示出来的颜色。
线面就是预览了。难看的不行了。
然后选择另存为,就出现了.c文件这个选项。
这是转换好的位图.c文件和位图原文件。
uC/GUI还支持位图文件的压缩。在保存的时候选择
就可以了。
比较一下文件可以看到两个文件的大小相差了一倍。
为压缩的600多k,压缩的才300。按照他文档的说明,可以提供2的压缩率。
来看看他们都有什么不同。
这是为压缩的:
#include "stdlib.h"
#include "GUI.H"
/* Palette
The following are the entries of the palette table.
Every entry is a 32-bit value (of which 24 bits are actually used)
the lower 8 bits represent the Red component,
the middle 8 bits represent the Green component,
the highest 8 bits (of the 24 bits used) represent the Blue component
as follows: 0xBBGGRR
*/
const GUI_COLOR Colors3[] = {
0x000000,0x0000FF,0x00FF00,0x00FFFF
,0xFF0000,0xFF00FF,0xFFFF00,0xFFFFFF
}; /*这个位图的调色板可以看出来里面有8种颜色*/
const GUI_LOGPALETTE Pal3 = {
8, /* number of entries */
0, /* No transparency */
&Colors3[0]
};
const unsigned char ac3[] = {
0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
/*这里面存放的就是bitmap的数据太多了就被我精简了,只显示一行。有兴趣的去下载附件看看。*/
};
const GUI_BITMAP bm3 = {
419, /* XSize */
490, /* YSize */
210, /* BytesPerLine */
4, /* BitsPerPixel */
ac3, /* Pointer to picture data (indices) */
&Pal3 /* Pointer to palette */
};
下面是压缩的:
#include "stdlib.h"
#include "GUI.H"
/* Palette
The following are the entries of the palette table.
Every entry is a 32-bit value (of which 24 bits are actually used)
the lower 8 bits represent the Red component,
the middle 8 bits represent the Green component,
the highest 8 bits (of the 24 bits used) represent the Blue component
as follows: 0xBBGGRR
*/
const GUI_COLOR Colors3_compressed_with_palette[] = {
0x000000,0x0000FF,0x00FF00,0x00FFFF
,0xFF0000,0xFF00FF,0xFFFF00,0xFFFFFF
};
const GUI_LOGPALETTE Pal3_compressed_with_palette = {
8, /* number of entries */
0, /* No transparency */
&Colors3_compressed_with_palette[0]
};
const unsigned char ac3_compressed_with_palette[] = {
/* RLE: 418 Pixels @ 000,000*/ 254, 0x07, 164, 0x07,
/* RLE: 001 Pixels @ 418,000*/ 1, 0x00,
/* RLE: 418 Pixels @ 000,001*/ 254, 0x07, 164, 0x07,
/*同上砍掉了很多东西,有兴趣的看附件*/};
const GUI_BITMAP bm3_compressed_with_palette = {
419, /* XSize */
490, /* YSize */
210, /* BytesPerLine */
GUI_COMPRESS_RLE4, /* BitsPerPixel */
ac3_compressed_with_palette, /* Pointer to picture data (indices) */
&Pal3_compressed_with_palette /* Pointer to palette */
,GUI_DRAW_RLE4
};
看看有什么区别,根据我的理解,压缩就是把有信息的象素点标出来。黑色的就不标记。
不过在显示效果上没有任何区别!但是显示压缩的位图明显能感觉到速度较慢。
这是测试用的代码:
extern const GUI_BITMAP bm3;
extern const GUI_LOGPALETTE Pal3;
extern const unsigned char ac3[];
extern const GUI_BITMAP bm3_compressed_with_palette;
//这是一些要用到的外部变量声明
GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
GUI_SetBkColor(GUI_BLACK);
GUI_SetColor(GUI_WHITE);
GUI_Clear(); /*清理桌面,变成黑的*/
GUI_DrawBitmap(&bm3, 10,10); /*在左上角为起始点的10,10座标为圆点显示位图*/
GUI_Delay(5000);
GUI_Clear();
GUI_Delay(1000);
GUI_DrawBitmap(&bm3_compressed_with_palette, 50, 10); /*在左上角为起始点的50,10座标为圆点显示位图,效果上没有区别,但是速度明显的慢*/
GUI_Delay(5000);
直接添加到上段代码的后面就行了。
超出显示范围的内容就被自动砍掉了。这是第一个显示的截图,第二个由于效果上没却别,就不浪费论坛空间了。
再来看看GUI_DrawBitmapExp();这个函数,这个函数有多达十个参数。
void GUI_DrawBitmapExp(int x0, int y0, //显示位图的起始座标(指的是在LCD上的位置)
int XSize, int YSize, //这个两参数的含义是在待显示的位图中选取一个XSize*YSize大小的范围来显示,从0,0座标开始。取值范围1~~255
int XMul, int YMul, //比例因数,即放大比率!议会就能看到这个参数的效果
int BitsPerPixel, //位图的每个象素的位数,可以在bm3这个结构体中找到
int BytesPerLine, //待显示位图每行的字节数,可以在bm3这个结构体中找到
const U8* pData, //指向位图,实际存储数据变量的指针。
const GUI_LOGPALETTE* pPal); //指向GUI_LOGPALETTE数据结构的指针
GUI_Clear();
GUI_Delay(1000);
GUI_DrawBitmapExp(10, 10, 255, 255, 1, 1, bm3.BitsPerPixel, bm3.BytesPerLine, &ac3, &Pal3); //看看这段代码的含义,特别注意pData的取值是指向ac3的指针
这句的效果
GUI_Delay(5000);
GUI_DrawBitmapExp(10, 10, 255, 255, 2, 2, bm3.BitsPerPixel, bm3.BytesPerLine, &ac3, &Pal3);
这句的效果,图片被放大了!
今天用到的main函数。
用户158978 2009-12-9 13:21