Crear un fichero png mediante código

Publicado por Marth, Mayo 07, 2022, 03:47:31 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Marth

Verán, quiero crear un fichero .png en game maker mediante código, sin usar el editor de sprites.
Digamos que tengo estas variables:

rojo[0,0]=23
rojo[0,1]=210
rojo[1,0]=100
rojo[0,1]=13

verde[0,0]=14
verde[0,1]=30
verde[1,0]=200
verde[0,1]=159

azul[0,0]=255
azul[0,1]=0
azul[1,0]=3
azul[0,1]=99

alfa[0,0]=0.45
alfa[0,1]=1
alfa[1,0]=0.20
alfa[0,1]=0.91


Pues la cosa es generar un fichero .png tamaño 2x2 cuyos píxeles sigan estos parámetros.

Marth

Ya encontré una manera de hacerlo:

var super=surface_create(ancho,alto)
surface_set_target(super)
draw_clear_alpha(0,0)

for(var b=0; b<alto; b++)
for(var a=0; a<ancho; a++){
   draw_set_alpha(alfa[a,b])
   draw_point_color(a,b,make_color_rgb(rojo[a,b],verde[a,b],azul[a,b]))
}
draw_set_alpha(1)
var custom=sprite_create_from_surface(super,0,0,ancho,alto,0,0,0,0)
surface_save(super,"test.png")
surface_reset_target()
surface_free(super)
sprite_delete(custom)

Marth

He detectado un error en la forma que uso para guardar el sprite.
Si un pixel tiene un alfa menor que uno, eso hará que los colores pierdan valor.
Por ejemplo, si el valor de azul del pixel es 255 y el alfa es 0'5, pues el azul del sprite guardado será 127. Y el valor del alfa será 0'25.

Marth

#3
Daré más información sobre mi problema.
Tengo unos objetos Pixel que representan cada pixel de la imagen.
Cuando guardo una imagen, recurro a esto:

var super=surface_create(ancho,alto)
surface_set_target(super)
draw_clear_alpha(0,0)
with(Pixel){
   draw_set_alpha(image_alpha)
   draw_point_color(a,b,image_blend)
}
draw_set_alpha(1)
var custom=sprite_create_from_surface(super,0,0,ancho,alto,0,0,0,0)
surface_save(super,fichero)
surface_reset_target()
surface_free(super)
sprite_delete(custom)


Y este es el código tras cargar la imagen:

var super=surface_create(ancho,alto)
surface_set_target(super)
draw_clear_alpha(0,0)
draw_sprite(custom,0,0,0)
surface_reset_target()
      
var bufo=buffer_create(4*ancho*alto,buffer_fixed,1)
buffer_get_surface(bufo,super,0)
surface_free(super)

var sitio, num
for(var an=0; an<ancho; an++){
   for(var al=0; al<alto; al++){
      sitio=global.pixel[an,al]
      num=buffer_peek(bufo,4*(an+al*ancho),buffer_u32)
      with(sitio)
         previamente()
      sitio.image_alpha=(num>>24)&255
      sitio.image_blend=make_color_rgb(num&255,(num>>8)&255,(num>>16)&255)
   }
}
with(Pixel)
   image_alpha/=255
buffer_delete(bufo)
sprite_delete(custom)


Ya de por sí debo veo un error que multiplica por 255 el alfa de la imagen. Pero la cosa es que entre tanto el guardado como el cargado reducen el alfa de los píxeles si este es inferior a 1, tal como muestro en las imágenes de ejemplo.

brunoxzx

#4
¿qué pasa si usas la función  "sprite_add" en lugar de ese código de cargado? Se me hace raro que al guardar modifique el alfa, pero más al rato checo, también trata de usar el blend mode bm_one al dibujar la imagen sobre la superficie en el código de guardado, quizá tenga que ver con eso. Como ya dije más al rato hago pruebas, pero dime que tal.

Edit: También puedes tratar usando sprite_save para guardar: https://manual.yoyogames.com/GameMaker_Language/GML_Reference/Asset_Management/Sprites/Sprite_Manipulation/sprite_save.htm
Edit 2: El alfa de las imágenes siempre ha sido un valor de 0 a 255, el que los programas usen valores de 0 a 1 para facilitarnos la vida es otra cosa, eso no es un error.

Marth

Pues la función sprite_save me resulta una buena opción para guardar el sprite. Gracias.

Powered by EzPortal
SMF spam blocked by CleanTalk