Page 1 of 3

Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 9:36 am
by jmartial
Buenos días,

Teniendo un bitmap monocromo en el disco duro, por ejemplo: "c:\miBitmap.bmp",

¿Cómo podría leerlo pixel a pixel y saber que pixel es negro y cual blanco?

Llevo varios días haciendo pruebas y no he encontrado la manera de hacerlo, estoy seguro que se puede hacer, pero no he sido capaz.
Además, es un tema que me tiene parada la finalización de un programa.

Si alguien pudiera echarme una mano o indicarme un camino para probar, se lo agradecería mucho.

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 9:57 am
by antolin
Hola a todos.

Esto me interesa. Y también como obtener los pixels de un bitmap de 8 bits.

Saludos

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 10:15 am
by Antonio Linares
Joaquín,

Yo cargaría el bitmap en memoria y vas leyendo los pixeles con GetPixel()

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 10:48 am
by jmartial
Antonio,

Así lo estaba haciendo y ya me funciona, la pega es que no sé por qué, getPixel() devuelve 0 para el negro y 16777215 para el blanco.

La siguiente cuestión que necesito es cortar el largo del bitmap en memoria y volverlo a grabar a disco.

¿Cómo se haría?

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 11:18 am
by cnavarro
Joaquin,

Quizas te pueda ayudar mirar los ejemplos de samples: bmptoc.prg y bmptohex.prg

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 11:23 am
by antolin
Es una buena solución Antonio. Muy buena. No lo había pensado.
Aunque a mi también me interesa conocer el proceso de correspondencia entre paleta y bits de la imagen. Donde empieza el primer bit/byte de la imagen y ver si es un índice de paleta. O algo así.

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 11:58 am
by Antonio Linares
Joaquin,

Tienes que crear un nuevo bitmap en memoria con las dimensiones que quieras y copiar del anterior usando BitBlt()

Busca por BitBlt() en el código fuente de FWH

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 12:42 pm
by jmartial
Antonio,

Sí, eso ya lo he hecho, lo que no sé es como grabo como bitmap en disco el hDCMemResultante.

Es decir, ya he cargado en un hDC el bitmap original, lo he analizado y visto cual sería la nueva altura del bitmap, con Bitblt lo he copiado a otro hDCMemResultante con la nueva medida (es decir, lo he cortado).

¿ Cómo consigo el handle del nuevo bitmap a partir del hDCMemResultante, para luego guardarlo a disco con DibWrite() ?

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 12:58 pm
by Antonio Linares
Joaquín,

Tienes que usar CreateDIBitmap()

Busca en los fuentes de FWH por CreateDIBitmap y encontrarás ejemplos :-)

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 1:00 pm
by mastintin
¿Y usando gdiplus ? ...

Seria algo así ... ( de memoria )

Code: Select all


 obmp:= TGdibmp():new( cFile)
obmp:resize( nwidth, nheight)
obmp:save( nuevobmp)
obmp:end()

 

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 1:10 pm
by Antonio Linares
genial Manuel! :-)

Re: Leer pixeles de un bitmap monocromo

Posted: Thu Jul 23, 2015 2:26 pm
by mastintin
jmartial wrote:Buenos días,

Teniendo un bitmap monocromo en el disco duro, por ejemplo: "c:\miBitmap.bmp",

¿Cómo podría leerlo pixel a pixel y saber que pixel es negro y cual blanco?

Llevo varios días haciendo pruebas y no he encontrado la manera de hacerlo, estoy seguro que se puede hacer, pero no he sido capaz.
Además, es un tema que me tiene parada la finalización de un programa.

Si alguien pudiera echarme una mano o indicarme un camino para probar, se lo agradecería mucho.
Perdón no conteste a la primera cuestion...
Tambien puedes con gdiplus ...

Code: Select all


local x,y 
 local obmp:= TGdibmp():new( cFile)

  local nxWidth := obmp:GetWidth()
  local nxHeight:= obmp:GetHeight()

   for x=1 to nxWidth
      for y = 1 to nxHeight
         nColor := nRGB( obmp:GetRedPix( X-1, Y-1 ),  obmp:GetGreenPix( X-1, Y-1 )  , obmp:GetBluePix( X-1, nY-1 ) )
         msginfo( "el pixel"+str(x) +","+str(y) + "es " +  id ( ncolor == 0 , "negro"  , "blanco "   )        
     next
   next

   obmp:end()

 

Re: Leer pixeles de un bitmap monocromo

Posted: Fri Jul 24, 2015 7:51 am
by jmartial
Buenos días,

Sigo atascado con el problema,

¿ Cómo consigo el handle del nuevo bitmap a partir del hDCMemResultante, para luego guardarlo a disco con DibWrite() ?

Buscando ejemplos de createDiBitmap en fwh, veo que usa freeimage, pero me devuelve un handle del bitmap a cero si lo intento así.

¿Alguien sabe como leer un BMP del disco y Grabarlo con otro nombre y otra altura de pixeles?

¿Alguien sabe, como convertir un hDC en un handle a bitmap?

Me da igual usar freeimage, pero necesito cortar el bmp como sea.

Re: Leer pixeles de un bitmap monocromo

Posted: Fri Jul 24, 2015 8:06 am
by Antonio Linares
Joaquín,

Puedes copiar aqui el código que has probado usando createDiBitmap() ?

Re: Leer pixeles de un bitmap monocromo

Posted: Fri Jul 24, 2015 8:26 am
by mastintin
jmartial wrote:Buenos días,

¿Alguien sabe como leer un BMP del disco y Grabarlo con otro nombre y otra altura de pixeles?

¿Alguien sabe, como convertir un hDC en un handle a bitmap?
¿ cuando dices "otra altura" te refieres a redimensionado o recorte ?
¿ algun motivo para no usar gdiplus ? fwh ya lo integra internamente .
Si explicas un poco que es lo que pretendes te preparo un test sencillo ..