Hola a todos!... estoy trabajando en un jueguito y me surgió un problema, al principio creí que sería fácil de resolver, pero me jodí...xD

La pregunta es: He guardado una imagen x con la función [gml]screen_save();[/gml] y esta captura tiene una particularidad: Hay una imagen simple con borde negro y relleno blanco, pero atrás de la imagen hay un fondo rojo... cómo puedo hacer para decirle a GMS que mediante la función[gml]sprite_add("foto.png",0,true,false,0,0);[/gml] borre únicamente ÚNICAMENTE el fondo rojo y me guarde sólo la imagen blanca con borde negro como sprite...
Adjunté una pequeña imagen que representa la captura de pantalla...xD
alaberga regué el café.

BA:STFW&RTFM

Se supone que el tercer parámetro de la función sprite_add() sirve para remover el fondo, por lo que puesto en true, tal como está en tu ejemplo, debería quitar el fondo.

Para que la opción de remover el fondo funcione, el color debería ser parejo, ya que lo que hace GM es revisar de qué color es el pixel de la esquina inferior izquierda en el sprite, y borrar todos los pixeles que coincidan con ese color de ese pixel.

#2 Octubre 14, 2015, 04:38:23 AM Ultima modificación: Octubre 14, 2015, 01:50:01 PM por fasst007
Quizás quiera quitar el fondo y que se almacene en el sprite el objeto circular y no que el fondo siga estando pero con transparencia. ¿es así NiuWeb?

Quiero decir, cambiar el fondo rojo a transparente y luego cortar los bordes sobrantes transparentes quedando un sprite que sea el mas pequeño posible que enmarque ese círculo. Porque de la otra forma el fondo de 496x305 seguiría estando solo que con transparencia, y quizás se quiera que ese fondo enorme no esté más en lugar de que simplemente no se vea.
Una suposición nada más, pero tampoco me queda claro la pregunta.

Esto:



en lugar de esto:



es lo que dice penumbra, ponle true en ese parámetro y procura que el fondo que quieres quitar, coincida con el color del pixel de más abajo-izquierda, sea cual sea el color, pero también vigila que el dibujo que deseas añadir, no tenga dentro de lo que sí sirve, del mismo color del fondo, porque entonces también te lo borrará xD. Eso es todo, así funciona jeje
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

#4 Octubre 14, 2015, 11:02:16 PM Ultima modificación: Octubre 14, 2015, 11:49:48 PM por fasst007
El tema es que el ya lo hizo (a eso de poner el tercer parámetro en true), y sin embargo no dio el resultado que él quería sino no estaría preguntando aquí. Por eso pensaba que quizás necesitaba otra cosa. Pero puede ser, como dicen ustedes, que simplemente necesite transparentar el fondo, a mi lo que me llama la atención es que en su pregunta lo ha hecho, aunque puede ser que lo hizo mal y era solo eso lo que necesitaba, no se.

Pero un detalle importante a remarcar para evitar confusiones o malentendidos es que el tercer parámetro en true no "quita" el fondo sino que lo pone en transparente.

ponerlo transparente y quitarlo es lo mismo, xD lo que claro, lo que espero que no pretenda que sea "inteligente" y detecte degradados, porque entonces, eso no funcionará xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

#6 Octubre 15, 2015, 01:14:08 AM Ultima modificación: Octubre 15, 2015, 01:16:18 AM por fasst007
Cita de: kostra en Octubre 15, 2015, 01:02:02 AM
ponerlo transparente y quitarlo es lo mismo, xD lo que claro, lo que espero que no pretenda que sea "inteligente" y detecte degradados, porque entonces, eso no funcionará xD


No es lo mismo XD XD. Si hago un sprite de 10000x10000 pixeles y dentro tengo dibujado un cuadrito de 3x3 píxel, el sprite en vez de medir 3x3 pixel mediria 10000x10000 pixel XD. Quitarlo sería que quede el sprite en 3x3 pixel con el cuadrito solo y dejandolo transparente el sprite mediria 10000x10000 pixel.


#7 Octubre 15, 2015, 02:03:16 AM Ultima modificación: Octubre 15, 2015, 02:07:21 AM por penumbra
Cita de: fasst007 en Octubre 15, 2015, 01:14:08 AM
Quitarlo sería que quede el sprite en 3x3 pixel con el cuadrito solo y dejandolo transparente el sprite mediria 10000x10000 pixel.
Eso formalmente se conoce como cropping o recorte o reajuste de canvas/lienzo, pero no me pareció que el post original hiciera referencia a esto.

Creo que si el usuario quiere remover el color de fondo, es porque desea conservar todo ese espacio vacío en el sprite final. Si esto no es así, y se quiere tener un sprite de un círculo sin espacio vacío alrededor, entonces no hay necesidad de usar la función sprite_add ni de recurrir a algo que borre un color de fondo porque:

a) Seguramente ya hay en el árbol de recursos un sprite con un círculo dibujado en él, sin lienzo/canvas enorme.

b) Si el inciso a no se cumple, en lugar de remover un color de fondo, se puede crear una superficie, se dibuja un círculo en ella (mediante un sprite o mediante la función correspondiente) y al final esa superficie se convierte a un sprite.

#8 Octubre 15, 2015, 03:17:48 AM Ultima modificación: Octubre 15, 2015, 03:19:31 AM por NiuWeb
Gracias por las respuestas... pero quizá no me expliqué completamente bien...
Lo que necesito es eliminar son LOS PIXELES QUE TENGAN EL COLOR ROJO, ya que en la room no siempre estará libre la esquina, que como dice Penumbra, es el pixel que toma el GMS para borrar los pixeles de ese color... es decir que, así hallan únicamente 1 pixel de color rojo, ese pixel se borre...No sé si esto tampoco explica bien mi problema, pero supongo que lo hice...Gracias de antemano.. :D :D :D :D
alaberga regué el café.

BA:STFW&RTFM

haber... Lo que quieres es dejar transparente los píxeles de color rojo únicamente.

Si en la captura hay otro objeto ¿debería quedar? porque al no ser de color rojo quedaría en el sprite tambien
¿esto es así?

Cita de: fasst007 en Octubre 15, 2015, 03:46:50 AM
haber... Lo que quieres es dejar transparente los píxeles de color rojo únicamente.

Si en la captura hay otro objeto ¿debería quedar? porque al no ser de color rojo quedaría en el sprite tambien
¿esto es así?
Eso es exactamente lo que quiero, que todos los objetos, a excepción del fondo rojo y todos los pixeles de este color, permanezcan. En cambio, todo lo que sea de color rojo, se vuelva transparente. XD :'( :'(
alaberga regué el café.

BA:STFW&RTFM

#11 Octubre 15, 2015, 04:01:12 AM Ultima modificación: Octubre 15, 2015, 06:12:44 AM por fasst007
Cita de: penumbra en Octubre 15, 2015, 02:03:16 AM
Cita de: fasst007 en Octubre 15, 2015, 01:14:08 AM
Quitarlo sería que quede el sprite en 3x3 pixel con el cuadrito solo y dejandolo transparente el sprite mediria 10000x10000 pixel.
Eso formalmente se conoce como cropping o recorte o reajuste de canvas/lienzo, pero no me pareció que el post original hiciera referencia a esto.

Creo que si el usuario quiere remover el color de fondo, es porque desea conservar todo ese espacio vacío en el sprite final. Si esto no es así, y se quiere tener un sprite de un círculo sin espacio vacío alrededor, entonces no hay necesidad de usar la función sprite_add ni de recurrir a algo que borre un color de fondo porque:

a) Seguramente ya hay en el árbol de recursos un sprite con un círculo dibujado en él, sin lienzo/canvas enorme.

b) Si el inciso a no se cumple, en lugar de remover un color de fondo, se puede crear una superficie, se dibuja un círculo en ella (mediante un sprite o mediante la función correspondiente) y al final esa superficie se convierte a un sprite.

En un principio todo era confuso ja, menos mal que llegó Niuweb. Porque aún necesitando ese espacio vacío alrededor entonces  tampoco tenía sentido el screen_save, porque directamente almacena la posición del círculo y listo en lugar de guardar un PNG entero. De última si necesita ese fondo vacío crea una surface con la dimensión del fondo transparente y le dibuja el círculo en esa posición. Por donde se lo mire no se le encontraba la lógica al asunto y que era lo que realmente se necesitaba.

Tomé la posibilidad que necesitase una solución genérica, porque a veces uno hace una pregunta sumamente simplificada para que se entienda, nada más. Si vamos por resolver esa pregunta puntual de un circulito y un fondo, por supuesto que hay formas muy directas y fáciles de hacerlo, pero creo que era obvio que lo del circulito era solo un ejemplo simplificado para hacer entender la pregunta.

1) Además había dicho: "me guarde sólo la imagen blanca con borde negro como sprite." y eso era confuso porque guardar solo la imagen blanca con borde negro no incluía nada más, ni espacio transparente alrededor ni nada. En eso me pareció que cabía la posibilidad del crop.
2) ya había probado el tercer campo en "true" y aún así no era lo que necesitaba.

Por eso dije que no sabía bien lo que necesitaba y estaba en esa dualidad de transparentar el fondo o quitarlo completamente dejando el objeto que sea que esté en el PNG (sea círculo u otra cosa) y por eso postié esas dos imágenes con los dos casos posibles para que él aclare que era lo que necesitaba.

Bueno, al principio pensé en surfaces,pero...hay una razón por la cual hice el post, y es: No sé usar surfaces :'( :'( :'(.. Así quie si alguien sabe, me encantaría que me ayudaran con esto...xD
alaberga regué el café.

BA:STFW&RTFM

Me gustaría que nos expliques de que se trata el juego y para qué necesitas guardar y cargar esas imágenes. Así te podríamos ayudar con diversas alternativas

Cita de: fasst007 en Octubre 15, 2015, 04:20:56 AM
Me gustaría que nos expliques de que se trata el juego y para qué necesitas guardar y cargar esas imágenes. Así te podríamos ayudar con diversas alternativas
Ok, es un servicio del juego que básicamente permite dibujar tu propio ícono con un sistema de PixelArt que me inventé, en realidad todo eso está bien, pero el ícono debe tener 2 subimágenes, tambien lo tengo arreglado y al presionar un botón cambia una variable que indica en que subimage se esta dibujando. El problema es que obviamente se necesita dar la opción de que el usuario pueda dejar espacios vacios/transparentes, y tambien se debe dibujar el pixelart únicamente en colores blanco y negro para personalizar el color luego (lo cual tambien tengo arreglado), pero al dejar solo blanco y negro se me complicó lo de las transparencias y pensé en arreglando haciendo que los espacios "transparentes" fueran los pixeles rojos, y así evitar problemas. No soy bueno explicando ideas pero supongo que se entendió...xD
alaberga regué el café.

BA:STFW&RTFM