Python: como salvar o layout UV com uma cor de fundo específica?

Sep 01 2020
select_obj(some_obj)
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.select_all(action='TOGGLE')
bpy.ops.mesh.select_all(action='TOGGLE')
# how to set background color of this image?
bpy.ops.uv.export_layout(filepath='uv_layout.png', size=(1024, 1024), opacity=1)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.select_all(action='TOGGLE')

A imagem tem esta aparência (tem um fundo transparente):

No entanto, desejo obter um fundo colorido como este:

Já tentei importar PILe fazer a manipulação de imagens com este módulo, mas parece que não está incluso no Blender.

Respostas

4 HikariTW Sep 06 2020 at 20:56

Não é tão difícil substituir a função fornecida pelo próprio módulo ( ela ainda está no escopo do Python ):

import io_mesh_uv_layout
from io_mesh_uv_layout.export_uv_png import *

def new_export(filepath, face_data, colors, width, height, opacity):
    offscreen = gpu.types.GPUOffScreen(width, height)
    offscreen.bind()

    try:
        bgl.glClearColor(0.0, 1.0, 0.0, 0.9)  # Here, a green, 0.9 alpha background
        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT)
        draw_image(face_data, opacity)

        pixel_data = get_pixel_data_from_current_back_buffer(width, height)
        save_pixels(filepath, pixel_data, width, height)
    finally:
        offscreen.unbind()
        offscreen.free()

io_mesh_uv_layout.export_uv_png.export = new_export  # Directly overwrite it

Em seu addon, você pode fornecer um seletor de cores (de uma propriedade de flutuação de cores) para o usuário. E depois de atualizar o valor, faça o patch da função de exportação original imediatamente. Não deve haver nenhuma parte complicada e nenhum problema de desempenho.


Um método mais complexo é modificar a própria exportação de layout uv:

Que precisa modificar o próprio operador, meio complicado, mas mais flexível de usar:

(Comentário incluído)

2 Joonas Sep 06 2020 at 20:08

Se o fundo preto for bom o suficiente, você pode importar a imagem criada e remover o canal alfa.

select_obj(some_obj)
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.select_all(action='TOGGLE')
bpy.ops.mesh.select_all(action='TOGGLE')
# how to set background color of this image?
bpy.ops.uv.export_layout(filepath='uv_layout.png', size=(1024, 1024), opacity=1)

img = bpy.data.images.load("C:\\File\\Path\\Here\\uv_layout.png") #Import image. Remember to change filepath
img.alpha_mode = "NONE" #Ignore alpha channel
img.save() #Save the image

bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.select_all(action='TOGGLE')

Apenas certifique-se de alterar o caminho do arquivo para apontar para o seu arquivo.

Isso pode ser feito manualmente no editor de imagens a partir do menu suspenso Alpha selecionando Nenhum. O menu suspenso Alpha está na guia Imagem. A visibilidade da guia de imagem pode ser alternada pressionando n.