StreamOverlay/lib/image_loader.gd

57 lines
1.9 KiB
GDScript3
Raw Normal View History

extends Node
var _client: BufferedHTTPClient
enum ImgFmt { PNG, JPG, WEBP, BMP, GIF, UNKNOWN }
func _identify_image(byte_array: PackedByteArray) -> ImgFmt:
if byte_array.size() < 8:
return ImgFmt.UNKNOWN
# PNG magic bytes: 0x89, P, N, G, \r, \n, 0x1a, \n
if byte_array[0] == 0x89 and byte_array[1] == 0x50 and byte_array[2] == 0x4E and byte_array[3] == 0x47:
return ImgFmt.PNG
# JPEG magic bytes (starts with 0xFF, 0xD8)
if byte_array[0] == 0xFF and byte_array[1] == 0xD8:
return ImgFmt.JPG
# WebP magic bytes (RIFF header, "WEBP" at offset 8)
if byte_array[0] == 0x52 and byte_array[1] == 0x49 and byte_array[2] == 0x46 and byte_array[3] == 0x46 and \
byte_array[8] == 0x57 and byte_array[9] == 0x45 and byte_array[10] == 0x42 and byte_array[11] == 0x50:
return ImgFmt.JPG
# BMP Magic (Starts with 0x42, 0x4D
if byte_array[0] == 0x42 and byte_array[1] == 0x4D:
return ImgFmt.BMP
if byte_array[0] == 0x47 and byte_array[1] == 0x49 and byte_array[2] == 0x46:
return ImgFmt.GIF
return ImgFmt.UNKNOWN
func _ready() -> void:
_client = BufferedHTTPClient.new()
_client.name = "ImageLoaderHTTPClient"
add_child(_client)
func load_image(url: String) -> ImageTexture:
var request : BufferedHTTPClient.RequestData = _client.request(url, HTTPClient.METHOD_GET, {}, "")
var response : BufferedHTTPClient.ResponseData = await _client.wait_for_request(request)
var img_buffer: PackedByteArray = response.response_data
var img: Image = Image.new()
match _identify_image(img_buffer):
ImgFmt.PNG:
img.load_png_from_buffer(img_buffer)
ImgFmt.JPG:
img.load_jpg_from_buffer(img_buffer)
ImgFmt.WEBP:
img.load_webp_from_buffer(img_buffer)
ImgFmt.BMP:
img.load_bmp_from_buffer(img_buffer)
ImgFmt.GIF:
push_error("Attempting to load a GIF image, use media loader to load.")
ImgFmt.UNKNOWN:
push_error("Failed to identify file!")
return ImageTexture.create_from_image(img)