STemWin里面绘图的函数(如GUI_DrawBitmap)只能绘制整张图片,没有提供绘制图片指定区域的功能。
如果想要截取图片的一部分然后显示到屏幕上,应该配合使用GUI_SetClipRect函数。
下面的示例代码从bmp的(x0,y0)处截取width×height大小的图片,然后显示到屏幕的(x,y)坐标上。
/* 截取一部分位图并显示 */
void copy_part_of_bitmap(int x, int y, const GUI_BITMAP *bmp, int x0, int y0, int width, int height)
{
GUI_RECT rect;
rect.x0 = x;
rect.y0 = y;
rect.x1 = x + width - 1;
rect.y1 = y + height - 1;
GUI_SetClipRect(&rect);
GUI_DrawBitmap(bmp, x - x0, y - y0);
GUI_SetClipRect(NULL);
}
其中的GUI_DrawBitmap函数也可以换成其他的图片显示函数,比如GUI_PNG_Draw函数。
【示例代码】
示例程序下载地址:https://pan.baidu.com/s/1jhovEprBETy9XCapKZuthg(提取码:m6ti)
#include <GUI.h>
#include <stdio.h>
#include <stm32f4xx.h>
#include "common.h"
#include "ARKLCD7.h"
#include "W9825G6KH.h"
extern GUI_CONST_STORAGE GUI_BITMAP bmtest_pattern;
/* 截取一部分位图并显示 */
void copy_part_of_bitmap(int x, int y, const GUI_BITMAP *bmp, int x0, int y0, int width, int height)
{
GUI_RECT rect;
rect.x0 = x;
rect.y0 = y;
rect.x1 = x + width - 1;
rect.y1 = y + height - 1;
GUI_SetClipRect(&rect);
GUI_DrawBitmap(bmp, x - x0, y - y0);
GUI_SetClipRect(NULL);
}
int main(void)
{
HAL_Init();
clock_init();
usart_init(115200);
printf("STM32F429IG LCD\n");
printf("SystemCoreClock=%u\n", SystemCoreClock);
W9825G6KH_Init();
ARKLCD7_Init();
GUI_Init();
while (1)
{
GUI_MULTIBUF_Begin();
GUI_SetBkColor(GUI_LIGHTBLUE);
GUI_Clear();
copy_part_of_bitmap(31, 35, &bmtest_pattern, 13, 38, 37, 35);
copy_part_of_bitmap(68, 35, &bmtest_pattern, 55, 31, 25, 20);
copy_part_of_bitmap(93, 35, &bmtest_pattern, 79, 1, 20, 21);
copy_part_of_bitmap(31, 70, &bmtest_pattern, 1, 1, 9, 72);
GUI_MULTIBUF_End();
HAL_Delay(1000);
GUI_MULTIBUF_Begin();
GUI_SetBkColor(GUI_LIGHTYELLOW);
GUI_Clear();
copy_part_of_bitmap(0, 0, &bmtest_pattern, 16, 1, 32, 36);
copy_part_of_bitmap(300, 300, &bmtest_pattern, 16, 1, 32, 36);
copy_part_of_bitmap(768, 444, &bmtest_pattern, 16, 1, 32, 36);
GUI_MULTIBUF_End();
HAL_Delay(1000);
GUI_MULTIBUF_Begin();
GUI_CopyRect(300, 300, 400, 400, 32, 36);
GUI_CopyRect(300, 300, 400, 436, 32, 36);
GUI_DrawBitmap(&bmtest_pattern, 200, 200);
GUI_MULTIBUF_End();
HAL_Delay(1000);
}
}
原始图片:
示例程序是把原始图片里面的小正方形单独截取出来显示。
示例程序运行结果: