Cómo analizar el contenido de un bitmap

Cómo analizar el contenido de un bitmap

Postby Rafael Clemente » Thu Feb 23, 2006 2:01 pm

Quisiera analizar el contenido de un bitmap mostrándolo en pantalla con @ r,c BITMAP .... y leyéndolo punto a punto con GetPixel(). Esto funciona muy bien cuando la imagen es visible en la ventana pero no si la oculto oBmp:Hide() o desplazo la imagen fuera de la pantalla.

¿Alguien sabe alguna forma de leer, pixel a pixel, el contenido de un BMP sin necesidad de hacerlo visible en pantalla?

Gracias y saludos,

Rafael
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Postby Paco Garcia » Thu Feb 23, 2006 11:06 pm

Hola Rafael

Code: Select all  Expand view  RUN

function analiza( hDC, hBmp )

local hDCMem := CreateCompatibleDC( hDC )
local hOldBmp := SelectObject( hDCMem, hBmp )
local x := 1
local y := 1
local nColor

nColor := GetPixel( hDCMem, x, y ) //a tutipleni

SelectObject( hDCMem, hOldBmp )
DeleteDC( hDCMem )

return nil


#pragma BEGINDUMP
#include <windows.h>
#include "hbapi.h"

HB_FUNC( CREATECOMPATIBLEDC )
{
         hb_retnl( (LONG) CreateCompatibleDC( ( HDC ) hb_parnl( 1 )));

}
#pragma ENDDUMP




Un saludo
User avatar
Paco Garcia
 
Posts: 172
Joined: Fri Oct 07, 2005 12:00 pm

Postby Rafael Clemente » Fri Feb 24, 2006 7:57 am

Paco:
Muchas gracias por tu idea. La he probado así:
Code: Select all  Expand view  RUN
METHOD Analiza(oImage)
LOCAL hBmp   := oImage:hWnd
LOCAL hDc    := GetDc(hBmp)
local hDCMem := CreateCompatibleDC( hDC )
local hOldBmp:= SelectObject( hDCMem, hBmp )
local nX9 := oImage:nWidth
local nY9 := oImage:nHeight
local x, y, p

FOR y := 0 TO nY9
    cLin := ""
    FOR x := 0 TO nX9
        p := GetPixel(hDcMem, x, y)
        cLin += ALLTRIM(STR(p))
    NEXT
    ? cLin
NEXT
SelectObject( hDCMem, hOldBmp )
DeleteDC( hDCMem )
RETURN NIL

#pragma BEGINDUMP
....
#pragma ENDDUMP


y para todos los pixels me devuelve blanco (cLin = "-1-1-1-1-1-1-1-1...")
¿Se te ocurre qué estoy haciendo mal?
Rafael
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Postby Paco Garcia » Fri Feb 24, 2006 9:51 am

Hola

Código:

METHOD Analiza(oImage)
LOCAL hBmp := oImage:hWnd
LOCAL hDc := GetDc(hBmp)
local hDCMem := CreateCompatibleDC( hDC )
local hOldBmp:= SelectObject( hDCMem, hBmp ) << oImage:hBmp
local nX9 := oImage:nWidth
User avatar
Paco Garcia
 
Posts: 172
Joined: Fri Oct 07, 2005 12:00 pm

Postby Rafael Clemente » Fri Feb 24, 2006 10:34 am

Paco:
Perdona, pero no entiendo la modificación. He puesto
Code: Select all  Expand view  RUN
local hOldBmp:= SelectObject( hDCMem, oImage:hBmp)

pero, claro, me da el error TBITMAP:Message not found()

¿Es que tengo que capturar hBmp con alguna otra función?
Saludos y gracais otra vez
Rafael
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Postby Paco Garcia » Fri Feb 24, 2006 1:16 pm

METHOD Analiza(oImage)
LOCAL hBmp := oImage:hWnd
LOCAL hDc := GetDc(hBmp)
local hDCMem := CreateCompatibleDC( hDC )
local hOldBmp:= SelectObject( hDCMem, hBmp )
local nX9 := oImage:nWidth
local nY9 := oImage:nHeight
local x, y, p


Un hWnd no es un manejador de una imagen. Es un manejador de una ventana. El handle que necesitamos es el hBmp no el hWnd

en lugar de LOCAL hBmp := oImage:hWnd
debes poner LOCAL hBmp := oImage:hBmp
User avatar
Paco Garcia
 
Posts: 172
Joined: Fri Oct 07, 2005 12:00 pm

Postby Rafael Clemente » Fri Feb 24, 2006 3:35 pm

Paco:
Gracias por la explicación. Me había vuelto loco porque no es oImage:hBmp sino oImage:hBitmap. Arreglado esto, ya me compila y funciona. Voy a jugar un poco con ello.
Saludos y buen fin de semana
Rafael
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 44 guests