107 lines
3.2 KiB
GDScript
107 lines
3.2 KiB
GDScript
extends TextureRect
|
||
class_name HTTPTextureRect
|
||
|
||
signal loading_started
|
||
signal loading_finished(success: bool)
|
||
|
||
# HTTP请求节点
|
||
var http_request: HTTPRequest
|
||
|
||
func _ready():
|
||
# 创建HTTP请求节点
|
||
http_request = HTTPRequest.new()
|
||
add_child(http_request)
|
||
|
||
# 连接信号
|
||
http_request.request_completed.connect(_on_request_completed)
|
||
|
||
# 从URL加载图像
|
||
func load_from_url(url: String, custom_headers: Array = []) -> void:
|
||
if url.is_empty():
|
||
push_error("HTTPTextureRect: URL不能为空")
|
||
loading_finished.emit(false)
|
||
return
|
||
|
||
loading_started.emit()
|
||
|
||
# 发起HTTP请求
|
||
var error = http_request.request(url, custom_headers)
|
||
if error != OK:
|
||
push_error("HTTPTextureRect: 发起HTTP请求失败,错误码: " + str(error))
|
||
loading_finished.emit(false)
|
||
|
||
# HTTP请求完成的回调函数
|
||
func _on_request_completed(result, response_code, headers, body):
|
||
if result != HTTPRequest.RESULT_SUCCESS:
|
||
push_error("HTTPTextureRect: HTTP请求失败,错误码: " + str(result))
|
||
loading_finished.emit(false)
|
||
return
|
||
|
||
if response_code != 200:
|
||
push_error("HTTPTextureRect: HTTP请求返回非200状态码: " + str(response_code))
|
||
loading_finished.emit(false)
|
||
return
|
||
|
||
# 检查内容类型
|
||
var content_type = ""
|
||
for header in headers:
|
||
if header.to_lower().begins_with("content-type:"):
|
||
content_type = header.substr(13).strip_edges().to_lower()
|
||
print("HTTPTextureRect: 内容类型: ", content_type)
|
||
break
|
||
|
||
# 创建图像
|
||
var image = Image.new()
|
||
var error = ERR_INVALID_DATA
|
||
|
||
# 根据内容类型选择加载方法
|
||
if content_type.begins_with("image/jpeg") or content_type.begins_with("image/jpg"):
|
||
error = image.load_jpg_from_buffer(body)
|
||
elif content_type.begins_with("image/png"):
|
||
error = image.load_png_from_buffer(body)
|
||
elif content_type.begins_with("image/webp"):
|
||
error = image.load_webp_from_buffer(body)
|
||
elif content_type.begins_with("image/bmp"):
|
||
error = image.load_bmp_from_buffer(body)
|
||
else:
|
||
# 未知内容类型,尝试常见格式
|
||
error = image.load_jpg_from_buffer(body)
|
||
if error != OK:
|
||
error = image.load_png_from_buffer(body)
|
||
if error != OK:
|
||
error = image.load_webp_from_buffer(body)
|
||
if error != OK:
|
||
error = image.load_bmp_from_buffer(body)
|
||
|
||
# 检查加载结果
|
||
if error != OK:
|
||
push_error("HTTPTextureRect: 无法加载图像,错误码: " + str(error))
|
||
loading_finished.emit(false)
|
||
return
|
||
|
||
# 创建纹理并应用
|
||
var texture = ImageTexture.create_from_image(image)
|
||
self.texture = texture
|
||
print("HTTPTextureRect: 图像加载成功,尺寸: ", image.get_width(), "x", image.get_height())
|
||
loading_finished.emit(true)
|
||
|
||
# 加载QQ头像的便捷方法
|
||
func load_qq_avatar(qq_number: String) -> void:
|
||
if not qq_number.is_valid_int():
|
||
push_error("HTTPTextureRect: QQ号必须为纯数字")
|
||
loading_finished.emit(false)
|
||
return
|
||
|
||
# 使用QQ头像API
|
||
#var url = "https://q.qlogo.cn/headimg_dl?dst_uin=" + qq_number + "&spec=640&img_type=png"
|
||
var url = "http://q1.qlogo.cn/g?b=qq&nk="+qq_number+"&s=100"
|
||
|
||
# 添加浏览器模拟头
|
||
var headers = [
|
||
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
||
"Accept: image/png,image/jpeg,image/webp,image/*,*/*;q=0.8"
|
||
]
|
||
|
||
# 加载图像
|
||
load_from_url(url, headers)
|