Guardar un bitmap con una región de la pantalla

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Guardar un bitmap con una región de la pantalla

Notapor endless_dark » Lun May 21, 2007 7:05 pm

Bueno, estoy desarrollando un programilla en C++ y con SDL . Lo que tiene el programa, es que salva una imagen con el resultado de lo que ha hecho el usuario. He conseguido guardarlo pero se guarda la pantalla entera.

Lo que quiero es que se guarde solo parte de la imagen, tengo entendido que es mediante Blit_Surface, en otra surface nueva del tamaño de la imagen de salida, pero no he conseguido nada todavía. Lo más que he logrado es que en la pantalla de salida, se vea la imagen que quería copiar, superpuesta a la pantalla del programa.

¿Alguien me puede echar una mano?
Gracias
endless_dark
 
Mensajes: 4
Registrado: Lun May 21, 2007 7:00 pm

Notapor hugoruscitti » Lun May 21, 2007 8:53 pm

Saludos, estaba leyendo tu mensaje y se me ocurrió una solucion,
primero generas una superficie en memoria de la región que
quieres guardar, luego imprimes sobre ella y la guardas en
un archivo.

Armé esta función que te facilita esa tarea. Probé la función y
hacía lo que esperaba, imagino que te funcionará correctamente
a tí también:

Código: Seleccionar todo
void guardar_imagen(SDL_Surface * fuente, char * nombre, int x, int y, int w, int h)
{
    SDL_Rect src = {x, y, w, h};
    SDL_Surface * new;

    new = SDL_CreateRGBSurface(0, w, h, fuente->format->BitsPerPixel,
        fuente->format->Rmask, fuente->format->Gmask, fuente->format->Bmask,
        fuente->format->Amask);

    SDL_BlitSurface(fuente, &src, new, NULL);
    SDL_SaveBMP(new, nombre);
}


para probar esta función escribí tienes que invocar a la función
enviandole un puntero a screen, el nombre del archivo a guardar
y el tamaño del bloque que quieres guardar. Por ejemplo:

Código: Seleccionar todo
guardar_imagen(screen, "salida.bmp", 20, 20, 100, 100);


Saludos.

pd: puede fallar... si tiene errores nos avisas.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor rcaf » Mar May 22, 2007 4:48 am

En el código falta la liberación de memoria de la superficie creada, debería quedar así:

Código: Seleccionar todo
void guardar_imagen(SDL_Surface * fuente, char * nombre, int x, int y, int w, int h)
{
    SDL_Rect src = {x, y, w, h};
    SDL_Surface * new_surface;

    // Crea superficie
    new_surface = SDL_CreateRGBSurface(SDL_HWSURFACE, w, h, fuente->format->BitsPerPixel,
        fuente->format->Rmask, fuente->format->Gmask, fuente->format->Bmask,
        fuente->format->Amask);

    // Copia una area de la superficie original en la superficie creada
    SDL_BlitSurface(fuente, &src, new_surface, NULL);

    // Guarda la nueva superficie en un archivo con formato BMP
    SDL_SaveBMP(new_surface, nombre);

   // Libera memoria de la superficie
   SDL_FreeSurface(new_surface);
}



S2!
Última edición por rcaf el Vie May 25, 2007 6:50 am, editado 1 vez en total
Roberto Albornoz Figueroa
Mi Blog
Wiki
Avatar de Usuario
rcaf
 
Mensajes: 71
Registrado: Jue Ago 10, 2006 4:35 am
Ubicación: Concepción, Octava Región. Chile

Notapor endless_dark » Vie May 25, 2007 1:02 am

Gracias tíos! En cuanto tenga algo de tiempo lo pruebo y os cuento :D

Edito: Ya está probado, tuve que cambiar el nombre a la superficie SDL porque new es una palabra reservada, o eso me decía el compilador. Por lo demás el código está excelente, mil gracias!
endless_dark
 
Mensajes: 4
Registrado: Lun May 21, 2007 7:00 pm

Notapor hugoruscitti » Vie May 25, 2007 7:12 pm

endless_dark escribió:Edito: Ya está probado, tuve que cambiar el nombre a la superficie SDL porque new es una palabra reservada, o eso me decía el compilador. Por lo demás el código está excelente, mil gracias!
Sí, tienes razón, ese día había compilado la rutina con un compilador
de C (en lugar de C++, a donde pertenece esa palabra reservada).

Tampoco había tenido en cuenta liberar la memoria reservada como
nos indicó RCAF.

Gracias a ambos. Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron