GdipCreateSolidFill ConvertColor(vbBlack, 100, 0) ergibt auf manchen Computer Hellgrau

07/05/2011 - 11:54 von Hermie | Report spam
Hallo!

Weiß jemand, warum
GdipCreateSolidFill ConvertColor(vbBlack, 100, 0)
auf manchen Computern (aber wirklich nur auf manchen) Hellgrau statt
Schwarz ergibt?

Meine Function ConvertColor sieht so aus:

Public Function ConvertColor(Color As Long, Opacity As Long, propVal As
Long) As Long

Dim BGRA(0 To 3) As Byte
If Opacity < -100 Then
Opacity = 100
ElseIf Opacity > 100 Then
Opacity = 100
End If
BGRA(3) = CByte((Abs(Opacity) / 100) * 255)
BGRA(0) = ((Color \ &H10000) And &HFF)
BGRA(1) = ((Color \ &H100) And &HFF)
BGRA(2) = (Color And &HFF)
CopyMemory propVal, BGRA(0), 4&
ConvertColor = propVal

End Function

Danke!

Hermie
 

Lesen sie die antworten

#1 Schmidt
07/05/2011 - 14:11 | Warnen spam
"Hermie" schrieb im Newsbeitrag
news:iq350t$koj$

Weiß jemand, warum
GdipCreateSolidFill ConvertColor(vbBlack, 100, 0)
auf manchen Computern (aber wirklich nur auf manchen)
Hellgrau statt Schwarz ergibt?

Meine Function ConvertColor sieht so aus:

Public Function ConvertColor(Color As Long, Opacity As Long,
propVal As Long) As Long

Dim BGRA(0 To 3) As Byte
If Opacity < -100 Then
Opacity = 100
ElseIf Opacity > 100 Then
Opacity = 100
End If
BGRA(3) = CByte((Abs(Opacity) / 100) * 255)
BGRA(0) = ((Color \ &H10000) And &HFF)
BGRA(1) = ((Color \ &H100) And &HFF)
BGRA(2) = (Color And &HFF)
CopyMemory propVal, BGRA(0), 4&
ConvertColor = propVal

End Function



Also an den Interna Deiner ConvertColor-Routine
liegt's denk ich nicht - zumindest nicht, wenn Du
mit voller Opacity (100, übersetzt in 255) arbeitest.

Ansonsten (falls GDI+ mit premultiplied Alpha arbeitet),
müsste man da ggfls. noch was ergànzen (würde aber
nur dann nötig sein, wenn Du mit Opacity-Werten < 100
(also übersetzt < 255) arbeitest.

Ansonsten (bei solid-Colors) gehört in BGRA(3) der
Wert 255 - und auf den restlichen Bytes (den Farbanteilen)
wird dann kein Premultiplying nötig (die gehen in dem Fall
mit ihren "vollen Werten" ein).

Ich denke, dass irgendwas "weiter hinten" nicht richtig
klappt - oder von Dir angesprochen wird per GDI+.

Dein Benutzen des letzten ByRef-Parameters sieht
vielleicht noch etwas eigenartig aus - den würde ich
Optional machen - und dann einfach nicht angeben
bzw. besetzen, im Falle Du brauchst kein Duplikat.

Derzeit übergibst Du mit:
ConvertColor(vbBlack, 100, 0)
im letzten Parameter einen (temporàren) Integer-
Wert (16bit, also keinen Long).

Hab jetzt nicht getestet, ob VB vielleicht dadurch "ins Schleudern"
kommt, glaub jedoch nicht (AutoConversion làsst grüßen) - aber
vielleicht doch besser:
ConvertColor(vbBlack, 100, 0&)
benutzen, um jede Eventualitàt auszuschließen - oder wie gesagt per:
ConvertColor(vbBlack, 100)
falls Du im Funktions-Header vor dem letzten Param Optional
voranstellst - dann besetzt VB automatisch einen leeren
Temp-Param (mit dem passenden Long-Typ).

Olaf

Ähnliche fragen