Escalar BMP capturado con WndBitmap

Escalar BMP capturado con WndBitmap

Postby Marcelo Via Giglio » Mon Dec 14, 2009 8:24 pm

Holas,

es posible escalar el Bmp capturado con WndBitmap, sin llevar la imagen a disco

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Escalar BMP capturado con WndBitmap

Postby Marcelo Via Giglio » Mon Dec 14, 2009 8:42 pm

Holas,

encontre esta funcion StretchBlt creo que podria ser de ayuda, si tienen otra opcion me gustaria saberla

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Escalar BMP capturado con WndBitmap

Postby antolin » Tue Dec 15, 2009 11:25 am

Con el PALBMPDRAW normal del FWH, lo puedes dibujar mas grande o mas pequeño sin necesidad de tocarlo, no tienes mas que especificar el ancho y el alto que deseas.

Si lo que quieres es guardarlo en dico con otro tamaño, efectivamente tendras que cambiarle el tamaño desde software.
Peaaaaaso de foro...
antolin
 
Posts: 492
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: Escalar BMP capturado con WndBitmap

Postby Antonio Linares » Tue Dec 15, 2009 12:28 pm

Marcelo,

FWH proporciona ResizeBmp():

http://wiki.fivetechsoft.com/doku.php?id=fivewin_function_resizebmp

ojo que el handle del bitmap resultante es distinto al original por lo que tendrás que destruir hResizedBmp usando DeleteObject( hResizedBmp) cuando termines de usarlo :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41403
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Escalar BMP capturado con WndBitmap

Postby Marcelo Via Giglio » Tue Dec 15, 2009 1:56 pm

Gracias a todos por responder,

Antonio, como no hay documentacion de esta funcion ResizeBmp( hBmp ), a la prueba error, la cosa es asi creo ResizeBmp( hBmp, xPixels, yPixels )
gracias por la ayuda

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Escalar BMP capturado con WndBitmap

Postby Antonio Linares » Tue Dec 15, 2009 1:58 pm

Marcelo,

Está documentada en nuestro wiki desde Septiembre :-)

http://wiki.fivetechsoft.com/doku.php?id=fivewin_function_resizebmp
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41403
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Escalar BMP capturado con WndBitmap

Postby Marcelo Via Giglio » Tue Dec 15, 2009 3:55 pm

Antonio,

tienes razon, lo encontre en los fuentes winapi, muchas gracias....

Ahora otra consulta, el hecho de querer utilizar esta funcion, es crear un navegador de paginas como lo hace Acrobat Reader para el previsualizador de FW,
el problema es como crear las miniaturas desde los EMF, la opcion que veo mas aconsejable es en el rpreview.prg, pero el problema es como pasar de EMF a BMP, alguna idea? capturando el Tmetafile visualizado es posible convertirlo a BMP, pero como hacerlo todos de un tiron.

Haber si hay alguna sugerencia

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Escalar BMP capturado con WndBitmap

Postby Antonio Linares » Tue Dec 15, 2009 11:39 pm

Marcelo,

Supongo que lo mas rápido es crear un nuevo bitmap en memoria, luego seleccionarlo en un hDC y en ese hDC mostrar el EMF, con lo que ya tendriamos el bitmap modificado :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41403
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Escalar BMP capturado con WndBitmap

Postby Antonio Linares » Tue Dec 15, 2009 11:51 pm

El código (no lo he probado) sería parecido a esto:
Code: Select all  Expand view

local hDC := CreateCompatibleDC( 0 )
local hBmp := CreateCompatibleBitmap( hDC, nAncho, nAlto )
local hOldBmp := SelectObject( hDC, hBmp ) // ya tenemos el nuevo bitmap seleccionado en un hDC
local hEMF := GetEnhMetaFile( cFileName ) // nombre del fichero EMF

PlayEnhMetaFile( hDC, hEMF, { 0, 0, nAncho, nAlto } ) // hay que crear esta función para que tome el 3er parametro como un rect

CloseEnhMetafile( hEMF )

SelectObject( hDC, hOldBmp )
DeleteDC( hDC )
 

en ese momento hBmp debería contener el EMF pintado en él :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41403
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Escalar BMP capturado con WndBitmap

Postby Marcelo Via Giglio » Wed Dec 16, 2009 1:24 am

Antonio,

viendo la documentacion y codigo fuente de FW, esto deberia funcionar, para probar estoy pasando el Bmp a disco pero no obtengo resultado, he utilizado un Dialogo en lugar del BMP y si pude visualizar el EMF, alguna idea?

Code: Select all  Expand view


FUNCTION createBmp()

LOCAL hDib
local hDC := CreateCompatibleDC( 0 )
local hBmp := CreateCompatibleBitmap( hDC, 50, 75 )
local hOldBmp := SelectObject( hDC, hBmp ) // ya tenemos el nuevo bitmap seleccionado en un hDC
local hEMF := GetEnhMetaFile( '1.emf' ) // nombre del fichero EMF

PlayEnhMetaFile( hDC, hEMF,, .T., 50, 75 ) // hay que crear esta función para que tome el 3er parametro como un rect

CloseEnhMetafile( hEMF )

hDib := DibFromBitmap( hBmp )
DibWrite( "file.bmp" , hDib )
GloBalFree( hDib )

SelectObject( hDC, hOldBmp )
DeleteDC( hDC )


RETURN( NIL )
 
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Escalar BMP capturado con WndBitmap

Postby Daniel Garcia-Gil » Wed Dec 16, 2009 3:03 am

Hola Marcelo...

Prueba hacer este cambio, pieso que podrias tener problemas en el DC que estas creando para le bitmap

local hDC1 := GetDC( GetDesktopWindow() )
local hDC := CreateCompatibleDC( hDC1 )
ocal hBmp := CreateCompatibleBitmap( hDC1, 50, 75 )

o le pasas un hDC valido a la funcion
FUNCTION createBmp( hDC1 )

el problema puede estar en que si haces un bitmap con un hDC "NULO" este se crea monocromatico
despues de crear el bitmap puedes usar DrawBitmap o PalBmpDraw para probar que este bien
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Escalar BMP capturado con WndBitmap

Postby Antonio Linares » Wed Dec 16, 2009 8:56 am

Marcelo,

A que te refieres con "no obtengo resultado" ? Se crea ? Está vacio ? No se ve nada ? etc...

Como te indica Daniel, haria falta crear un segundo hDC compatible con el anterior para que no genere un bitmap en blanco y negro.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41403
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Escalar BMP capturado con WndBitmap

Postby Marcelo Via Giglio » Wed Dec 16, 2009 12:56 pm

Daniel, Antonio

Gracias por la ayuda, he probado con pasar un DC valido como parametro, tambien desde GetDC( GetDesktopWindow() ), entre esas combinaciones
el resultado ha sido un BMP de 24 bit en lugar a uno monocromatico como advirtio Daniel, pero no se pinta el EMF en el BMP.

Antonio, el programa genera el BMP de 50x75 como se especifica pero todo negro, sin el EMF dibujado en el.

Alguna otra opcion...?

Gracias

Marcelo
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Escalar BMP capturado con WndBitmap

Postby Daniel Garcia-Gil » Wed Dec 16, 2009 1:21 pm

Hola Marcelo...

estas usando mal la funcion PlayEnhMetaFile

mira los parametros que debes pasar

PlayEnhMetaFile( hDC, hEMF, { 0, 0, 50, 75 } )
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Escalar BMP capturado con WndBitmap

Postby Marcelo Via Giglio » Wed Dec 16, 2009 1:49 pm

Daniel,

del manual

PlayEnhMetaFile( <hDC>, <hEMF>, [<hWnd>], [<lPrinter>, [<nRightOffset>], [<nBottomOffset>]] ) --> lSuccess

del codigo fuente

Code: Select all  Expand view

#ifdef __XPP__
   CLIPPER PLAYENHMET( PARAMS ) // ()  hDC, hMetaFile, hWnd, lPrinter --> lSuccess
#else
   CLIPPER PLAYENHMETAFILE( PARAMS ) // ()  hDC, hMetaFile, hWnd, lPrinter --> lSuccess
#endif
{
   RECT rect;
   BOOL lRet;

   if( _parl( 4 ) )
   {
      rect.left = 0;
      rect.top  = 0;
      rect.right  = GetDeviceCaps( ( HDC ) _parnl( 1 ), HORZRES );  
      rect.bottom = GetDeviceCaps( ( HDC ) _parnl( 1 ), VERTRES );
     
      if( _parni( 5 ) )
         rect.right += _parni( 5 );
         
      if( _parni( 6 ) )
         rect.bottom += _parni( 6 );    
   }
   else  
      GetClientRect ( ( HWND )_parnl( 3 ), &rect );

   lRet = ( BOOL ) PlayEnhMetaFile( ( HDC ) _parnl( 1 ), ( HENHMETAFILE ) _parnl( 2 ), &rect );

   if( ! lRet && lRet != ERROR_SUCCESS )
   {
      char sBuffer[ 200 ];
     
      wsprintf( sBuffer, "Error (%d) showing Enhanced Metafile\n\nError description:", GetLastError() );
        MessageBox( NULL, sBuffer, ( LPSTR ) "Printing EMF", MB_OK | MB_ICONEXCLAMATION );
   }

   _retl( lRet );
}
 


Otra duda del codigo que publicaste:

local hDC1 := GetDC( GetDesktopWindow() )
local hDC := CreateCompatibleDC( hDC1 )
ocal hBmp := CreateCompatibleBitmap( hDC1, 50, 75 )

Utilizas hDC1 en CreateCompatibleBitmap, no deberia ser hDC, he probado con ambos pero nada

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1051
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 53 guests