【Godot4.2】图片处理函数库 - textureDB

概述

Godot中节点使用的图片是Texture2D或其子类型,而涉及图片处理,大多数功能在Image类型中,并且我们通常需要频繁的构造ImageImageTexture类型。
为了封装构造ImageImageTexture类型的代码,提供直接从文件到直接可以赋值给节点的纹理图片,或者从节点纹理直接获取处理后的纹理,所以笔者才起了创建这个静态函数库的想法。

代码

(会持续更新最新修改版本,另外请注意Godot版本)

# =============================================
# 名称:textureDB
# 类型:静态函数库
# 描述:一些简化处理ImageTexture的静态函数
# 作者:巽星石
# Godot版本:v4.2.1.stable.official [b09f793f5]
# 创建时间:20242822:48:38
# 最后修改时间:20242902:02:58
# =============================================
class_name textureDBenum ImageType{JPG,PNG,WEBP}   # 支持存储的图片类型# 直接从路径加载图片并返回ImageTexture
static func load_texture(img_path:String) -> ImageTexture:var texture = ImageTexture.new()var img = Image.load_from_file(img_path)texture = texture.create_from_image(img)return texture# 水平翻转Texture2D
static func flip_x_texture(texture:Texture2D) -> ImageTexture:var new_texture = ImageTexture.new()var img = texture.get_image()img.flip_x()new_texture = new_texture.create_from_image(img)return new_texture# 垂直翻转Texture2D
static func flip_y_texture(texture:Texture2D) -> ImageTexture:var new_texture = ImageTexture.new()var img = texture.get_image()img.flip_y()new_texture = new_texture.create_from_image(img)return new_texture# 创建并返回原图片的灰度图
static func gray_scale_texture(texture:Texture2D) -> ImageTexture:var new_texture = ImageTexture.new()var img = texture.get_image()for x in range(img.get_width()):for y in range(img.get_height()):var old_color = img.get_pixel(x,y)var gray = (old_color.r +  old_color.g +  old_color.b)/3var new_color = Color(gray,gray,gray,old_color.a)img.set_pixel(x,y,new_color)new_texture = new_texture.create_from_image(img)return new_texture# 获取并返回Texture2D的一个局部矩形区域
static func get_region(texture:Texture2D,region: Rect2i) -> ImageTexture:var new_texture = ImageTexture.new()var img = texture.get_image()img = img.get_region(region)new_texture = new_texture.create_from_image(img)return new_texture# 为图片添加边框
static func draw_border(texture:Texture2D,border_size:PackedInt32Array = [10,10,10,10],border_color:Color=Color.WHITE) -> ImageTexture:var new_texture = ImageTexture.new()# 1.通过原图和边框尺寸计算新图的尺寸var old_img = texture.get_image() # 原图片var new_img = Image.new()         # 新图片# 新的尺寸 = 原图片尺寸 + 边框尺寸var new_size = old_img.get_size() + Vector2i(border_size[1] + border_size[3],border_size[0] + border_size[2])# 2.通过新尺寸构造新的Imagenew_img = new_img.create(new_size.x,new_size.y,false,Image.FORMAT_RGBA8)new_img.fill(border_color)  # 填充整个纹理区域为边框颜色# 3.在新图的指定位置绘制原图var rect = old_img.get_used_rect()                # 原图的纹理区域var pos = Vector2i(border_size[3],border_size[0]) # 起始位置new_img.blit_rect(old_img,rect,pos)               # 将原图绘制到新Image的指定区域# 4.通过新Image构造ImageTexturenew_texture = new_texture.create_from_image(new_img)return new_texture# 创建纯色块的ImageTexture
static func color_block(size:Vector2,color:Color=Color.WHITE) -> ImageTexture:var new_texture = ImageTexture.new()var img = Image.new()img = img.create(size.x,size.y,false,Image.FORMAT_RGBA8)img.fill(color)new_texture = new_texture.create_from_image(img)return new_texture# 创建棋盘格的ImageTexture
static func checker_board(img_size:Vector2i,cell_size:Vector2i=Vector2i(10,10),color1:Color=Color.WHITE,color2:Color=Color.BLACK) -> ImageTexture:var new_texture = ImageTexture.new()var img = Image.new()img = img.create(img_size.x,img_size.y,false,Image.FORMAT_RGBA8)# 计算所需要填充的数量var grid_size = ceil(img_size / cell_size) for x in range(grid_size.x):for y in range(grid_size.y):var rect = Rect2i(cell_size * Vector2i(x,y),cell_size)if (x % 2 == 0 and y % 2 == 0) or (x % 2 == 1 and y % 2 == 1): # 奇数行奇数列,或者偶数行偶数列img.fill_rect(rect,color1)else:img.fill_rect(rect,color2)new_texture = new_texture.create_from_image(img)return new_texture# 直接将Texture2D保存为本地图片文件
static func save_texture(texture:Texture2D,file_path:String,img_type:ImageType=ImageType.JPG) -> void:var img = texture.get_image()match img_type:ImageType.JPG:img.save_jpg(file_path)ImageType.PNG:img.save_png(file_path)ImageType.WEBP:img.save_webp(file_path)# 生成Image的缩略图
static func create_thumb(img:Image,size:Vector2) -> ImageTexture:var texture = ImageTexture.new()var old_size = img.get_size()  # 原图尺寸var aspect_ratio = old_size.aspect()# 原图比缩略图宽或高时if old_size.x > size.x or old_size.y > size.y:if old_size.x > old_size.y: # 图片水平方向比较长var new_w = size.xvar new_h = size.x / aspect_ratioimg.resize(new_w,new_h)else:var new_h = size.y var new_w = size.y * aspect_ratioimg.resize(new_w,new_h,Image.INTERPOLATE_LANCZOS)texture = texture.create_from_image(img)return texture# 生成指定路径文件的缩略图
static func create_thumb_from_file(img_path:String,size:Vector2) -> ImageTexture:var texture = ImageTexture.new()if img_path.get_extension() in ["png","jpg","svg"]:var img = Image.load_from_file(img_path)if img:texture = create_thumb(img,size)return textureelse:return null

用法示例

我们创建一个测试场景,添加一个TextureRect控件。

在这里插入图片描述

并设定如下:

在这里插入图片描述

加载图片文件到节点

为根节点创建如下代码:

extends Control@onready var texture_rect = $TextureRectfunc _ready():# 从文件加载图片texture_rect.texture = textureDB.load_texture("res://icon.svg")

运行后就可以看到图片被正确加载,这种直接加载图片文件为纹理的形式,比构造ImageTextureImage要简化的多了。

在这里插入图片描述

水平翻转图片

为了更好的展示图片处理效果,我们使用一张更大更复杂的图片。下面是原图加载后的效果:

在这里插入图片描述

修改设置如下:

在这里插入图片描述

根节点代码修改如下:

extends Control@onready var texture_rect = $TextureRectfunc _ready():var img_path = "C:/Users/Lenovo/Pictures/Screenshots/屏幕截图 2024-02-06 150512.png"# 从文件加载图片var texture = textureDB.load_texture(img_path)# 赋值水平翻转后的图片texture_rect.texture = textureDB.flip_x_texture(texture)

运行后的效果:

在这里插入图片描述
可以看到图片被水平翻转,而且没有涉及Image的底层操作。

垂直翻转图片

垂直翻转的代码很类似,只需要将flip_x_texture改为flip_y_texture就可以了。

extends Control@onready var texture_rect = $TextureRectfunc _ready():var img_path = "C:/Users/Lenovo/Pictures/Screenshots/屏幕截图 2024-02-06 150512.png"# 从文件加载图片var texture = textureDB.load_texture(img_path)# 赋值水平翻转后的图片texture_rect.texture = textureDB.flip_y_texture(texture)

垂直翻转效果:

在这里插入图片描述

局部裁切(显示图片局部)

通过get_region可以获取相应纹理的的一个局部。

extends Control@onready var texture_rect = $TextureRectfunc _ready():var img_path = "C:/Users/Lenovo/Pictures/Screenshots/屏幕截图 2024-02-06 150512.png"# 从文件加载图片var texture = textureDB.load_texture(img_path)# 赋值局部裁切图片texture_rect.texture = textureDB.get_region(texture,Rect2i(100,100,500,500))

效果如下:

在这里插入图片描述

可以应用于用户头像、封面图片裁切等场景。

绘制边框

在图片处理中有时候需要描边或绘制边框,draw_border可以为原图外部添加四个边上的描边,而且可以设定每个边不一样的宽度。

extends Control@onready var texture_rect = $TextureRectfunc _ready():var img_path = "C:/Users/Lenovo/Pictures/Screenshots/屏幕截图 2024-02-06 150512.png"# 从文件加载图片var texture = textureDB.load_texture(img_path)# 赋值添加描边效果的图片texture_rect.texture = textureDB.draw_border(texture)

