Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Crear un fichero png mediante código  (Leído 277 veces)

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

Desconectado Marth

en: Mayo 07, 2022, 03:47:31 pm
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.
« Última modificación: Mayo 09, 2022, 01:12:21 am por Marth »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Marth

Respuesta #1 en: Mayo 07, 2022, 04:06:35 pm
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)


Desconectado Marth

Respuesta #2 en: Mayo 09, 2022, 01:18:09 am
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.


Desconectado Marth

Respuesta #3 en: Mayo 10, 2022, 11:37:41 pm
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.
« Última modificación: Mayo 10, 2022, 11:39:15 pm por Marth »

 


Desconectado brunoxzx

Respuesta #4 en: Mayo 11, 2022, 09:19:22 pm
¿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.
« Última modificación: Mayo 11, 2022, 10:28:15 pm por brunoxzx »

 
Los siguientes usuarios dieron las gracias a este tema: Marth


Desconectado Marth

Respuesta #5 en: Mayo 14, 2022, 01:18:14 pm
Pues la función sprite_save me resulta una buena opción para guardar el sprite. Gracias.