/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

¿como capturo la imagen de la pantalla?
Ir a página 1, 2  Siguiente
 
      Índice del Foro elrincondelc.com -> Gráficos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 08/06/2010 3:38 am
Título: ¿como capturo la imagen de la pantalla?

hola. soy novel en programación con c++ y no se como hacer lo siguiente:

quiero hacer una funcion o una subrutina que me devuelva en un array la imagen que está apareciendo en la pantalla en el instante en el que se ejecuta dicha funcion o subrutina. esto sería guardandola en un array en el que se especificase el color de cada pixel, en cada uno de sus tres canales: rojo, verde y azul.

si alguien pudiese decirme como hacerlo estaría muy agradecido

gracias por adelantado
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 08/06/2010 7:04 am
Título:

Si apenas esta empezando con C++ deberias dejar eso para despues, cuando ya domines el lenguaje.

Como hacerlo depende del SO que estes utilizando, en el caso de MS Windows puedes buscar ejemplos en sitios como MSDN y codeproject, un ejemplo de este ultimo es:

Screen Capture (Simple Win32 Dialog Based) by GauranG Shah

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 09/06/2010 6:18 am
Título:

Hola,
He copiado el código que publican en esta página:
[url]
http://cboard.cprogramming.com/windows-programming/93419-saving-static-controls-hdc-into-bitmap.html
[/url]
Y le he pasado como parámetro el manejador de ventana del escritorio. El resultado es:
Código:

#include <windows.h>

int SaveDCToBitmap(HWND hStatic, const char *pszFile);

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hdw;
    hdw = GetDesktopWindow();
    SaveDCToBitmap(hdw, "c:\\imagen.bmp");
    return 0;
}
/////////////////////////////////////////////////////
/*
La siguiente función está copiada de:
http://cboard.cprogramming.com/windows-programming/93419-saving-static-controls-hdc-into-bitmap.html
*/
//////////////////////////////////////////////////
int SaveDCToBitmap(HWND hStatic, const char *pszFile) {
   BITMAPFILEHEADER bmfh = {0};
    BITMAPINFOHEADER bmih = {0};
   RECT rc = {0};
   HDC hdc1;
   HDC hdc2;
    HBITMAP aBmp;
    BITMAPINFO bi;
    HGDIOBJ OldObj;
    void *dibvalues;
    HANDLE fileHandle;
    DWORD bytes_write;
    DWORD bytes_written;
   int w;
   int h;

   hdc1 = GetWindowDC(hStatic);
   hdc2 = CreateCompatibleDC(hdc1);
   GetWindowRect(hStatic, &rc);
   w = rc.right-rc.left;
   h = rc.bottom-rc.top;

   bmih.biSize = sizeof(BITMAPINFOHEADER);
   bmih.biWidth = w;
   bmih.biHeight = h;
   bmih.biPlanes = 1;
   bmih.biBitCount = 24;
   bmih.biCompression = BI_RGB;
   bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
   bi.bmiHeader = bmih;

   aBmp = CreateDIBSection(hdc1, &bi ,DIB_RGB_COLORS, (void**)&dibvalues, NULL, NULL);
   OldObj = SelectObject(hdc2, aBmp);
   BitBlt(hdc2, 0, 0, w, h, hdc1, 0, 0, SRCCOPY);
   bmfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
   bmfh.bfSize = (3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
   bmfh.bfType = 0x4d42;

   fileHandle = CreateFile(pszFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   bytes_write = sizeof(BITMAPFILEHEADER);
   WriteFile(fileHandle, &bmfh, bytes_write, &bytes_written, NULL);
   bytes_write = sizeof(BITMAPINFOHEADER);
   WriteFile(fileHandle, &bmih, bytes_write, &bytes_written, NULL);
   bytes_write = bmih.biSizeImage;
   WriteFile(fileHandle, (void*)dibvalues, bytes_write, &bytes_written, NULL);

   CloseHandle(fileHandle);
    DeleteObject(SelectObject(hdc2,OldObj));
    DeleteDC(hdc2);
   ReleaseDC(hStatic, hdc1);
   return 0;
}

El resultado está realmente bien.

Espero que sea de utilidad a alguien. A mí me ha gustado bastante.
Volver arriba
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 10/06/2010 9:42 am
Título:

muchas gracias a los dos, pero no dije que utilizaba dev-c++ y los códigos que me dieron generan errores al ser compilados... si pudiesen decirme como "traducirlo" para que lo compile bien sería estupendo

muchas gracias otra vez
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 10/06/2010 11:23 am
Título:

Hola otra vez,
Devc++ es un proyecto muerto, pero por qué no descargas wxDev-C++. Te va a sorprender. Es un devc++ ampliado y mejorado. Crea un proyecto windows y cambia el código por el del ejemplo. Te lanzará un warning, pero compila. Ejecútalo y abre el archivo c:\imagen.bmp (En el directorio raíz de la unidad c).
Acabo de compilarlo desde él.
Otra alternativa si no deseas devc++ pero te gusta usar entornos de trabajo libres es codeblocks.
wxDev-C++:
http://wxdsgn.sourceforge.net/
Codeblocks:
http://www.codeblocks.org/

Espero que sea de utilidad.
Volver arriba
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 11/06/2010 6:43 am
Título:

si. ese es el compilador que tengo. wxdev-c++. pero me da errores y no hace nada...
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 11/06/2010 7:41 am
Título:

Hola otra vez,
He modificado la única línea que me generaba una alerta en mi wxdevcpp.
Ahora el código queda como:
Código:

#include <windows.h>

int SaveDCToBitmap(HWND hStatic, const char *pszFile);

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hdw;
    hdw = GetDesktopWindow();
    SaveDCToBitmap(hdw, "c:\\imagen.bmp");
    MessageBox(NULL, "La imagen ha sido guardada en\r\nC:\\imagen.bmp", "Atención", MB_OK);
    return 0;
}
/////////////////////////////////////////////////////
/*
La siguiente función está copiada de:
http://cboard.cprogramming.com/windows-programming/93419-saving-static-controls-hdc-into-bitmap.html
*/
//////////////////////////////////////////////////
int SaveDCToBitmap(HWND hStatic, const char *pszFile) {
   BITMAPFILEHEADER bmfh = {0};
    BITMAPINFOHEADER bmih = {0};
   RECT rc = {0};
   HDC hdc1;
   HDC hdc2;
    HBITMAP aBmp;
    BITMAPINFO bi;
    HGDIOBJ OldObj;
    void *dibvalues;
    HANDLE fileHandle;
    DWORD bytes_write;
    DWORD bytes_written;
   int w;
   int h;

   hdc1 = GetWindowDC(hStatic);
   hdc2 = CreateCompatibleDC(hdc1);
   GetWindowRect(hStatic, &rc);
   w = rc.right-rc.left;
   h = rc.bottom-rc.top;

   bmih.biSize = sizeof(BITMAPINFOHEADER);
   bmih.biWidth = w;
   bmih.biHeight = h;
   bmih.biPlanes = 1;
   bmih.biBitCount = 24;
   bmih.biCompression = BI_RGB;
   bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
   bi.bmiHeader = bmih;

//   aBmp = CreateDIBSection(hdc1, &bi ,DIB_RGB_COLORS, (void**)&dibvalues, NULL, NULL);
// He modificado esta línea para que no haya ni una alerta.
      aBmp = CreateDIBSection(hdc1, &bi ,DIB_RGB_COLORS, (void**)&dibvalues, NULL, 0);
   
   OldObj = SelectObject(hdc2, aBmp);
   BitBlt(hdc2, 0, 0, w, h, hdc1, 0, 0, SRCCOPY);
   bmfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
   bmfh.bfSize = (3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
   bmfh.bfType = 0x4d42;

   fileHandle = CreateFile(pszFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   bytes_write = sizeof(BITMAPFILEHEADER);
   WriteFile(fileHandle, &bmfh, bytes_write, &bytes_written, NULL);
   bytes_write = sizeof(BITMAPINFOHEADER);
   WriteFile(fileHandle, &bmih, bytes_write, &bytes_written, NULL);
   bytes_write = bmih.biSizeImage;
   WriteFile(fileHandle, (void*)dibvalues, bytes_write, &bytes_written, NULL);

   CloseHandle(fileHandle);
    DeleteObject(SelectObject(hdc2,OldObj));
    DeleteDC(hdc2);
   ReleaseDC(hStatic, hdc1);
   return 0;
}

Si en tu ordenador no compila, puedes poner en tu mensaje qué errores te da.

Espero que te sea útil.
Volver arriba
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 12/06/2010 1:44 am
Título:

me de 7 errores pero no se como verlos. debo parecer bastante tonto, pero es que le doy a ver>mostrar paneles y estan todos seleccionados como que los estoy viendo. pero en la pantalla no aparecen ninguno. pruebo a quitarlos y seleccionarlos otra vez, pero no hay ningun cambio. ya no se que hacer para ver lo que está pasando...

muchas gracias por tu paciencia
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 12/06/2010 2:59 am
Título:

Hola otra vez,
He subido el ejecutable a mi página web. Para descargarlo, haz clic en el siguiente enlace:
http://www.jose.hostse.com/Proyecto1.zip
Está sólo el ejecutable. El código es el que hay en los mensajes anteriores. Ten paciencia si no se descarga a la primera. El servidor está muy ocupado a veces.
Te aconsejo que aprendas a manejar bien tu compilador y primero empieza con algún curso de C y cuando te sientas cómodo te inicies en la programación windows, linux o la que te apetezca. No empieces la casa por el tejado.

Espero que te sea útil.
Volver arriba
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 12/06/2010 3:47 am
Título:

muchas gracias por todo. Te agradeceria que me ayudaras, por último, diciéndome porque no aparecen los paneles. antes me aparecían todos y no se porque ahora no están y he estado metiéndome por todas partes para volver a ponerlos, incluso he desinstalado el compilador y he vuelto a instalarlo de nuevo, pero nada. los paneles han desaparecido.
a y el ejecutable funciona perféctamente
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 12/06/2010 4:33 am
Título:

Hola,
Simplemente hay que ir al menú "Ver" deplegar el submenú "Mostrar paneles" e ir seleccionándolos uno a uno.

Espero que te sea útil.
Volver arriba
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 12/06/2010 5:43 am
Título:

lo he desinstalado y vuelto a instalar y vuelven a salir los paneles. da 7 errores que son los siguientes:
[Linker Error] undefined reference to `CreateCompatibleDC@4'
[Linker Error] undefined reference to `CreateDIBSection@24'
[Linker Error] undefined reference to `SelectObject@8'
[Linker Error] undefined reference to `BitBlt@36'
[Linker Error] undefined reference to `SelectObject@8'
[Linker Error] undefined reference to `DeleteObject@4'
[Linker Error] undefined reference to `DeleteDC@4'

puede ser porque tengo que meter alguna librería que no tengo?
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 12/06/2010 11:34 am
Título:

Hola otra vez,
Los errores que te da tu entorno son originados por el enlazador (linker). En ellos te dice que el código llama a unas funciones que no están presentes en los archivos que le has pasado.
La solución es muy simple: añadirle los archivos que necesita. Para ello has de activar el menú "Proyecto" y activar "Opciones de proyecto". Activa la pestaña "Opciones adicionales en la línea de comandos" y clica en el botón "Añadir biblioteca u objeto". En el diálogo has de navegar hasta el directorio que contiene las librerías que vienen con el compilador. En mi caso:
c:\Archivos de programa\dev-cpp\lib\
Buscas el archivo libgdi32.a y haces doble clic en él. Hecho esto, lo verás aparecer en la lista que hay debajo de la palabra "linker".
Esta librería tiene código para llamar a la dll gdi32.dll cuyas 3 letras significan Interfaz de Dispositivo Gráfico que está en el directorio windows (o en uno contenido en él).
Ahora puedes construir tu proyecto con toda tranquilidad. Si te falta alguna otra librería me lo vuelves a comentar y te digo su nombre.

Espero que te sea útil.
Volver arriba
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 12/06/2010 12:12 pm
Título:

perfecto! muchisimas gracias por tu ayuda y por tu paciencia. esto funciona estupendamente. gracias otra vez y un saludo
Volver arriba
pABL012



Registrado: 08 Jun 2010
Mensajes: 21

MensajePublicado: 14/06/2010 9:19 am
Título:

ola otra vez. el otro dia me puse a manejar el programa y me he dado cuenta de que no puedo hacer lo que quería en un primer momento, que es guardar la imagen en un array de la forma img(3,x,y) donde 1, 2, 3 serían los canales de color rojo, verde o azul respectivemente, y x e y darían la posición que cada pixel toma en la pantalla, teniéndose que por ejemplo un pixel de color blanco de posición 1,1 tendria los valores img(1,1,1)=img(2,1,1)=img(3,1,1)=255. ¿se puede hacer algo con la función que hay hecha para hacer lo que digo?
Volver arriba
      Índice del Foro elrincondelc.com -> Gráficos
Página 1 de 2Todas las horas están en GMT - 8 Horas
Ir a página 1, 2  Siguiente

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com