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

16 篇文章 7 订阅

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

原始图片:

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

示例程序运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨大八爪鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值