默认的10像素边框:

在这里插入图片描述
可以自定义各个边的尺寸,顺序为:上右底左。

extends Control@onready var texture_rect = $TextureRectfunc _ready():var img_path = "C:/Users/Lenovo/Pictures/Screenshots/屏幕截图 2024-02-06 150512.png"# 从文件加载图片var texture = textureDB.load_texture(img_path)# 赋值添加描边效果的图片texture_rect.texture = textureDB.draw_border(texture,[200,100,200,100])

自定义边框宽度效果:

在这里插入图片描述

另外,边框颜色也可以自定义:

extends Control@onready var texture_rect = $TextureRectfunc _ready():var img_path = "C:/Users/Lenovo/Pictures/Screenshots/屏幕截图 2024-02-06 150512.png"# 从文件加载图片var texture = textureDB.load_texture(img_path)# 赋值添加描边效果的图片texture_rect.texture = textureDB.draw_border(texture,[200,100,200,100],Color.YELLOW_GREEN)

在这里插入图片描述

纯色块

color_block指定一个大小和颜色,就可以直接创建一个纯色块图片。默认为白色。

extends Control@onready var texture_rect = $TextureRectfunc _ready():# 赋值纯色块texture_rect.texture = textureDB.color_block(Vector2(200,200))

在这里插入图片描述

棋盘格

checker_board用于参数化的创建棋盘格纹理,可以看做是我的第一个纹理图片生成函数,当然基于CanvasItem的绘制函数,已经创建过棋盘格了。

extends Control@onready var texture_rect = $TextureRectfunc _ready():# 赋值棋盘格texture_rect.texture = textureDB.checker_board(Vector2i(100,100),Vector2i(10,10))

在这里插入图片描述
通过设定两个颜色,可以绘制彩色棋盘格。

extends Control@onready var texture_rect = $TextureRectfunc _ready():# 赋值棋盘格texture_rect.texture = textureDB.checker_board(Vector2i(100,100),Vector2i(10,10),Color.AQUA,Color.AQUAMARINE)

在这里插入图片描述

创建灰度图

基于每个像素点RGB值相加除以3的做法,相对效率不是太高。但算勉强实现,使用多线程可能会加速一些。不过确实可以实现图片处理并输出为本地文件,一般使用还是用Shader实现吧,效率高多了。

extends Control@onready var texture_rect = $TextureRectfunc _ready():var img_path = "C:/Users/Lenovo/Pictures/Screenshots/屏幕截图 2024-02-06 150512.png"# 从文件加载图片var texture = textureDB.load_texture(img_path)# 赋值灰度图texture_rect.texture = textureDB.gray_scale_texture(texture)

在这里插入图片描述

创建缩略图

(等待施工…2024年2月9日01:37:37)

保存纹理为本地文件

(等待施工…2024年2月9日01:37:37)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777725.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python 基础知识点(蓝桥杯python科目个人复习计划36)

今日复习计划:DFS搜索基础 1.简介 搜索方法:穷举问题解空间部分(所有情况),从而求出问题的解。 深度优先搜索:本质上是暴力枚举 深度优先:尽可能一条路走到底,走不了再回退。 2…

《零基础实践深度学习》波士顿房价预测任务 02

1.3 波士顿房价预测任务 上一节我们初步认识了神经网络的基本概念(如神经元、多层连接、前向计算、计算图)和模型结构三要素(模型假设、评价函数和优化算法)。本节将以“波士顿房价预测”任务为例,向读者介绍使用Pytho…

C#在设备数据采集中的应用

设备数据采集在现代工业生产中扮演着至关重要的角色。随着工业互联网的发展,设备数据采集技术已经成为了智能制造的基础之一。在这篇文章中,我们将探讨C#语言在设备数据采集中的应用。 首先,让我们来了解一下设备数据采集的概念。设备数据采集…

购物|电商购物小程序|基于微信小程序的购物系统设计与实现(源码+数据库+文档)

电商购物小程序目录 目录 基于微信小程序的购物系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户前台功能实现 2、管理员后台功能实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示: 五、核心代码 六、论文参考 七、最新计算机毕设…

使用SpringMVC实现功能

目录 一、计算器 1、前端页面 2、服务器处理请求 3、效果 二、用户登陆系统 1、前端页面 (1)登陆页面 (2)欢迎页面 2、前端页面发送请求--服务器处理请求 3、效果 三、留言板 1、前端页面 2、前端页面发送请求 &…

day45_maven_tomcat

今日内容 0 复习昨日 1 maven 2 tomcat 3 创建项目 0 复习昨日 1 单词写5遍 argument 参数 parameter 参数 access 访问 field 字段 invoke 调用 illegal 非法 invalid 无效 column 列 property 属性 DataSource 数据源 2 数据库连接池有啥好处 3 获得字节码文件的方式 Class.f…

如何从 Windows 硬盘恢复丢失或删除的照片

您是否曾经不小心删除了无法再恢复的重要照片?如果这是您的商务或家庭照片、婚礼或童年回忆或者亲人的照片怎么办? 根据我们的经验,用户在清理计算机以提高存储/速度时通常会遇到此类事故,并最终删除包含重要图片的文件夹&#x…

VUE基础知识八 ElemrntUI使用

使用VUE脚手架以及在项目里引入ElementUI,上一章节讲过了,本章节就不赘述了。 ElementUI官网 所有使用ElementUI的组件,在使用时,都是以el-组件名开头的 一 按钮组件 ElementUI里的组件都是类似的,这里以按钮组件来…

AWD-Test2

1.已知账号密码&#xff0c;可SSH连接进行代码审计。2.登录可万能密码进入&#xff0c;也可注册后登录。3.修改url参数&#xff0c;发现报错。确定为Linux系统4.写入一句话&#xff0c;并提交。&#xff08;也可以文件上传&#xff0c;这里采用简洁的方法&#xff09; <?p…

macbookair怎么清理内存 ?如何利用 CleanMyMac X 进行系统清理

macbookair怎么清理内存 清理MacBook Air的内存可以通过以下几种方法&#xff1a; 优化储存空间。在MacBook Air上&#xff0c;可以通过“优化储存空间”来释放空间。这包括将文件储存在iCloud中&#xff0c;如桌面、文稿和iCloud信息&#xff0c;以及自动移除在iCloud中观看…

〖大前端 - ES6篇②〗- let和const

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

一文讲透Python函数中的形式参数和实际参数

函数参数包括形式参数和实际参数&#xff0c;简称形参和实参。其中形式参数即是在定义函数时函数后面括号中的参数列表&#xff08;parameterlist&#xff09;&#xff0c;比如上一个帖子的示例中的width, length&#xff1b;实际参数则是调用函数时函数后面括号中的参数值&…

Qt PCL学习(三):点云滤波

注意事项 版本一览&#xff1a;Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容&#xff1a;Qt PCL学习&#xff08;一&#xff09;&#xff1a;环境搭建、Qt PCL学习&#xff08;二&#xff09;&#xff1a;点云读取与保存 0. 效果演示 1. pcl_open_save.pro QT core guigr…

Linux应用程序参数传递的深入探索

大家好&#xff0c;今天给大家介绍Linux应用程序参数传递的深入探索&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在Linux环境中&#xff0c;应用程序的参数传递是一个核心且灵…

【Linux】模块参数

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f94a;不要让自己再留有遗憾&#xff0c;加油吧&#xff01; 模块参数 像用户程序一样&#xff0c;内核模块也可以接受命令行参数。首先应该声明用于保存命令行参数值的变…

XSS-Lab

1.关于20关的payload合集。 <script>alert(1)</script> "><script>alert(1)</script> onclickalert(1) " onclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

sklearn中一些简单机器学习算法的使用

目录 前言 KNN算法 决策树算法 朴素贝叶斯算法 岭回归算法 线性优化算法 前言 本篇文章会介绍一些sklearn库中简单的机器学习算法如何使用&#xff0c;一些注释已经写在代码中&#xff0c;帮助一些小伙伴入门sklearn库的使用。 注意&#xff1a;本篇文章只涉及到如何使用…

Java实现快乐贩卖馆管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

【iOS】——使用ZXingObjC库实现条形码识别并请求信息

文章目录 前言一、实现步骤二、扫描界面和扫描框的样式1.扫描界面2.扫描框 三、实现步骤 前言 ZXing库是一个专门用来解析多种二维码和条形码&#xff08;包括包括 QR Code、Aztec Code、UPC、EAN、Code 39、Code 128等&#xff09;的开源性质的处理库&#xff0c;而ZingObjC库…

蓝桥杯刷题day08——完全日期

1、题目描述 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021年6月5日的各位数字之和为20216516&#xff0c;而16是一个完全平方数&#xff0c;它是4的平方。所以2021年6月5日是一个完全日期。 请问&#xff0c;从200…