Thema: Delphi Farbwert zu Dezimal

Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.058 Beiträge
 
Delphi XE2 Professional
 
#69

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 17:26
Zitat:
.
Zitat:
//a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255);
Ergibt immer a = 0
Rein Rechnerisch oder deine Annahme
Denn das ist original von VB und die werte ändern sich ständig. (Weil nicht als Byte sondern als Long definiert)
Code:
Dim imgSpectrumData() As Long
Dim r As Long, g As Long, b As Long, a As Long
Code:
a = (((imgSpectrumData(x, y) And &HFF000000) \ &H1000000) And &HFF&)
Rechnerisch!
Natürlich unter der Voraussetzung dass SpectrumData2D[X, Y] ein Byte ist (wie von Dir angegeben und wie auch in Deinem Projekt deklariert)
Beispiel:
SpectrumData2D[X, Y] = $37
Code:
               $00000037
and           $FF000000
=             $00000000
div           $1000000 
=             $00000000
and           $000000FF
=             $00000000

Zitat:
Zitat:
d := round(Fade * 255);Fade, wenn ich es richtig sehe ist ein Single im Bereich 0 .. 1.
Also ist d (ein Integer) im Bereich 0 .. 255
Wo ist der Widerspruch? Oder das Problem
Nirgends ist da ein Widerspruch oder Problem.
Ich hab das nur ausgeführt um aufzuzeigen warum das spätere a := a - d zu einem Wert im Bereich -255 .. 0 führt-

Zitat:
Code:
Dim d As Long
Fade ist ein property
Code:
Public Property Let Fade(ByVal fNewValue As Single)
Public Property Get Fade() As Single
Du solltest stets dir den vergleich vorher ansehen deine Berechnung erstellen und dann belegen warum etwas falsch ist, sein soll,
wenn genau das im Original alles Funktioniert was du hier als falsch unterstellst. (OK ich habe irrtümlich Byte definiert deshalb ist der wert so wie du sagst)
Keine Ahnung was das mit Comedy zu tun hat.
Genau das habe ich getan.
Ich habe mir das genau angesehen und aufgezeigt, warum (im Falle FEffect=0) SpectrumData2D stets unverändert bleibt, was sicher nicht der Sinn der vielen Berechnungen ist.

Zitat:
Zitat:
Meine Vermutung ist, dass SpectrumData2D ein Array of Array of UInt32 sein sollte und nicht ein Array of Array of Byte
Ja Vermutung nur mit deinem Cardinal in Verbindung mit Bytes a,r,g,b stürzt die Anwendung ab.
Du erstellst (in uSpectrum.TSpectrum.CreateSpectrumBitmap) mit der Funktion Gdip_CreateBitmapFromScan0 eine Bitmap und übergibst der Funktion als Pixelformat "PixelFormat32bppARGB" und als Pointer auf die Farbinformationen "PByte(SpectrumData1D[0])", wobei
SpectrumData1D die gleichen Daten enthält wie SpectrumData2D.

PixelFormat32bppARGB sagt, dass die Farbinformationen 32 Bits je Pixel enthalten, je 8 Bits für Alpha, Rot, Grün, Blau.
SpectrumData1D enthält aber nur 1 Byte je Pixel.
Und das kommt Dir nicht komisch vor?

Du sagst auch, dass im Original VB-Code imgSpectrumData() As Long definiert ist.
Ungeachtet dessen definierst Du SpectrumData2D als Array of Array of Byte. (Weil der Parameter Scan0 als PByte definiert ist).
Und auch das kommt Dir nicht komisch vor?

Zu
Zitat:
Ja Vermutung nur mit deinem Cardinal in Verbindung mit Bytes a,r,g,b stürzt die Anwendung ab.
Na ja, einfach nur die Definition von SpectrumData2D von Byte auf Cardinal ändern, reicht natürlich nicht.
Selbstverständlich musst Du dann überall dort, wo Du auf SpectrumData2D zugreifst, Änderungen vornehmen.

Zitat:
Ich bin davon ausgegangen das wenn die Funktion GdipCreateBitmapFromScan0 als Übergabe von Scan0 einen Pointer of PByte erwartet das es letztendlich sinnvoll wäre das Array direkt als Byte zu definieren.
Die Nachfolgenden Funktionen wie Release hatte ich zu diesen Zeitpunkt noch nicht übersetzt, konnte also zu dem Zeitpunkt nicht wissen ob der der Datentyp so korrekt ist.
Wie gesagt in VB ist eh fast alles Long.
Es spricht ja auch nichts dagegen, SpectrumData2D auf Basis Bytes zu definieren, allerdings nicht nur 1 Byte je Pixel sondern 4 Bytes (= 1 UInt32).
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat