FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Convertir unsigned integer a decimal
Posts: 365
Joined: Sat Oct 08, 2005 07:59 PM

Convertir unsigned integer a decimal

Posted: Fri May 16, 2008 12:31 PM

Me llega un número en formato unsigned de 4 bytes (es un dato OLE_COLOR) y necesito convertirlo a decimal en el rango 0 - 16777215 (RGB). He probado todas las combinaciones de I2bin(), Bin2I(), L2Bin()...etc y no me aclaro. Alguien me podría decir qué función utilizar?
Gracias
Rafael

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Convertir unsigned integer a decimal

Posted: Fri May 16, 2008 04:58 PM

Rafael,

Prueba con nLoWord( nNumero ) + ( 256 * nHiWord( nNumero ) )

ó con:

nHiWord( nNumero ) + ( 256 * nLoWord( nNumero ) )

Depende del orden en el que esté guardado

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 365
Joined: Sat Oct 08, 2005 07:59 PM

Convertir unsigned integer a decimal

Posted: Fri May 16, 2008 05:50 PM

Antonio:
Tengo este problema al utilizar la función GetPixelColor() de una librería comercial que en VB funciona bien.

Con tu receta, en algunos casos sí funciona pero en otros no.

Hago n := GetPixelColor(x,y)

Con Rojo puro (n=255), funciona bien
Con verde puro (debería ser n=65280 pero recibo -256), así que tus fórmulas producen valores negativos
Con azul puro ( debería ser n=16711680), recibo 0

Si antes convierto n a WORD así:
n := GetPixelColor(x,y)
n := Bin2W(L2Bin(n))
Rojo y verde los lee bien (255, 65280) pero azul sigue leyendo 0

Quizás es un error en la librería que estoy utilizando (aunque en VB les va bien) o algo relacionado con el hecho de que la n que recibo es una variable OLE_COLOR y da problemas en los bits más altos. A ver si el fabricante me dice algo.

Gracias

Rafael

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Convertir unsigned integer a decimal

Posted: Fri May 16, 2008 06:24 PM

Rafael,

Usa este código y dime que valores te muestra:

MsgInfo( Str( Asc( SubStr( L2Bin( nValor ), 1, 1 ) ) ) + "," + CRLF + ;
Str( Asc( SubStr( L2Bin( nValor ), 2, 1 ) ) ) + "," + CRLF + ;
Str( Asc( SubStr( L2Bin( nValor ), 3, 1 ) ) ) + "," + CRLF + ;
Str( Asc( SubStr( L2Bin( nValor ), 4, 1 ) ) ) )

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 365
Joined: Sat Oct 08, 2005 07:59 PM

Convertir unsigned integer a decimal

Posted: Fri May 16, 2008 07:58 PM

Antonio:
Resultado de pruebas hechas sobre diferentes colores puros:

Rojo: 255,0,0,0
Verde: 0, 255,255,255
Azul: 0,0,0,0
Amarillo: 255,255,255,255
Negro: 0,0,0,0
Blanco: 255,255,255,255

Tú le ves alguna lógica?
Rafael

Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM

Convertir unsigned integer a decimal

Posted: Fri May 16, 2008 08:25 PM

Getpixel(hDC,x,y) usa tres parámetros, no estará por ahí el problema?

Posts: 365
Joined: Sat Oct 08, 2005 07:59 PM

Convertir unsigned integer a decimal

Posted: Fri May 16, 2008 08:32 PM
Creo que no, Alfredo. Esto es un Ocx de manejo de imágenes que estoy utilizando. Se diseñó para funcionar con VB pero -gracias a la ayuda de Antonio- estamos echándolo a andar muy bien con FWH a base de ActiveX.

El problema parece estar en que esa función GetPixelColor(x,y) devuelve una variable de tipo OLE_COLOR. Son 4 bytes unsigned pero hay algo raro en todo eso, probablemente con los dos primeros bits que es lo que complica su lectura.

He encontrado esto que explica algo sobre ese tipo de variable:
http://66.29.204.14/products/imgxasp/docs/ImagingConcepts.html
Típico de Microsoft: Han cambiado hasta el orden de los colores: Ya no es RGB sino BGR!!
Rafael
Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM

Convertir unsigned integer a decimal

Posted: Sat May 17, 2008 12:53 AM

Me imagino que así es, sobre todo considerando el dinamismo de cambios en los formatos que componen las imágenes.

Será que ahora en vez de dos puntos (cartesianos) haya que incluir un formato vectorial (x,y,z,dirección,rumbo,etc), no itento abundar, solo una idea... !?

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM

Convertir unsigned integer a decimal

Posted: Sat May 17, 2008 08:33 AM

Rafael,

Por lo visto hay que usar la función OleTranslateColor() incluida en OLEPRO32.DLL:

http://msdn.microsoft.com/en-us/library/ms694353.aspx

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion