elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Píldoras formativas en seguridad de la información


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Capturar pantalla en jpg [DevC++] [SOLUCIONADO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Capturar pantalla en jpg [DevC++] [SOLUCIONADO]  (Leído 15,470 veces)
sulrun

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Capturar pantalla en jpg [DevC++] [SOLUCIONADO]
« en: 14 Abril 2007, 03:59 »

Les comento,quiero hacer un programa que tome una captura y luego la guarde en un fichero jpg, el problema es que no encuentro documentacion ni ejemplos para hacerlo en devc++.
Lo unico que he encontrado ha sido en delphi y entiendo lo que hace el codigo pero al parecer me faltan librerias si quiero hacerlo en C.
Cualquier aporte sera bien recibido.Saludos.


« Última modificación: 14 Abril 2007, 16:26 por sulrun » En línea

~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.982


Ver Perfil WWW
Re: Capturar pantalla en jpg [DevC++]
« Respuesta #1 en: 14 Abril 2007, 12:09 »

Pues para capturar la pantala puedes usar la tecla imp pantalla desde C:
Código:
#include <windows.h>

void main (void)
{
keybd_event(44,0,0,0);
}

De esta manera guardarias la foto en el portapaeles. Ahora tendrias q obtenerla del mismo, pero en eso no puedo ayudarte... pregunte como hacerlo en el foro hace ya algn tiempo y no saké nada en claro, mira esta es la info q obtube:

http://foro.elhacker.net/index.php/topic,159731.msg755526.html#msg755526

Y para pasar la imagen a jpg:

http://foro.elhacker.net/index.php/topic,158957.0.html

Lee el post entero, q viene explicado por ahí..


Si consigues sacar la foto del portapapeles explica como please ;)
1S4ludo





En línea

sulrun

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Capturar pantalla en jpg [DevC++]
« Respuesta #2 en: 14 Abril 2007, 12:51 »

Bien! ya he conseguido que me guarde una screen en formato bmp ahora toca mirar lo de pasarlo a jpg, la idea de utilizar una dll no me agrada pero si no hay otra opcion.
El metodo que he utilizado lo he sacado de esta pagina :
http://www.1perlscriptstreet.com/vb/scripts/ShowCode.asp?txtCodeId=10754&lngWId=3
Hay que enlazar la libreria libgdi32.a

Saludos, ya contare mis avances ;)
« Última modificación: 14 Abril 2007, 13:04 por sulrun » En línea

~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.982


Ver Perfil WWW
Re: Capturar pantalla en jpg [DevC++]
« Respuesta #3 en: 14 Abril 2007, 13:13 »

Hey gracias! ahora voy a provar ese code a ver si me sale. Si lo consigo pasar jpg posteo el code entero ;)
En línea

sulrun

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Capturar pantalla en jpg [DevC++]
« Respuesta #4 en: 14 Abril 2007, 13:40 »

He probado lo de pasar a jpg con la dll y funciona pero sigo pensando que no es la mejor idea.
Aqui el code entero:
Código:
#include <iostream.h>
#include <windows.h>
#include <stdio.h>
#include <freeimage.h>

bool TakeScreenShot(char* filename);
void convert();

int main()


    {
    if(TakeScreenShot("Screenshot.bmp"))
           convert();
        return 0;
}

//
// Side Effects:N/A
//
//This code is copyrighted and has// limited warranties.Please see http://
//     www.1PerlScriptStreet.com/vb/scripts/Sho
//     wCode.asp?txtCodeId=10754&lngWId=3//for details.//**************************************
//     

bool TakeScreenShot(char* filename)


    {
    keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
    keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    HBITMAP h;
   
    OpenClipboard(NULL);
    h = (HBITMAP)GetClipboardData(CF_BITMAP);
    CloseClipboard();
    HDC hdc=NULL;
    FILE*fp=NULL;
    LPVOID pBuf=NULL;
    BITMAPINFO bmpInfo;
    BITMAPFILEHEADER bmpFileHeader;
    do
    {
    hdc=GetDC(NULL);
    ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
    bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS);
    if(bmpInfo.bmiHeader.biSizeImage<=0)
    bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
    if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL)


        {
        MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
        break;
        }
        bmpInfo.bmiHeader.biCompression=BI_RGB;
        GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);
        if((fp = fopen(filename,"wb"))==NULL)


            {
            MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
            break;
        }

        bmpFileHeader.bfReserved1=0;
        bmpFileHeader.bfReserved2=0;
        bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
        bmpFileHeader.bfType='MB';
        bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
        fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
        fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp);
        }
       
        while(false);
        if(hdc)ReleaseDC(NULL,hdc);
        if(pBuf) free(pBuf);
        if(fp)fclose(fp);
   
    return true;
}

void convert()
{
    FIBITMAP * Image, * Image2;
    FreeImage_Initialise(false);
   
   
    Image = FreeImage_Load(FIF_BMP, "Screenshot.bmp", 0);
Image2 = FreeImage_ConvertTo24Bits(Image);
FreeImage_Save(FIF_JPEG, Image2, "Image.jpg", JPEG_QUALITYGOOD);
FreeImage_Unload(Image);
FreeImage_Unload(Image2);
FreeImage_DeInitialise();

}


Pero ahora estoy mirando este ejemplo :

http://www.cppfrance.com/code.aspx?ID=28263

Que no necesita dll , y estoy intentando adaptarlo para hacerlo funcionar.

« Última modificación: 14 Abril 2007, 13:44 por sulrun » En línea

sulrun

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Capturar pantalla en jpg [DevC++]
« Respuesta #5 en: 14 Abril 2007, 14:42 »

Nada no lo consigo, tengo el siguiente codigo:

Código:
#include <windows.h>
#include <stdlib.h>
#include "bmp2jpg.c"


int main()
{
  char szBuf[260];
  HBITMAP hBitmap;


  hBitmap = (HBITMAP)LoadImage(0, "Screenshot.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE );


  return (int)Bitmap2JPG(hBitmap,"clip.jpg", 100);
}


y me salen los errores :

Código:

undefined reference to `jpeg_std_error(jpeg_error_mgr*)'
undefined reference to `jpeg_CreateCompress(jpeg_compress_struct*, int, unsigned int)'
undefined reference to `jpeg_set_defaults(jpeg_compress_struct*)'
undefined reference to `jpeg_set_quality(jpeg_compress_struct*, int, unsigned char)'
undefined reference to `jpeg_start_compress(jpeg_compress_struct*, unsigned char)'
undefined reference to `jpeg_write_scanlines(jpeg_compress_struct*, unsigned char**, unsigned int)'
undefined reference to `jpeg_finish_compress(jpeg_compress_struct*)'
undefined reference to `jpeg_destroy_compress(jpeg_compress_struct*)'

Tengo bien enlazada la libreria y todo.Aqui parece que pasa lo mismo :
http://ecos.sourceware.org/ml/cygwin/2001-09/msg01235.html

Y habla de solucionarlo con 'extern "C"' pero no llego a tanto.


UPDATE:
Compilando el mismo codigo como proyecto C si que funciona.Alguien sabe como podria incluirlo en un proyecto C++?
« Última modificación: 14 Abril 2007, 15:45 por sulrun » En línea

sulrun

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Capturar pantalla en jpg [DevC++]
« Respuesta #6 en: 14 Abril 2007, 16:23 »

Bien Por fin lo consegui!! ;D ;D

Código:
#include <windows.h>
#include <stdlib.h>
#include "bitmap2jpg.c"




int main()
{
  char szBuf[260];
  HBITMAP hBitmap;


  hBitmap = (HBITMAP)LoadImage(0, "Screenshot.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE );


  return (int)Bitmap2JPG(hBitmap,"clip.jpg", 100);
}

Para que funcione hay que añadir en el archivo bitmap2jpg.c en lugar de " #include "jpeg\jpeglib.h" "

Código:
extern "C" {
#include "jpeg\jpeglib.h"
}

Y linkar las librerias:  libgdi32.a y libjpeg.a
Peso final del archivo 68,4 kb y sin dll !!
Aqui se queda el post para quien lo necesite.Y los archivos necesarios:
http://rapidshare.com/files/25975032/jpeg.rar.html

Código:
jpeglib.h
jconfig.h
jerror.h
jmorecfg.h
libjpeg.a
bitmap2jpg.c (Con modificacion incluida)

UPDATE: Al parecer no funciona, sale error en el archivo bitmap2jpg.c  invalid conversion from `void*' to `HBITMAP__*'   si se comentas esas lineas compila pero al crear el jpg lo crea en negro. AYUDAA!


UPDATE2: AHORA SIIII!!!  Solucionado poniendo (HBITMAP)::SelectObject
Las lineas que daban error quedan:
Código:
hbmOld1 = (HBITMAP)::SelectObject(hdcMem1, hBitmap);
hbmOld2 = (HBITMAP)::SelectObject(hdcMem2, hbmMem);
RESUBIDOS LOS ARCHIVOS.
« Última modificación: 14 Abril 2007, 17:02 por sulrun » En línea

~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.982


Ver Perfil WWW
Re: Capturar pantalla en jpg [DevC++] [SOLUCIONADO]
« Respuesta #7 en: 14 Abril 2007, 20:02 »

Gracias  ;D voy a ver si consigo hacerlo funcionar con el VC++, por q me da como 30 errores de compilacion  :xD :xD :xD
En línea

sulrun

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Capturar pantalla en jpg [DevC++] [SOLUCIONADO]
« Respuesta #8 en: 14 Abril 2007, 20:24 »

Otro codigo que he encontrado para sacar screens sin necesidad del portapapeles.

Código:
/*
CAPTURA PANTALLA
Programado por XpyXt
web: http://xpyxt.no-ip.com
mail: xpyxt@xpyxt.no-ip.org


Licencia de implementacion: publico este source bajo GPL, es decir, si tu
usas este codigo fuente en algun programa deberas publicar su source. Como
me entere de que lo has usado y no has publicado el codigo fuente voy a tu
casa y te amputo las manos. ¿Entendido?

Explicacion y modo de uso: Este source nos captura la pantalla del windows,
Hay 3 arrays de datos, 2 cabeceras del BMP y el RAW del bmp.


array CBA1 &bfh, Tamaño de la CBA1 sizeof(bfh)
array CBA2 &bmi.bmiHeader, Tamaño de la CBA2 sizeof(BITMAPINFOHEADER)
array (char *)pbBits, Tamaño del RAW bmi.bmiHeader.biSizeImage



*/

//#define WINVER 0x501
//#define WINVER 0x400

#include <windows.h>
#include <stdio.h>
#include <wingdi.h>




void cap();
int main()
{
cap();
return 0;
}


void cap()
{

BITMAPINFO bmi;
BITMAPFILEHEADER bfh;


int nWidth;
int nHeight;

HWND hWnd;
HDC hdc ;
HDC memDC;
HBITMAP hbm ;
HBITMAP hbmOld;
BYTE *pbBits;


HANDLE hfile;
DWORD dwWritten;

nWidth = GetSystemMetrics(SM_CXSCREEN);
nHeight = GetSystemMetrics(SM_CYSCREEN);

hWnd = GetDesktopWindow();
hdc = GetDC(hWnd);
memDC = CreateCompatibleDC(hdc);
hbm = CreateCompatibleBitmap(hdc, nWidth, nHeight);
hbmOld = (HBITMAP)SelectObject(memDC, hbm);

BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY);



ZeroMemory(&bmi, sizeof(bmi));

bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = nWidth;
bmi.bmiHeader.biHeight = nHeight;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 32 * nWidth * nHeight / 8;


pbBits = (byte *) malloc(bmi.bmiHeader.biSizeImage); ;



GetDIBits( memDC,
hbm,
0,
bmi.bmiHeader.biHeight,
pbBits,
&bmi,
DIB_RGB_COLORS );





bfh.bfType = ('M' << 8) + 'B';
bfh.bfSize = sizeof(BITMAPFILEHEADER) +
bmi.bmiHeader.biSizeImage +
sizeof(BITMAPINFOHEADER);
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);



//(char *)pbBits // string de datos imagen sin cabezeras



// por si lo quieres guadar en el fichero.
hfile = CreateFile( ("c:\\screenXXX.bmp"),
GENERIC_WRITE,
0,
0,
OPEN_ALWAYS,
0,
0 );



WriteFile(hfile,&bfh, sizeof(bfh), &dwWritten, NULL);
WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(hfile,pbBits, bmi.bmiHeader.biSizeImage, &dwWritten, NULL);


CloseHandle(hfile);


SelectObject(memDC, hbmOld);
DeleteDC(memDC);
ReleaseDC(hWnd,hdc);
DeleteObject(hbm);

free(pbBits);


}
En línea

~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.982


Ver Perfil WWW
Re: Capturar pantalla en jpg [DevC++] [SOLUCIONADO]
« Respuesta #9 en: 14 Abril 2007, 20:37 »

Muy weno, ese code si que me funciona, ahora seria pasar la imagen a jpg y solucionado. Voy a investigar sobre eso

Gracias ;)
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Capturar el Escritorio en Batch [Solucionado] « 1 2 »
Scripting
leogtz 12 8,779 Último mensaje 12 Mayo 2014, 21:54
por vakazul
[Solucionado] Capturar teclas en Android.
Java
ignorantev1.1 0 527 Último mensaje 12 Febrero 2014, 02:41
por ignorantev1.1
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines