Delphi-PRAXiS
Seite 2 von 8     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbwert zu Dezimal (https://www.delphipraxis.net/200198-farbwert-zu-dezimal.html)

Klaus01 28. Mär 2019 12:02

AW: Farbwert zu Dezimal
 
Delphi-Quellcode:
var
  test32Bit: cardinal;
  test8Bit: Byte;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    test32Bit := $ABCDEF89;
    test8Bit := (test32Bit shr 24) and $FF;
    writeLn(intToHex(test8Bit));

    test32Bit := $ABCDEF89;
    test8Bit := ((test32Bit and $FF000000) div $1000000) and 255;
    writeln(intToHex(test8Bit));
    readLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
Erebnis:
AB
AB

Delphi-Quellcode:
var
  test32Bit: cardinal;
  test8Bit: Byte;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    test32Bit := $ABCDEF89;
    test8Bit := (test32Bit shr 24) and $FF;
    writeLn(intToHex(test8Bit));

    test32Bit := $ABCDEF89;
    test8Bit := ((test32Bit and $FF000000) div $1000000) and 256;
    writeln(intToHex(test8Bit));
    readLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Ergebnis:
AB
00

Grüße
Klaus

EWeiss 28. Mär 2019 12:04

AW: Farbwert zu Dezimal
 
Ja Klaus..
Ich habe nicht behauptet das du falsch liegst sondern das es so im Original steht es ist mir nur nicht aufgefallen. :)

gruss

Neutral General 28. Mär 2019 13:06

AW: Farbwert zu Dezimal
 
Hab dem Thread grad nur überflogen aber ich gehe davon aus, dass es immer noch nicht wirklich klappt?
Denn wenn SpectrumData2D ein Byte-Array (:!:) ist und du 8 oder mehr Bits in irgendeine Richtung shiftest kommt immer 0 raus!

Was ist jetzt genau in SpectrumData2D enthalten? RGBA-Daten, 32 Bit Farbtiefe?
In dem Fall würden SpectrumData2D[X, Y], SpectrumData2D[X+1, Y], SpectrumData2D[X+2, Y] und SpectrumData2D[X+3, Y] zusammen den RGAB-Wert des X-ten Pixels der Y-ten Zeile darstellen.
Weiß jetzt nicht zu 100% wie die Reihenfolge der Farbwerte ist, aber der Alphawert steht entweder in SpectrumData2D[X, Y] oder SpectrumData2D[X+3, Y].
In dem Fall ist gar keine Bitschieberei notwendig. Falls meine Annahmen falsch sind, dann erklär bitte nochmal was für Daten genau vorliegen.

EWeiss 28. Mär 2019 18:37

AW: Farbwert zu Dezimal
 
Zitat:

In dem Fall ist gar keine Bitschieberei notwendig. Falls meine Annahmen falsch sind, dann erklär bitte nochmal was für Daten genau vorliegen.
Ich muss schieben bzw.. möchte es umlegen weil ich auf der Basis Probleme mit der Berechnung habe.
unsigned - signend und Überläufe sind die Folge, hin und her Konvertierungen.

Zitat:

Was ist jetzt genau in SpectrumData2D enthalten? RGBA-Daten, 32 Bit Farbtiefe?
Nach dem erstellen gar nichts die Pixel (Farben werden durch die jeweiligen Effekte erst generiert.)

Das Bitmap wird erstellt in 32Bit und ARGB (PixelFormat32bppARGB) deshalb kann man davon ausgehen das es 32Bit mit ARGB Daten sind.
Wie habe ich anhand der Codeschnipsel der case ja schon gezeigt.

Zitat:

Denn wenn SpectrumData2D ein Byte-Array () ist
Ist in VB als Long definiert kann also vieles sein.. Wenn man sich die ganze Konvertierungen sparen will bietet sich am besten Int64 an
ansonsten gibt es Überläufe.

gruss

Michael II 28. Mär 2019 19:17

AW: Farbwert zu Dezimal
 
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

EWeiss 28. Mär 2019 19:26

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von Michael II (Beitrag 1429041)
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

Hier kann man ja sehen das ich auf Int64 Casten musste weil der zu berechnende Wert nicht in einen Integer passt.
Delphi-Quellcode:
a + (Int64((c and $FF000000) div $1000000) And 255);


Daher glaube ich nicht das man hier DWORD nehmen kann. Oder?

gruss

Klaus01 28. Mär 2019 19:34

AW: Farbwert zu Dezimal
 
Nö, das bleiben 32Bit Werte, wenn c ein 32Bit Wert ist.

32Bit and $FF000000 bleibt ein 32Bit Wert, c wird nur mit $FF000000 maskiert.
Anschließend 24Bit nach rechts verschoben. Links von dem verschoben Wert stehen Nullen.
Es ist aber weiterhin ein 32Bit Wert.
mit and $FF wird er zu einem Byte.

Grüße
Klaus

EWeiss 28. Mär 2019 19:38

AW: Farbwert zu Dezimal
 
gibt doch mal
Zitat:

a + (Int64((c and $FF000000) div $1000000) And 255);
in deinem Konsolen Programm ein Ohne Int64 was sagt der Compiler?
Definiere aber vorher c als Integer.

Oder auf was wolltest du hinaus?

In VB bei seiner Berechnung bekomme ich auch negative werte!
Kann DWORD = Cardinal = ColorRef minus werte? Nein und genau das ist mein Problem hier wieder den richtigen DatenTyp zu finden der mit seinen Berechnungen übereinstimmt.
Ist das gleiche wie mit dem FFT der mag unter VB seine Berechtigung haben ist aber unter Delphi so nicht anwendbar.
Wie gesagt es gibt hier fast nur Long..

Deshalb möchte ich alle HEX werte auf normale Farbberechnung umlegen.
Ich muss @Neutral General recht geben Byte ist definitiv der falsche DatenTyp.


gruss

p80286 28. Mär 2019 20:25

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von EWeiss (Beitrag 1429042)
Zitat:

Zitat von Michael II (Beitrag 1429041)
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

Hier kann man ja sehen das ich auf Int64 Casten musste weil der zu berechnende Wert nicht in einen Integer passt.
Delphi-Quellcode:
a + (Int64((c and $FF000000) div $1000000) And 255);


Daher glaube ich nicht das man hier DWORD nehmen kann. Oder?

gruss

Wenn ich ich jetzt nicht verzählt habe dann ist $FF000000 und $1000000 ein 24Bit Wert, warum sollten die beiden nicht mit einem unsigned 32Bit Typ abgedeckt werden können?
Ausserdem
Delphi-Quellcode:
a+(c shr 6)
sollte das gleiche sein wie der obige Ausdruck. (hoffe ich hab mich bei den Bits nicht verzählt)
[ggf muß Du noch mit $FF maskieren]

Gruß
K-H

EWeiss 28. Mär 2019 20:36

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von p80286 (Beitrag 1429047)
Zitat:

Zitat von EWeiss (Beitrag 1429042)
Zitat:

Zitat von Michael II (Beitrag 1429041)
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?

Hier kann man ja sehen das ich auf Int64 Casten musste weil der zu berechnende Wert nicht in einen Integer passt.
Delphi-Quellcode:
a + (Int64((c and $FF000000) div $1000000) And 255);


Daher glaube ich nicht das man hier DWORD nehmen kann. Oder?

gruss

Wenn ich ich jetzt nicht verzählt habe dann ist $FF000000 und $1000000 ein 24Bit Wert, warum sollten die beiden nicht mit einem unsigned 32Bit Typ abgedeckt werden können?
Ausserdem
Delphi-Quellcode:
a+(c shr 6)
sollte das gleiche sein wie der obige Ausdruck. (hoffe ich hab mich bei den Bits nicht verzählt)
[ggf muß Du noch mit $FF maskieren]

Gruß
K-H

Weil der Compiler diese Meldung ausspuckt.
[DCC Warning] uSpectrum.pas(843): W1024 Combining signed and unsigned types - widened both operands

Delphi-Quellcode:
a := a + (((c and $FF000000) div $1000000) And 255);


SpectrumData2D Array als DWord definiert
a,r,g,b als DWord definiert.

Auch wenn es nur Warnungen sind sie verfälschen das Endergebnis.
Bei der Ausführung gibt es eine Range check error weil DWord nun mal keine negativen werte verträgt.

Und besagten Integerüberlauf.
Delphi-Quellcode:
SpectrumData2D[X, Y] := c or ((a - 256) shl 24)


Obwohl schon geändert..

DWord ist also der falsche DatenTyp!

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.
Seite 2 von 8     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz