Convertir unsigned integer a decimal

Convertir unsigned integer a decimal

Postby Rafael Clemente » 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
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Postby Antonio Linares » Fri May 16, 2008 4: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42160
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Rafael Clemente » Fri May 16, 2008 5: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
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Postby Antonio Linares » Fri May 16, 2008 6: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42160
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Rafael Clemente » Fri May 16, 2008 7: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
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Postby Alfredo Arteaga » Fri May 16, 2008 8:25 pm

Getpixel(hDC,x,y) usa tres parámetros, no estará por ahí el problema?
User avatar
Alfredo Arteaga
 
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico

Postby Rafael Clemente » Fri May 16, 2008 8: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
User avatar
Rafael Clemente
 
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Postby Alfredo Arteaga » 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... !?
User avatar
Alfredo Arteaga
 
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico

Postby Antonio Linares » Sat May 17, 2008 8: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
User avatar
Antonio Linares
Site Admin
 
Posts: 42160
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 48 guests