【方法】STemWin图形库中的GUI_DrawBitmap函数显示图片时,只截取图片的一部分并显示的方法

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 
#include 
#include 
#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);
  }
}

原始图片:

示例程序是把原始图片里面的小正方形单独截取出来显示。

示例程序运行结果:

【方法】STemWin图形库中的GUI_DrawBitmap函数显示图片时,只截取图片的一部分并显示的方法_第1张图片

【方法】STemWin图形库中的GUI_DrawBitmap函数显示图片时,只截取图片的一部分并显示的方法_第2张图片

【方法】STemWin图形库中的GUI_DrawBitmap函数显示图片时,只截取图片的一部分并显示的方法_第3张图片

你可能感兴趣的:(CubeMX,STM32)