Page 1 of 1

Cómo analizar el contenido de un bitmap

Posted: Thu Feb 23, 2006 2:01 pm
by Rafael Clemente
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

Posted: Thu Feb 23, 2006 11:06 pm
by Paco Garcia
Hola Rafael

Code: Select all


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

Posted: Fri Feb 24, 2006 7:57 am
by Rafael Clemente
Paco:
Muchas gracias por tu idea. La he probado así:

Code: Select all

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

Posted: Fri Feb 24, 2006 9:51 am
by Paco Garcia
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

Posted: Fri Feb 24, 2006 10:34 am
by Rafael Clemente
Paco:
Perdona, pero no entiendo la modificación. He puesto

Code: Select all

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

Posted: Fri Feb 24, 2006 1:16 pm
by Paco Garcia
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

Posted: Fri Feb 24, 2006 3:35 pm
by Rafael Clemente
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