Crear BMP monocromo

Crear BMP monocromo

Postby jmartial » Sun Dec 11, 2016 12:01 pm

Hola,

Necesito resolver un problema y no sé por donde meterle mano.

Tengo un bitmap en disco y necesito convertirlo en monocromo y volverlo a grabar en un fichero en el disco.

La idea es leer cada pixel y si es de cualquier color, ponerlo como negro y si es blanco, dejarlo blanco. Leer/Setear cada pixel es con getpixel()/setpixel(),
pero el resto de funciones necesarias no sé cual necesito.

Lo necesito para imprimirlo en una impresora monocromo y que su tamaño sea el más pequeño posible.
Un Saludo,
Joaquín Martínez
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Crear BMP monocromo

Postby Antonio Linares » Mon Dec 12, 2016 11:31 am

Joaquín,

La forma más rápida de hacerlo es usar la función de Windows BitBlt()

1. Creas un bitmap monocromo
HBITMAP hBmpMono = CreateBitmap( 100, 100, 1, 1, NULL );

2. Creas un hDC para usarlo con ese bitmap monocromo:
HDC hDcMono = CreateCompatibleDC( NULL );

3. Seleccionas ese bitmap monocromo en ese hDcMono y guardamos su "imagen" anterior:
HBITMAP hbmPrev = SelectBitmap( hDcMono, hBmpMono );

4. Lees el bitmap desde disco:
hBitmapColor = ReadBitmap( 0, cFileName )

5. Creas un hDC para usarlo con el bitmap de color:
HDC hDcColor = CreateCompatibleDC( NULL );

6. Copias el bitmap de color al bitmap monocromo:
BitBlt( hDcMono, 0, 0, 100, 100, hDcColor, 0, 0, SRCCOPY );

7. Salvas el bitmap monocromo a disco. Esté método de la Clase TWindow es lo que necesitas:
Code: Select all  Expand view
METHOD SaveToBmp( cBmpFile ) CLASS TWindow

   local hBmp := WndBitmap( ::hWnd )
   local hDib := DibFromBitmap( hBmp )

   DibWrite( cBmpFile, hDib )
   GloBalFree( hDib )
   DeleteObject( hBmp )

return ( File( cBmpFile ) )
regards, saludos

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

Re: Crear BMP monocromo

Postby jmartial » Mon Dec 12, 2016 12:17 pm

Muchas gracias Antonio.

Lo pruebo.
Un Saludo,
Joaquín Martínez
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Crear BMP monocromo

Postby Antonio Linares » Mon Dec 12, 2016 9:35 pm

Antes de llamar a BitBlt() tienes que seleccionar también el bitmap original en su hDC:

HBITMAP hbmPrev2 = SelectBitmap( hDcColor, hBitmapColor );
regards, saludos

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

Re: Crear BMP monocromo

Postby jmartial » Tue Dec 13, 2016 9:18 am

Gracias Antonio,


Aunque ha funcionado, no es el efecto que esperaba, porque la imágen está un poco sucia, es decir, algunos puntos que deberían ser blancos no son exactamente blancos,
por lo que windows los pone negros.

Debido a esto, estoy investigando el poner en monocromo pero pudiendo aplicar un porcentaje de oscuridad ajustable.

Lo estoy probando con getpixel / setpixel, pero no sé si habrá otro sistema más rápido.
Un Saludo,
Joaquín Martínez
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Crear BMP monocromo

Postby Antonio Linares » Tue Dec 13, 2016 10:22 am

El sistema más rápido es BitBlt() pues está diseñado para mover bloques enteros de memoria de una vez

Revisa el código, por ejemplo, de la función DrawGrayed() en source\winapi\bmpdraw.c
y verás como usar BitBlt()
regards, saludos

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 85 guests