Как создать изображение и сохранить его в формате jpg в Godot 4.2.2?

Годо 4.2.2 ОС: Mac 14.5 (23F79) Чип: Apple M2 Pro

Я попытался создать изображение динамически и сохранить его как изображение .jpg.

func _ready():
    var user_data_dir = OS.get_user_data_dir()
    print("User data directory:", user_data_dir)

    # Create a new image with specified width, height, and format
    var image = Image.new()
    image.create(256, 256, false, Image.FORMAT_RGB8)  # Creating a 256x256 image with RGB format
    
    # Fill the image with black
    image.fill(Color.BLACK)  # Fill the entire image with black color
    
    # Check if the image is empty (filled it with black); i don't think this is necessary but just checking
    var is_empty = true
    for y in range(image.get_height()):
        for x in range(image.get_width()):
            var pixel_color = image.get_pixel(x, y)
            if pixel_color != Color.TRANSPARENT:  # Check against black color with transparent
                is_empty = false
                break
        if not is_empty:
            break

    if is_empty:
        print("The image is empty.")
    else:
        print("The image is not empty.")

    # Save the image as a JPG file
    var file_path_jpg = user_data_dir + "/black_image2.jpg"
    var result_jpg = image.save_jpg(file_path_jpg)

    if result_jpg == OK:
        print("JPG saved successfully at: ", file_path_jpg)
    else:
        print("Failed to save JPG. Error code: ", str(result_jpg))

    # Verify if the file exists
    var jpg_exists = FileAccess.file_exists(file_path_jpg)
    print("JPG exists: ", str(jpg_exists))
Output Log:
User data directory:/Users/xxxx/Library/Application Support/Godot/app_userdata/game
The image is empty.
Failed to save JPG. Error code: 31
JPG exists: true

даже думал, что файл создан пустым.

Я попытался создать изображение RGB8, залить его цветом и сохранить. Но почему-то сохраненный файл пуст. Есть идеи, почему это происходит?

Примечание. Я изучаю Godot последние две недели после перехода с Unity, поэтому, если это вопрос для новичков, пожалуйста, потерпите. Спасибо!

Я также попытался сохранить файл PNG, он даже не создал файл PNG, но я попробовал с .jpg, он создал файл, но с пустыми данными. Весь код, который я написал, подробно описан в разделе и журнале вывода.

Я хочу создать изображение, написать что-нибудь в изображении и сохранить это изображение, вот и все.

Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
D3.js - это обширная библиотека, используемая для привязки произвольных данных к объектной модели документа (DOM). Мы разберем основные варианты...
1
0
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сам не проверял, но на 90% уверен, что проблема в этой строке на раннем этапе:

var image = Image.new()
image.create(256, 256, false, Image.FORMAT_RGB8)

Проблема в том, что Image.create() — это статический метод, который возвращает изображение. Это означает, что вместо этого вам следует делать:

var image = Image.create(256, 256, false, Image.FORMAT_RGB8)

Код, который у вас сейчас есть, присваивает все пустой переменной «image», потому что Image.create() возвращает новое изображение, оно не применяет его, если вы вызываете его в экземпляре так, как вы его написали.

Примечание: ваш цикл, как отмечено в комментарии, не нужен. Вы создаете изображение в формате RGB8, у которого нет альфа-то есть непрозрачности, как у RGBA8. Это означает, что «if Pixel_color != Color.TRANSPARENT:» всегда пройдет. Единственная причина, по которой вы получаете is_empty = true, заключается в том, что изображение, на которое вы ссылаетесь, никогда не создается и, следовательно, не имеет пикселей, поэтому цикл никогда не запускается.

Ben Brown 05.06.2024 09:36

Спасибо за ваш отзыв! Это решения. Я тоже только что нашел этот вопрос на Reddit.

Zmuffin 05.06.2024 10:05

нет проблем, рад, что смог быть полезным!

Ben Brown 05.06.2024 10:09

Другие вопросы по теме