elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 03:03  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  ScreenShot (Codigo Fuente)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ScreenShot (Codigo Fuente)  (Leído 2,412 veces)
EvilGoblin


Desconectado Desconectado

Mensajes: 2.320


YO NO LA VOTE!


Ver Perfil
ScreenShot (Codigo Fuente)
« en: 18 Junio 2007, 20:07 »

Varias veces se inicio este tema y eh visto que pocas veces se logro llegar a un resultado que valga la pena ^^

asi que dejo uno que ami me sirvio =P

captura.h
Código:
PBITMAPINFO CreateBitmapInfoStructure(HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;

//obtiene la altura, anchura, y profundidad del color de la imagen
if(!GetObject(hBmp,sizeof(BITMAP),(LPSTR)&bmp))return NULL;

cClrBits = 24;

/*
reserva la memoria para la estructura PBITMAPINFO, que contendrá la informacion
de la cabecera
*/
if(cClrBits!=24)
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<cClrBits));
else
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));

//inicializa la estructura
pbmi->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = 24;

if(cClrBits<24)pbmi->bmiHeader.biClrUsed=(1<<cClrBits);

pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage=(pbmi->bmiHeader.biWidth+7)/8*pbmi->bmiHeader.biHeight*cClrBits;
pbmi->bmiHeader.biClrImportant = 0;

return pbmi;
}

HRESULT SaveBitmap(char strFileName[128],PBITMAPINFO pbi,HBITMAP hBMP,HDC hDC)
{
HRESULT hr = E_FAIL;
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memorypointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp; // temp-variable


if(pbi==NULL)return E_FAIL;

pbih=(PBITMAPINFOHEADER)pbi;
lpBits=(LPBYTE)GlobalAlloc(GMEM_FIXED,pbih->biSizeImage);

if(!lpBits)return E_FAIL;

if(!GetDIBits(hDC,hBMP,0,(WORD)pbih->biHeight,lpBits,pbi,DIB_RGB_COLORS))return E_FAIL;

//crea el .bmp
hf=CreateFile(strFileName,GENERIC_READ|GENERIC_WRITE,(DWORD)0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);

if(hf==INVALID_HANDLE_VALUE)return E_FAIL;

hdr.bfType = 0x4D42; // 0x42 = "B", 0x4D = "M"


hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD)+pbih->biSizeImage);
hdr.bfReserved1=0;
hdr.bfReserved2=0;

hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD);


if(!WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),(LPDWORD)&dwTmp,NULL))return E_FAIL;

if(!WriteFile(hf,(LPVOID)pbih,sizeof(BITMAPINFOHEADER)+pbih->biClrUsed*sizeof(RGBQUAD),(LPDWORD)&dwTmp,(NULL)))return E_FAIL;


dwTotal=cb=pbih->biSizeImage;
hp=lpBits;

if(!WriteFile(hf,(LPSTR)hp,(int)cb,(LPDWORD)&dwTmp,NULL))return E_FAIL;
if(!CloseHandle(hf))return E_FAIL;

GlobalFree((HGLOBAL)lpBits);

return S_OK;
}

/*
uso: CapturaPantalla(posicion_inicial_x,posicion_inicial_y,posicion_final_x,posicion_final_y);
*/

void CapturaPantalla(unsigned int Ax,unsigned int Ay,unsigned int Bx,unsigned int By,char *Ruta)
{
BYTE *mem;
int bpp,c;
    HWND HwndSrc;
    HDC HdcSrc;
    HDC HdcMemory;
    HDC HdcStrech;
    HBITMAP Hbmp;
    HBITMAP HbmpStrech;
    HBITMAP HbmpPrev;
    HBITMAP HbmpPrevStrech;
    HBITMAP BmpPrueba;

HwndSrc=GetDesktopWindow();                               //almacena el manejador del escritorio
    HdcSrc=GetWindowDC(HwndSrc);                               //se obtiene el DC del escritorio
HdcMemory=CreateCompatibleDC(HdcSrc);                      //se crea una copia del DC del escritorio
HdcStrech=CreateCompatibleDC(HdcSrc);                   //Cd que almacenara la imagen pequeña
Hbmp=CreateCompatibleBitmap(HdcSrc,1024,768);          //se cra un bitmap del DC del escritorio
HbmpStrech=CreateCompatibleBitmap(HdcSrc,Bx-Ax,By-Ay);  //bitmap que almacenara el Strech
HbmpPrev=(HBITMAP)SelectObject(HdcMemory,Hbmp);        //se asocia el bitmap con el DC
HbmpPrevStrech=(HBITMAP)SelectObject(HdcStrech,HbmpStrech);

BitBlt(HdcMemory,0,0,800,600,HdcSrc,Ax,Ay,SRCCOPY);
    StretchBlt(HdcStrech,0,0,800,600,HdcMemory,0,0,800,600,SRCCOPY);
    HbmpStrech=(HBITMAP)SelectObject(HdcStrech,HbmpPrevStrech);
    Hbmp=(HBITMAP)SelectObject(HdcMemory,HbmpPrev);

bpp=800*600*8;

c=GetBitmapBits(HbmpStrech,0,0);
mem=(BYTE*)malloc((c-1)*sizeof(BYTE*));
memset(mem,0,sizeof(mem));

    GetBitmapBits(HbmpStrech,c,mem);
BmpPrueba = CreateCompatibleBitmap(HdcSrc,Bx-Ax,By-Ay);
SetBitmapBits(BmpPrueba,c,mem);
SaveBitmap(Ruta,CreateBitmapInfoStructure(BmpPrueba),BmpPrueba,HdcSrc);

    DeleteDC(HdcSrc);
    DeleteDC(HdcMemory);
    DeleteDC(HdcStrech);
    DeleteObject(Hbmp);
    DeleteObject(HbmpPrev);
    DeleteObject(HbmpStrech);
    DeleteObject(HbmpPrevStrech);

return;
}


main.cpp
Código:
#include <windows.h>
#include <iostream>
#include "captura.h"

using namespace std;

int main(int argc, char *argv[])
{
    char name[15];
    for(int i=0;i<10;i++)
    {
            name[0]='\0';
            strcat(name,"D:\\");
            char n[2];
            n[0]='\0';
            sprintf(n,"%i",i);
            strcat(name,n);
            strcat(name,".jpg");
    CapturaPantalla(0,0,800,600,name);
 Sleep(1000);
}
    system("PAUSE");
    return EXIT_SUCCESS;
}



El codigo no es mio, pero no me acuerdo de donde lo baje =$

^^ y es configurable para la region a capturar

en este ejemplo va creando una imagen cada segundo y la guarda en el disco D: con el nombre 1,2,3,4....

Espero que les sirva! =)


si alguien conoce la forma de bajarle los pixeles para que un archivo no ocupe 3mgs =P que postee la solucion aqui xD


En línea

Experimental Serial Lain [Linux User]
anion

Desconectado Desconectado

Mensajes: 137


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #1 en: 18 Junio 2007, 22:21 »

como haces para que haga capturas full screen?, o como seleccion que region del escritorio quiero capturar?

Los screen que me generan no pesan 3MB como decis, al menos a mi no, a mi me los genera de 1.25MB.


« Última modificación: 18 Junio 2007, 22:23 por anion » En línea
EvilGoblin


Desconectado Desconectado

Mensajes: 2.320


YO NO LA VOTE!


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #2 en: 18 Junio 2007, 22:39 »

en la funcion CapturaPantalla(0,0,800,600,name);
el primer valor es el valor inicial de X el segundo el de Y
el tercero es hasta donde de X y el cuarto hasta donde de Y

0/0                               800
....................................
.
.
.
.
.
.
.
600
=P
se entiende =$?

jejeje
En línea

Experimental Serial Lain [Linux User]
anion

Desconectado Desconectado

Mensajes: 137


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #3 en: 18 Junio 2007, 23:12 »

lo hago como decis.
    CapturaPantalla(0,0,1024,768,name);

pero me aparece una region bien capturada, pero despues una parte en negro.
En línea
EvilGoblin


Desconectado Desconectado

Mensajes: 2.320


YO NO LA VOTE!


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #4 en: 19 Junio 2007, 13:23 »

porque tu resolucion debe ser 800x600 y al capturar de mas lo demas se llena con negro =P
En línea

Experimental Serial Lain [Linux User]
~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.983


Ver Perfil WWW
Re: ScreenShot (Codigo Fuente)
« Respuesta #5 en: 19 Junio 2007, 14:13 »

Muchas gracias por el source  ;)
En línea
Pseudoroot


Desconectado Desconectado

Mensajes: 839



Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #6 en: 19 Junio 2007, 17:23 »

Interesante hilo. si de todas maneras...

aunque mucho codigo para algo. no muy significativo, pero en fin.. asi es C++ xD..
En línea

De@th (L1zb3th)
TROLL


Desconectado Desconectado

Mensajes: 619

<-[Rin]->


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #7 en: 19 Junio 2007, 19:24 »

si es significativo, ahora chusmeo para comprimir en jpg por que tmb lo necesito para mi proyecto xDDDDDDDDDDD
en fin =P
Au Revoir !
En línea
EvilGoblin


Desconectado Desconectado

Mensajes: 2.320


YO NO LA VOTE!


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #8 en: 19 Junio 2007, 20:16 »

En cppfrance encontre esto, voy a revisarlo pero hasta que no llege a mi casa no podre probarlo

http://www.cppfrance.com/codes/CONVERSION-BMP-JPEG-AVEC-LIBRAIRIE-CXIMAGE_22754.aspx

*^^
En línea

Experimental Serial Lain [Linux User]
Rozor

Desconectado Desconectado

Mensajes: 269


As I Walk Through The Valley Of The Shadow Of Dead


Ver Perfil WWW
Re: ScreenShot (Codigo Fuente)
« Respuesta #9 en: 23 Junio 2007, 12:22 »

Ya no hay problema con la resolucion aqui hos dejo un codigo que devuelve la resolucion

Código:
#include <stdio.h>
#include <wingdi.h>

#pragma comment(lib, "gdi32.lib")

int main()
{

DEVMODE modograf;

EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &modograf);

printf("Resolucion:  %d x %d", modograf.dmPelsWidth, modograf.dmPelsHeight);
return 0;

}
En línea

out in the streets they call it murder....
EvilGoblin


Desconectado Desconectado

Mensajes: 2.320


YO NO LA VOTE!


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #10 en: 24 Junio 2007, 23:13 »

Ok.. te doy las gracias.! =P..

luego lo pruebo! ^^
En línea

Experimental Serial Lain [Linux User]
<[(x)]>

Desconectado Desconectado

Mensajes: 214



Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #11 en: 14 Diciembre 2008, 23:38 »

porque tu resolucion debe ser 800x600 y al capturar de mas lo demas se llena con negro =P

espero no sea muy tarde jej.

bue aka esta el problema de que no ajuste  a la resolucion:

en la libreria  las bariables no modifican todos los valores, aka se los dejo areglado.

Código:
void CapturaPantalla(unsigned int Ax,unsigned int Ay,unsigned int Bx,unsigned int By,char *Ruta)
{
BYTE *mem;
int bpp,c;
    HWND HwndSrc;
    HDC HdcSrc;
    HDC HdcMemory;
    HDC HdcStrech;
    HBITMAP Hbmp;
    HBITMAP HbmpStrech;
    HBITMAP HbmpPrev;
    HBITMAP HbmpPrevStrech;
    HBITMAP BmpPrueba;

HwndSrc=GetDesktopWindow();                               //almacena el manejador del escritorio

    HdcSrc=GetWindowDC(HwndSrc);                               //se obtiene el DC del escritorio

HdcMemory=CreateCompatibleDC(HdcSrc);                      //se crea una copia del DC del escritorio

HdcStrech=CreateCompatibleDC(HdcSrc);                   //Cd que almacenara la imagen pequeña

Hbmp=CreateCompatibleBitmap(HdcSrc,Bx,By);          //se cra un bitmap del DC del escritorio

HbmpStrech=CreateCompatibleBitmap(HdcSrc,Bx-Ax,By-Ay);  //bitmap que almacenara el Strech

HbmpPrev=(HBITMAP)SelectObject(HdcMemory,Hbmp);        //se asocia el bitmap con el DC



HbmpPrevStrech=(HBITMAP)SelectObject(HdcStrech,HbmpStrech);

BitBlt(HdcMemory,Ax,Ay,Bx,By,HdcSrc,Ax,Ay,SRCCOPY);
   
StretchBlt(HdcStrech,Ax,Ay,Bx,By,HdcMemory,Ax,Ay,Bx,By,SRCCOPY);
   
HbmpStrech=(HBITMAP)SelectObject(HdcStrech,HbmpPrevStrech);
   
Hbmp=(HBITMAP)SelectObject(HdcMemory,HbmpPrev);


bpp=Bx*By*8;

c=GetBitmapBits(HbmpStrech,0,0);
mem=(BYTE*)malloc((c-1)*sizeof(BYTE*));
memset(mem,0,sizeof(mem));

    GetBitmapBits(HbmpStrech,c,mem);
BmpPrueba = CreateCompatibleBitmap(HdcSrc,Bx-Ax,By-Ay);
SetBitmapBits(BmpPrueba,c,mem);
SaveBitmap(Ruta,CreateBitmapInfoStructure(BmpPrueba),BmpPrueba,HdcSrc);

    DeleteDC(HdcSrc);
    DeleteDC(HdcMemory);
    DeleteDC(HdcStrech);
    DeleteObject(Hbmp);
    DeleteObject(HbmpPrev);
    DeleteObject(HbmpStrech);
    DeleteObject(HbmpPrevStrech);

return;
}



En línea

<[(x)]>
Erik#


Desconectado Desconectado

Mensajes: 1.138


Pertenezco a Reach


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #12 en: 15 Diciembre 2008, 13:54 »

Ahora que pienso, tambien podeis hacer esto, si quereis una full screen y no tener que cambiar el código.

Código
int x = GetSystemMetrics(SM_CXSCREEN);
int y = GetSystemMetrics(SM_CYSCREEN);
CapturaPantalla(0,0,x,y,name);

Es una opción, probarlo ;).
En línea
Erik#


Desconectado Desconectado

Mensajes: 1.138


Pertenezco a Reach


Ver Perfil
Re: ScreenShot (Codigo Fuente)
« Respuesta #13 en: 15 Diciembre 2008, 13:57 »

Sorry por doble post, pero, lo que he pensao esque en vez de fotos por segundo, podemos hacer fotos clickando a un boton.

#include <windows.h>
#include <iostream>
#include "captura.h"

using namespace std;

int main(int argc, char *argv[])
{
    char name[15];
    if(!GetAsyncKeyState(VK_F6)){
    {
            name[0]='\0';
            strcat(name,"D:\\");
            char n[2];
            n[0]='\0';
            sprintf(n,"%i",i);
            strcat(name,n);
            strcat(name,".jpg");
    CapturaPantalla(0,0,800,600,name);
 Sleep(1000);
}
    system("PAUSE");
    return EXIT_SUCCESS;
}
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines