¿como capturo la imagen de la pantalla?

Haz aquí tus consultas relacionadas con la programación gráfica.
Mensaje
Autor
Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#16 Mensaje por untio » 15/06/2010 12:01 pm

Hola otra vez,
el puntero dibvalues antes de la línea con "CreateFile" apunta a los tripletes de colores azul, verde y rojo (o algo así).

Espero que te sea útil.

pABL012
Mensajes: 21
Registrado: 08/06/2010 3:28 am

#17 Mensaje por pABL012 » 16/06/2010 5:14 am

voy a ver si puedo hacer algo. gracias :D

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#18 Mensaje por untio » 16/06/2010 6:32 am

Hola otra vez,
Te recuerdo que los tripletes son de la forma Azul, Verde y Rojo. Cada byte representa un valor del color entre 0 y 255.
Y otra cosa que deberías saber es que la línea:
bmih.biHeight = h;
Como h es positiva, hace que la primera línea de los tripletes sea, verdad que es curioso, la de abajo de la imagen. Sí, el primer triplete indica el punto izquierdo inferior, el segundo el segundo punto por la izquierda de la línea inferior. Y así completando líneas de abajo a arriba.
Como curiosidad, si se desea que los puntos empiecen en la fila de arriba:
bmih.biHeight = h;
bmih.biHeight debería de recibir un valor negativo exactamente igual a menos h.
No hagas el cambio a -h sin cambiar además todas las expresiones que dependen de la variable afectada.
El SDK de windows dice (naturalmente en inglés):

If biHeight is negative, indicating a top-down DIB, biCompression must be either BI_RGB or BI_BITFIELDS. Top-down DIBs cannot be compressed.

Espero que te sea útil.

pABL012
Mensajes: 21
Registrado: 08/06/2010 3:28 am

#19 Mensaje por pABL012 » 16/06/2010 9:34 am

muchas gracias, lo tendré en cuenta. hoy no puedo verlo porque mañana tengo un examen... quizás me ponga en una semana o así. y gracias de nuevo

pABL012
Mensajes: 21
Registrado: 08/06/2010 3:28 am

#20 Mensaje por pABL012 » 30/06/2010 10:38 am

Hola otra vez. Para poder entender mejor el programa e intentar hacer lo que quería me he leido un libro sobre programación en C: "El Lenguaje de Programación C" por Kernighan y Ritchie. También he estado investigando sobre la librería <windows.h>, y he obtenido la información siguiente:

Se tiene que BITMAPINFO es una estructura que a su vez contiene otras dos estructuras: BITMAPINFOHEADER la cual contiene información sobre la imagen tal como su tamaño y su formato; y la que a mi me interesa que es RGBQUAD la cual es un array de dimension 1 y que contiene las intensidades relativas de rojo, verde y azul.

Todo esto está explicado en el archivo win32.hlp que se puede descargar en:
http://allserv.ugent.be/~fschoonj/modul ... /win32.zip

ahora, la pregunta que no puedo responderme es la siguiente:
¿COMO PUEDO SABER, POR EJEMPLO, EL VALOR ENTRE 0 Y 255 DE AZUL QUE TOMA EL PIXEL SITUADO EN LAS COORDENADAS (13,27) DE LA PANTALLA, TOMANDOSE COMO (0,0) EL PIXEL SITUADO EN LA ESQUINA IFERIOR IZQUIERDA?

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#21 Mensaje por untio » 01/07/2010 1:05 am

Hola,
No es tan difícil. Para acceder al triplete del primer punto m de la fila n (empezando por abajo) sólo has de hacer:
Creas un puntero de tipo BYTE o unsigned char. Lo apuntas al primer triplete y (con aritmética de punteros) le sumas el valor: (n * ancho de la fila en puntos * 3) + (m * 3). Y, a partir de ahí, sólo es cuestión de leer valores con el operador *.
Pero te vuelvo a decir que aunque RGB significa Red, Green, Blue, en el SDK de windows explican que el triplete es azul, verde, rojo. Los de Microsoft también pueden equivocarse, pero tenlo en cuenta.
Y te vuelvo a aconsejar que ni el lenguaje C ni el api de windows se aprenden en una semana, ni en un mes, ni en un año. Tómatelo con calma.

Espero que te sea útil.

pABL012
Mensajes: 21
Registrado: 08/06/2010 3:28 am

#22 Mensaje por pABL012 » 01/07/2010 7:32 am

he escrito en el código que me diste lo siguiente:

Código: Seleccionar todo

   BYTE *ch[3];
   int img[3][h][w];
   
   ch[1]=&bi.bmiColors[1].rgbRed;
   ch[2]=&bi.bmiColors[1].rgbGreen;
   ch[3]=&bi.bmiColors[1].rgbBlue;
   
   for(int f=0, c=0; f<h; c++){
           int s=(f*w*3) + (c*3);
           for(int i=0; i<3; i++)
                   img[i][f][c]=(int)*ch+s;
           if(c>w-1){
                     c=0;
                     f++;
           }
   }
esto es tras haber dicho:

Código: Seleccionar todo

   w = rc.right-rc.left;
   h = rc.bottom-rc.top;
pero al compilar se detecta un error y se cierra la ejecución. ¿Alguna idea de que puede estar pasando?

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#23 Mensaje por Sorancio » 01/07/2010 9:53 am

Si al compilar da un error no se ejecuta directamente. ¿Qué error hay?

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#24 Mensaje por untio » 01/07/2010 10:00 am

Hola,
He creado un proyecto para esto. Mira lo siguiente:

Código: Seleccionar todo

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

void error(int linea);
void GetColors(HWND hStatic, char *);

void *pdatos;

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hdw;
    
    hdw = GetDesktopWindow();
    GetColors(hdw, "c:\\GetColors.bmp");
    MessageBox(NULL, "La imagen ha sido guardada en\r\nC:\\imagen.bmp", "Atención", MB_OK);
    return 0;
}
//////////////////////////////////////////////////
void GetColors(HWND hwnd, char *ruta)
{
    RECT rect;
    BITMAPINFOHEADER bih;
    BITMAPINFO binf;
    HBITMAP hbmp;
    BITMAPFILEHEADER bfh;
    HDC hdc, hdc2;
    HANDLE hmanej;
    DWORD escri;
    if(GetClientRect(hwnd, &rect) == 0)
        error(__LINE__);
    if((hdc = GetDC(hwnd)) == NULL)
        error(__LINE__);
    if((hdc2 = CreateCompatibleDC(hdc)) == NULL)
        error(__LINE__);
    memset(&binf, 0, sizeof(BITMAPINFO));
    memset(&bih, 0, sizeof(BITMAPINFOHEADER));
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biWidth = rect.right - rect.left;
    bih.biHeight = rect.bottom - rect.top;
    bih.biPlanes = 1;
    bih.biBitCount = 24;
    bih.biCompression = BI_RGB;
    bih.biSizeImage = (bih.biWidth * bih.biHeight * 3); 
    binf.bmiHeader = bih;
    if((hbmp = CreateDIBSection(hdc, &binf, DIB_RGB_COLORS, (void **) &pdatos, NULL, 0)) == NULL)
        error(__LINE__);
    memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bfh.bfType = 0x4d42;;
    bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + ((rect.right - rect.left) * (rect.bottom - rect.top) * 3);
    SelectObject(hdc2, hbmp);
    BitBlt(hdc2, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hdc, 0, 0, SRCCOPY); 
    
    //////////////////////////////////////////////////
    //AQUI EMPIEZA EL CÓDIGO PARA EXTRAER LOS VALORES:
    /////////////////////////////////////////////////
    
    int x;
    int y;
    int z;
    unsigned char *xx;
    typedef int  (*IMAGEN) [(rect.bottom - rect.top)][(rect.right - rect.left)][3]; 
    IMAGEN img;
    xx = (unsigned char *) pdatos;
    img = (IMAGEN ) malloc((rect.bottom - rect.top) * (rect.right - rect.left) * 3 * sizeof(int));
    if(img == NULL)
        error(__LINE__);
    memset(img, 0, (rect.bottom - rect.top ) * (rect.right - rect.left) * 3 * sizeof(int));    
    for(x = 0; x < (rect.bottom - rect.top); x++)
    {
        for(y = 0; y < (rect.right - rect.left); y++)
        {
            for(z = 0; z < 3; z++)
            {
                (*img)[x][y][z] += *xx;
                ++xx;
            }
        }
    }
    
    ////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    
    if((hmanej = CreateFile(ruta, FILE_WRITE_DATA, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
        error(__LINE__);
    if(WriteFile(hmanej, &bfh, sizeof(BITMAPFILEHEADER), &escri, NULL) == 0)
        error(__LINE__);
    if(WriteFile(hmanej, &bih, sizeof(BITMAPINFOHEADER), &escri, NULL) == 0)
        error(__LINE__);
    if(WriteFile(hmanej, pdatos, bih.biSizeImage, &escri, NULL) == 0)
        error(__LINE__);    
    DeleteObject(hbmp);
    DeleteDC(hdc2);
//    DeleteDC(hdc2);
    ReleaseDC(hwnd, hdc);
    CloseHandle(hmanej);
}    
/////////////////////////////////////////////////////////
void error(int linea)
{
    char cadena[200];
    sprintf(cadena, "Error en la línea: %d", linea);
    MessageBox(NULL, cadena, "Ha ocurrido un error.", MB_OK);
    exit(0);
}
Es que cambié el código por código mío.
Una cosa:
Si tu declaras:
int *arr[3];
creo que lo que estás declarando no es un array de enteros, si no de punteros a enteros. Si deseas crear un puntero a un array de enteros (y fíjate que curioso) se hace así:
int (*arr)[3];
Utiliza mi código. para usar los enteros usa
(*img)[fila][columna][0] para el azul
(*img)[fila][columna][1] para el verde
(*img)[fila][columna][z] para el rojo

No puedo comentarte más porque me esperan para ir a cenar.

Cuéntame como te ha ido y ya te diré algo.

pABL012
Mensajes: 21
Registrado: 08/06/2010 3:28 am

#25 Mensaje por pABL012 » 01/07/2010 2:19 pm

muchas gracias una vez mas por tu ayuda. estoy tratando de ver si todo está bien pero me encuentro lo siguiente:

si escribo en el código:

Código: Seleccionar todo

for(x = 0; x < (rect.bottom - rect.top); x++)
    {
        for(y = 0; y < (rect.right - rect.left); y++)
        {
            for(z = 0; z < 3; z++)
            {
                (*img)[x][y][z] += *xx;
                ++xx;
            }
        }
    }
    
    //hasta aquí lo que habías escrito. Ahora yo pongo esto:

    for(x = 100; x < 110/*(rect.bottom - rect.top)*/; x++)
    {
        for(y = 100; y < 110/*(rect.right - rect.left)*/; y++)
        {
             if(y!=110/*(rect.right - rect.left)*/-1)
                 printf("%d\t",((*img)[x][y][1]+(*img)[x][y][2]+(*img)[x][y][3])/3);
             else
                 printf("%d\t\n",((*img)[x][y][1]+(*img)[x][y][2]+(*img)[x][y][3])/3);
        }
    }
    getchar();
con esto he pretendido pasar a escala de grises... y nos encontramos, mirando la imagen que se crea en C://, que en el cuadrado en el que (100<x<110) y (100<y<110) el valor que nos deberíamos encontrar sería 0 o cercanos al mismo, ya que esta parte es de color negro o gris muy oscuro, sin embargo no es esto lo que sucede, ¿entonces me he equivocado en algo o significa esto que el código tiene algún fallo?

P.D.: el error que me da, no me lo da el compilador, sino el sistema. es decir, falla al ejecutarlo.

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#26 Mensaje por untio » 02/07/2010 1:01 am

Hola,
Lo que ocurre es que en el array hay una copia de los datos, pero no están los datos que se guardan en el fichero. Sólo hay una copia.
Bueno el código no es de mi gusto. Me estoy ciñendo a tu manera de ver el asunto. Pero si quieres pasarlo a escala de grises has de cambiar los datos originales como en el código que viene a continuación:

Código: Seleccionar todo

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

void error(int linea);
void GetColors(HWND hStatic, char *);

void *pdatos;

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hdw;
    
    hdw = GetDesktopWindow();
    GetColors(hdw, "c:\\GetColors.bmp");
    MessageBox(NULL, "La imagen ha sido guardada en\r\nC:\\imagen.bmp", "Atención", MB_OK);
    return 0;
}
//////////////////////////////////////////////////
void GetColors(HWND hwnd, char *ruta)
{
    RECT rect;
    BITMAPINFOHEADER bih;
    BITMAPINFO binf;
    HBITMAP hbmp;
    BITMAPFILEHEADER bfh;
    HDC hdc, hdc2;
    HANDLE hmanej;
    DWORD escri;
    if(GetClientRect(hwnd, &rect) == 0)
        error(__LINE__);
    if((hdc = GetDC(hwnd)) == NULL)
        error(__LINE__);
    if((hdc2 = CreateCompatibleDC(hdc)) == NULL)
        error(__LINE__);
    memset(&binf, 0, sizeof(BITMAPINFO));
    memset(&bih, 0, sizeof(BITMAPINFOHEADER));
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biWidth = rect.right - rect.left;
    bih.biHeight = rect.bottom - rect.top;
    bih.biPlanes = 1;
    bih.biBitCount = 24;
    bih.biCompression = BI_RGB;
    bih.biSizeImage = (bih.biWidth * bih.biHeight * 3); 
    binf.bmiHeader = bih;
    if((hbmp = CreateDIBSection(hdc, &binf, DIB_RGB_COLORS, (void **) &pdatos, NULL, 0)) == NULL)
        error(__LINE__);
    memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bfh.bfType = 0x4d42;;
    bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + ((rect.right - rect.left) * (rect.bottom - rect.top) * 3);
    SelectObject(hdc2, hbmp);
    BitBlt(hdc2, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hdc, 0, 0, SRCCOPY); 
    
    //////////////////////////////////////////////////
    //AQUI EMPIEZA EL CÓDIGO PARA EXTRAER LOS VALORES:
    /////////////////////////////////////////////////
    
    int x;
    int y;
    int z;
    unsigned char *xx;
    typedef int  (*IMAGEN) [(rect.bottom - rect.top)][(rect.right - rect.left)][3]; 
    IMAGEN img;
    xx = (unsigned char *) pdatos;
    img = (IMAGEN ) malloc((rect.bottom - rect.top) * (rect.right - rect.left) * 3 * sizeof(int));
    if(img == NULL)
        error(__LINE__);
    memset(img, 0, (rect.bottom - rect.top ) * (rect.right - rect.left) * 3 * sizeof(int));    
    for(x = 0; x < (rect.bottom - rect.top); x++)
    {
        for(y = 0; y < (rect.right - rect.left); y++)
        {
            for(z = 0; z < 3; z++)
            {
                (*img)[x][y][z] += *xx;
                ++xx;
            }
        }
    }
    xx = (unsigned char *) pdatos;
    for(x = 0; x < (rect.bottom - rect.top); x++)
    {
        for(y = 0; y < (rect.right - rect.left); y++)
        {
            z = (*img)[x][y][0] + (*img)[x][y][1] + (*img)[x][y][2];
            z /= 3;
            *xx = (unsigned char) z;
            ++xx;
            *xx = (unsigned char) z;
            ++xx;
            *xx = (unsigned char) z;
            ++xx;
        }
    }
    ////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    
    if((hmanej = CreateFile(ruta, FILE_WRITE_DATA, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
        error(__LINE__);
    if(WriteFile(hmanej, &bfh, sizeof(BITMAPFILEHEADER), &escri, NULL) == 0)
        error(__LINE__);
    if(WriteFile(hmanej, &bih, sizeof(BITMAPINFOHEADER), &escri, NULL) == 0)
        error(__LINE__);
    if(WriteFile(hmanej, pdatos, bih.biSizeImage, &escri, NULL) == 0)
        error(__LINE__);    
    DeleteObject(hbmp);
    DeleteDC(hdc2);
//    DeleteDC(hdc2);
    ReleaseDC(hwnd, hdc);
    CloseHandle(hmanej);
}    
/////////////////////////////////////////////////////////
void error(int linea)
{
    char cadena[200];
    sprintf(cadena, "Error en la línea: %d", linea);
    MessageBox(NULL, cadena, "Ha ocurrido un error.", MB_OK);
    exit(0);
}
Yo lo haría de otra manera. Crearía un puntero global para los datos, pero no lo hace mal.
Ah, te recuerdo que en escala de grises los tripletes rojo, verde y azul tienen los 3 el mismo valor y que en este código el archivo se llama GetColors.bmp

Espero que te sirva de ayuda.

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#27 Mensaje por untio » 02/07/2010 2:48 am

Hola, otra vez,
He visto tu código por encima y veo que cometes un error. Si tienes un array como int miarray[3], los elementos por separado son:
miarray[0], miarray[1] y miarray[2].
Los indices de los arrays empiezan en cero. Además de eso, para resolver la discusión sobre los tripletes RGB y el formato de los datos en el fichero, he modificado el código anterior para poner a cero, dentro de cada triplete, los bytes 1 y 2. Así, sólo se mostrará el primer componente. Será todo muy rojo si los tripletes son rojo, verde y azul ó todo muy azul si los tripletes son azul, verde y rojo. Ahí va el código:

Código: Seleccionar todo

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

void error(int linea);
void GetColors(HWND hStatic, char *);

void *pdatos;

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hdw;
    
    hdw = GetDesktopWindow();
    GetColors(hdw, "c:\\GetColors.bmp");
    MessageBox(NULL, "La imagen ha sido guardada en\r\nC:\\imagen.bmp", "Atención", MB_OK);
    return 0;
}
//////////////////////////////////////////////////
void GetColors(HWND hwnd, char *ruta)
{
    RECT rect;
    BITMAPINFOHEADER bih;
    BITMAPINFO binf;
    HBITMAP hbmp;
    BITMAPFILEHEADER bfh;
    HDC hdc, hdc2;
    HANDLE hmanej;
    DWORD escri;
    if(GetClientRect(hwnd, &rect) == 0)
        error(__LINE__);
    if((hdc = GetDC(hwnd)) == NULL)
        error(__LINE__);
    if((hdc2 = CreateCompatibleDC(hdc)) == NULL)
        error(__LINE__);
    memset(&binf, 0, sizeof(BITMAPINFO));
    memset(&bih, 0, sizeof(BITMAPINFOHEADER));
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biWidth = rect.right - rect.left;
    bih.biHeight = rect.bottom - rect.top;
    bih.biPlanes = 1;
    bih.biBitCount = 24;
    bih.biCompression = BI_RGB;
    bih.biSizeImage = (bih.biWidth * bih.biHeight * 3); 
    binf.bmiHeader = bih;
    if((hbmp = CreateDIBSection(hdc, &binf, DIB_RGB_COLORS, (void **) &pdatos, NULL, 0)) == NULL)
        error(__LINE__);
    memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bfh.bfType = 0x4d42;;
    bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + ((rect.right - rect.left) * (rect.bottom - rect.top) * 3);
    SelectObject(hdc2, hbmp);
    BitBlt(hdc2, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hdc, 0, 0, SRCCOPY); 
    
    //////////////////////////////////////////////////
    //AQUI EMPIEZA EL CÓDIGO PARA EXTRAER LOS VALORES:
    /////////////////////////////////////////////////
    
    int x;
    int y;
    int z;
    unsigned char *xx;
    typedef int  (*IMAGEN) [(rect.bottom - rect.top)][(rect.right - rect.left)][3]; 
    IMAGEN img;
    xx = (unsigned char *) pdatos;
    img = (IMAGEN ) malloc((rect.bottom - rect.top) * (rect.right - rect.left) * 3 * sizeof(int));
    if(img == NULL)
        error(__LINE__);
    memset(img, 0, (rect.bottom - rect.top ) * (rect.right - rect.left) * 3 * sizeof(int));    
    for(x = 0; x < (rect.bottom - rect.top); x++)
    {
        for(y = 0; y < (rect.right - rect.left); y++)
        {
            for(z = 0; z < 3; z++)
            {
                (*img)[x][y][z] += *xx;
                ++xx;
            }
        }
    }
    xx = (unsigned char *) pdatos;
    for(x = 0; x < (rect.bottom - rect.top); x++)
    {
        for(y = 0; y < (rect.right - rect.left); y++)
        {
            z = (*img)[x][y][0];// + (*img)[x][y][1] + (*img)[x][y][2];
            //z /= 3;
            *xx = (unsigned char) z;
            ++xx;
            *xx = (unsigned char) 0;
            ++xx;
            *xx = (unsigned char) 0;
            ++xx;
        }
    }
    ////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    
    if((hmanej = CreateFile(ruta, FILE_WRITE_DATA, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
        error(__LINE__);
    if(WriteFile(hmanej, &bfh, sizeof(BITMAPFILEHEADER), &escri, NULL) == 0)
        error(__LINE__);
    if(WriteFile(hmanej, &bih, sizeof(BITMAPINFOHEADER), &escri, NULL) == 0)
        error(__LINE__);
    if(WriteFile(hmanej, pdatos, bih.biSizeImage, &escri, NULL) == 0)
        error(__LINE__);    
    DeleteObject(hbmp);
    DeleteDC(hdc2);
//    DeleteDC(hdc2);
    ReleaseDC(hwnd, hdc);
    CloseHandle(hmanej);
}    
/////////////////////////////////////////////////////////
void error(int linea)
{
    char cadena[200];
    sprintf(cadena, "Error en la línea: %d", linea);
    MessageBox(NULL, cadena, "Ha ocurrido un error.", MB_OK);
    exit(0);
}
Tú puedes ver, con una simple mirada al fichero, quién tenía razón.

Espero tu respuesta.

Reeditado:
Cuando me refiero a los bytes 1 y 2 me estoy refiriendo a los índices. Realmente son el segundo y el tercero.

Reeditado otra vez:
Te recuerdo que los datos de la imagen empiezan por la línea de abajo no por la de arriba. El primer triplete es el de la esquina inferior izquierda.

pABL012
Mensajes: 21
Registrado: 08/06/2010 3:28 am

#28 Mensaje por pABL012 » 02/07/2010 7:53 am

te doy toda la razón. ahora si está todo claro. todo perfecto. muchas gracias por tu ayuda un saludo.

editado:
si quisiese sacar el puntero, de la función getcolors, que apunta hacia los canales de color, ¿como lo haría?, porque por lo que tengo entendido, no se puede sacar un array como resultado de una función. intento comprender como hacerlo con el programa siguiente pero al ser compilado es como si no viese el getchar() y no se para:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int a[6]={1,1,1};
int **tf(int *s);

main ()
{
 int *t,i,j,**q;
 t=&a[0];
 q=tf(t);
 /*for(i=0;i<3;i++)
    for(j=0;j<3;j++)
       if(j==2){
          printf("%d\n",q[i][j]);
       }else{
          printf("%d\t",q[i][j]);
       }*/
 getchar();
   
return 0;
}

int **tf(int *s)
{
    int i,j,**z;
    z=(int**)malloc(sizeof(int)*3*3);
    for(i=0; i<3;i++)
       for(j=0;j<3;j++)
          z[i][j]=i*(j+1)*(*(s+i));

    return z;
}


¿alguna idea de que puedo hacer?


REEDITADO:

he solucionado el problema sacando de la función un apuntador de la siguiente forma:

Código: Seleccionar todo

int *GetColors(HWND hwnd,int h,int w, char *ruta)
{
    //RECT rect;
    BITMAPINFOHEADER bih;
    BITMAPINFO binf;
    HBITMAP hbmp;
    BITMAPFILEHEADER bfh;
    HDC hdc, hdc2;
    HANDLE hmanej;
    DWORD escri;
    //GetClientRect(hwnd, &rect);
    hdc=GetDC(hwnd);
    hdc2=CreateCompatibleDC(hdc);
    memset(&binf, 0, sizeof(BITMAPINFO));
    memset(&bih, 0, sizeof(BITMAPINFOHEADER));
    bih.biSize=sizeof(BITMAPINFOHEADER);
    bih.biWidth=w;//rect.right-rect.left;
    bih.biHeight=h;//rect.bottom-rect.top;
    bih.biPlanes=1;
    bih.biBitCount=24;
    bih.biCompression=BI_RGB;
    bih.biSizeImage=(bih.biWidth * bih.biHeight * 3);
    binf.bmiHeader=bih;
    hbmp=CreateDIBSection(hdc, &binf, DIB_RGB_COLORS, (void **) &pdatos, NULL, 0);
    memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bfh.bfType = 0x4d42;;
    bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + w*h*3;//((rect.right - rect.left) * (rect.bottom - rect.top) * 3);
    SelectObject(hdc2, hbmp);
    BitBlt(hdc2, 0, 0, w,h/*rect.right - rect.left, rect.bottom - rect.top*/, hdc, 0, 0, SRCCOPY);
   
    //////////////////////////////////////////////////
    //AQUI EMPIEZA EL CÓDIGO PARA EXTRAER LOS VALORES:
    /////////////////////////////////////////////////
   
    int x;
    int y;
    int z;
    unsigned char *xx;
    typedef int (*IMAGEN)[h][w][3];//[(rect.bottom-rect.top)][(rect.right-rect.left)][3];
    IMAGEN img1;
    xx=(unsigned char *) pdatos;
    img1=(IMAGEN) malloc(sizeof(int)*3*h*w);//((rect.bottom-rect.top)*(rect.right-rect.left)*3*sizeof(int));
    memset(img1, 0,sizeof(int)*3*h*w); //(rect.bottom-rect.top )*(rect.right-rect.left)*3*sizeof(int));
    for(x=0;x<h/*(rect.bottom-rect.top)*/;x++){
        for(y=0;y<w/*(rect.right-rect.left)*/;y++){
            for(z=0;z<3;z++){
                (*img1)[x][y][z]+=*xx;
                ++xx;
            }
        }
    }
    int *img;
    img=(int*)malloc(sizeof(int)*w*h);
    for(x=0;x<h;x++){
        for(y=0;y<w;y++){
                img[w*x+y]=(*img1)[x][y][0]+(*img1)[x][y][1]+(*img1)[x][y][2];
                img[w*x+y]/=3;
        }
    }
    
    
    ////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
   
    hmanej = CreateFile(ruta, FILE_WRITE_DATA, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(hmanej, &bfh, sizeof(BITMAPFILEHEADER), &escri, NULL);
    WriteFile(hmanej, &bih, sizeof(BITMAPINFOHEADER), &escri, NULL);
    WriteFile(hmanej, pdatos, bih.biSizeImage, &escri, NULL);   
    DeleteObject(hbmp);
    DeleteDC(hdc2);
    ReleaseDC(hwnd, hdc);
    CloseHandle(hmanej);
    return img;
}
(he cambiado la función para que solo tome una parte de la pantalla). Pero lo que no se como hacer ahora, es obtener la información de un bitmap que está guardado en una dirección del disco duro. Corrigeme si me equivoco al decir que para ello solo se necesita lo que llamaste en GetColors "hdc" y "binf", ya que al tener estos, con la función CreateDIBSection podemos asignar los valores de los canales RGB a lo que llamaste pdatos, y así utilizar la misma rutina para poner los colores en una matriz. Si esto que he escrito es cierto, ¿podrías ayudarme a saber como encontrar "hdc" y "binf" habiendo dado solo la dirección de donde se encuentra el bitmap?

un saludo y gracias por tu paciencia

ntala
Mensajes: 1
Registrado: 12/09/2013 5:25 am
Ubicación: santiago chile

:D

#29 Mensaje por ntala » 12/09/2013 5:26 am

untio escribió: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.
Te amo won... me salvaste un dia de trabajo

Responder

¿Quién está conectado?

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