Page 1 of 1

Sobre edición de fotografía

PostPosted: Wed Feb 15, 2006 10:01 am
by José Vicente Beltrán
Hola a todos,
necesito editar fotografias para ponerle texto en cualquier parte, en cualquier color o tamaño.

¿Se puede hacer?, en su caso, ¿un ejemplito?

Saludos :shock:

Re: Sobre edición de fotografía

PostPosted: Thu Feb 16, 2006 4:44 am
by fleal
Por si te sirve, yo uso este para poner las marca de agua

http://www.picture-shark.com/

Re: Sobre edición de fotografía

PostPosted: Thu Feb 16, 2006 9:16 am
by José Vicente Beltrán
Gracias por tu respuesta, pero lo que necesito es poder incluir un texto a una fotografía desde una aplicación FW, para integrarla dentro de otro sistema mas amplio que ya está funcionando.

PostPosted: Fri Feb 17, 2006 8:51 am
by Paco Garcia
Hola José

Prueba esto a ver si te vale

Code: Select all  Expand view
#include "FiveWin.ch"


function Main()
local oWnd, oMenu

   MENU oMenu
      MENUITEM "Carga bmp" ACTION Carga( oWnd )
   ENDMENU

   DEFINE WINDOW oWnd MENU oMenu
   ACTIVATE WINDOW oWnd


return nil

function carga( oWnd )

   local cBmpFile := cGetFile( "*.bmp", "Please select a BMP file" )
   local hDC, hDCMem, hOldBmp, hBmp
   local hDib

   if !file( cBmpFile )
      ? "No encuentro " + cBmpFile
      return nil
   endif

   hDC := oWnd:GetDC()
   hBmp := ReadBitmap( hDC, cBmpFile )

   hDCMem := CreateCompatibleDC( hDC )
   hOldBmp := SelectObject( hDCMem, hBmp )

   TextOut( hDCMem, 10, 10, "Texto de prueba" )

   SelectObject( hDCMem, hOldBmp )
   DeleteObject( hDCMem )
   oWnd:ReleaseDC()

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

return nil


#pragma BEGINDUMP

#include <windows.h>
#include <winuser.h>
#include "hbapi.h"


HB_FUNC( CREATECOMPATIBLEBITMAP )
{
    hb_retnl( (LONG) CreateCompatibleBitmap( ( HDC ) hb_parnl( 1 ), hb_parni( 2 ), hb_parni( 3 ) ));

}

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

}
#pragma ENDDUMP


Un saludo.

PD. Para utilizar otros formatos de imágenes ya postee un mensaje anteriormente con FreeImage.dll

PostPosted: Fri Feb 17, 2006 4:02 pm
by José Vicente Beltrán
Muchas gracias, Paco

me has dado algo para empezar ¡que no es poco!

saludos :shock:

PostPosted: Fri Feb 17, 2006 6:44 pm
by Paco Garcia
Por si necesitas:

Cambiar color de texto
Code: Select all  Expand view
:
// rojo    0-255
// verde 0-255
// azul    0-255

nColor = SetTextColor( hDCMem, RGB( rojo, verde, azul ))

//.... funciones de pintar texto

SetTextColor( hDCMem, nColor )


Color de fondo de texto

Code: Select all  Expand view
:
// rojo    0-255
// verde 0-255
// azul    0-255

nColor = SetBkColor( hDCMem, RGB( rojo, verde, azul ))

//.... funciones de pintar texto

SetBkColor( hDCMem, nColor )


Cambiar fuente

Code: Select all  Expand view
:
DEFINE FONT oFont NAME ... SIZE...

hOldFont = SelectObject( hDCMem, oFont:hFont)

//.... funciones de pintar texto

SelectObject( hDCMem, hOldFont)
oFont:End()


Un abrazo

PostPosted: Fri Feb 17, 2006 6:58 pm
by José Vicente Beltrán
¿Como haces para leer el pensamiento?
En este momento estaba dandole vueltas precisamente a eso.

Gracias de nuevo!!!!!!!!! :shock:

PostPosted: Fri Feb 17, 2006 7:55 pm
by Marcelo Via Giglio
Paco,

hay alguna manera de hacer este cambio sobre el bmp, pero que este bmp este en un dialogo y en lugar de guardarlo en un archivo volverlo a poner al mismo bmp, es decir rediibujar el bmp con el cambio.

Un ejemplo, si tienes un bmp en un dialogo le haces un cuantos floofill (es decir lo cambias) y luego mueves el dialogo o pones una ventana sobre ell, los cambios desaparecen, entonces podriamos pensar en colocar en el ON PAINT algo que repinte para volver a obttener el bmp con los cambios, pero esto dan resultados inesperados, por lo que hice fue hacer el cambio, guardalrlo a disco, recargar el bmp del archivo y lla tengo todo ok, pero no pude hacerlo sin utilizar un archivo temporal, claro no es mucho drama ello, pero tengo la curiosidad de como se podria hacer sin archivo temporal.

un saludo

Marcelo

PostPosted: Sat Feb 18, 2006 1:54 am
by Paco Garcia
Hola, realmente cuando pintas en el hBmp estas pintando sobre el bitmap. Supongo que te esta sucediendo esto porque cada vez que pintas vuelves a cargar el bitmap desde disco.
Prueba a cargarlo una sola vez y "matarlo" cuando termines de utilizarlo. De esta manera los cambios permaneceran.

En cuanto al UNDO, (Por si las flais) se me ocurre que se puede ir salvando rectangulos de bitmap y guardandolos en un array anotando tambien las coordenadas de donde lo copiasteis.

Vamos, lo del UNDO es porque yo lo pediria, ya puestos... :D

Para salvar un rectangulo de bitmap:

seleccionamos el bitmap en un dispositivo de contexto de memoria

Code: Select all  Expand view
hDCMem := CreateCompatibleDC( hDC )
hOldBmp := SelectObject( hDCMem, hBmp )

//creamos un bitmap en memoria del tamaño del rectángulo que queremos

hBmpMem := CreateCompatibleBitmap( hDC, aRect[4]-aRect[2], aRect[3]-aRect[1] )

//copiamos del bitmap inicial al destino el rectangulo que deseamos:


hDCMem2 := CreateCompatibleDC( hDC )
hOldBmp2 := SelectObject( hDCMem2, hBmpMem )

BitBlt( hDCMem2, 0, 0, aRect[4]-aRect[2], aRect[3]-aRect[1], hDCMem,
aRect[2], aRect[1], SRCCOPY ) //13369376

SelectObject( hDCMem2, hOldBmp2 )
SelectObject( hDCMem, hOldBmp )

DeleteDC( hDCMem2 )
DeleteDC( hDCMem )

En hBmpMem tenemos el trozo que hemos capturado. Lo metemos en un array y listo.

Hay que acordarse al final de todo este invento, cuando matemos el bitmap original y ya no nos sirva el array de bitmaps, de hacer un DeleteObject( aUndos[n] )
DeleteObject( aUndos[n+1] )
etc...

Bueno creo que mas o menos esta es la idea. Acordaros de liberar siempre lo que pilleis antes.

Un saludo

Paco Garcia

PostPosted: Mon Feb 20, 2006 6:58 pm
by Marcelo Via Giglio
Paco,

gracias, lo probare

saludos

Marcelo