AW: Farbwert zu Dezimal
Delphi-Quellcode:
Erebnis:
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; AB AB
Delphi-Quellcode:
Ergebnis:
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. AB 00 Grüße Klaus |
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 |
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. |
AW: Farbwert zu Dezimal
Zitat:
unsigned - signend und Überläufe sind die Folge, hin und her Konvertierungen. Zitat:
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:
ansonsten gibt es Überläufe. gruss |
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?
|
AW: Farbwert zu Dezimal
Zitat:
Delphi-Quellcode:
a + (Int64((c and $FF000000) div $1000000) And 255);
Daher glaube ich nicht das man hier DWORD nehmen kann. Oder? gruss |
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 |
AW: Farbwert zu Dezimal
gibt doch mal
Zitat:
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 |
AW: Farbwert zu Dezimal
Zitat:
Ausserdem
Delphi-Quellcode:
sollte das gleiche sein wie der obige Ausdruck. (hoffe ich hab mich bei den Bits nicht verzählt)
a+(c shr 6)
[ggf muß Du noch mit $FF maskieren] Gruß K-H |
AW: Farbwert zu Dezimal
Zitat:
[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. |
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