AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Farbwert zu Dezimal

Ein Thema von EWeiss · begonnen am 28. Mär 2019 · letzter Beitrag vom 3. Apr 2019
Antwort Antwort
Seite 2 von 8     12 34     Letzte » 
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.292 Beiträge
 
Delphi XE7 Professional
 
#11

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 12:02
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.577 Beiträge
 
Delphi 2010 Architect
 
#12

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 12:04
Ja Klaus..
Ich habe nicht behauptet das du falsch liegst sondern das es so im Original steht es ist mir nur nicht aufgefallen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.032 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 13:06
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.577 Beiträge
 
Delphi 2010 Architect
 
#14

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 18:37
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

Geändert von EWeiss (28. Mär 2019 um 18:39 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: Region Bern CH
289 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 19:17
Longword gibt's ja bei Delphi auch: Bei 4 Bytes (A,R,G,B) könntest du doch auch DWORD als Datentyp nutzen?
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.577 Beiträge
 
Delphi 2010 Architect
 
#16

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 19:26
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.
a + (Int64((c and $FF000000) div $1000000) And 255);

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

gruss
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.292 Beiträge
 
Delphi XE7 Professional
 
#17

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 19:34
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.577 Beiträge
 
Delphi 2010 Architect
 
#18

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 19:38
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

Geändert von EWeiss (28. Mär 2019 um 20:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.326 Beiträge
 
Delphi 7 Personal
 
#19

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 20:25
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.
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 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.577 Beiträge
 
Delphi 2010 Architect
 
#20

AW: Farbwert zu Dezimal

  Alt 28. Mär 2019, 20:36
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.
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 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

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.
SpectrumData2D[X, Y] := c or ((a - 256) shl 24)

Obwohl schon geändert..

DWord ist also der falsche DatenTyp!

gruss

Geändert von EWeiss (11. Jul 2019 um 15:56 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf