![]() |
AW: Farbwert zu Dezimal
Zitat:
Ich finde den punkt leider nicht wo ich es ändern soll. Habe ich dir doch per PN mitgeteilt ;) Ich meinte damit Draw was funktioniert. Das in VB Daten vorhanden sind siehe Shot. In Delphi nicht. Bei deiner Case 0 Berechnung kommt immer 0 raus. Keine Ahnung warum. Beim Klaus seiner Version kommen werte.. Zitat:
Zitat:
aber nicht wie in VB 255, 254 usw.. Zitat:
7 Seiten und kein Erfolg vielleicht sollten wir es besser doch lassen. Will einfach nicht. gruss |
AW: Farbwert zu Dezimal
Irgendwie finde ich das seltsam.
nehmen wir mal an c wäre hXX und a=h80,dann ware igspectrumdata[x,y]=h800000XX. Also etwas größer als 254,255,265. Da muß noch (implizit) irgendwas anderes passieren. (ich denke da an ROR/ROL??) Gruß K-H |
AW: Farbwert zu Dezimal
Ich habe eine andere Vermutung die ich gerade am testen bin..
Wenn es das ist was ich meine melde ich mich wieder. Kann mir nicht vorstellen das @Michaels Version falsch sein soll da ist irgendwas anderes im argen. gruss |
AW: Farbwert zu Dezimal
Hallo Emil,
schau dir mal #1 genauer an.
Delphi-Quellcode:
Fade, wenn ich es richtig sehe ist ein Single im Bereich 0 .. 1.
d := round(Fade * 255);
Also ist d (ein Integer) im Bereich 0 .. 255 Der auskommentierte Ausdruck
Delphi-Quellcode:
Ergibt immer a = 0
//a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255);
Deine fehlerhafte Umsetzung
Delphi-Quellcode:
ergibt ebenfalls immer a = 0
a := ((SpectrumData2D[X, Y] shl 24) and 255);
Die korrekte Umsetzung
Delphi-Quellcode:
ergibt ebenfalls immer a = 0
a := ((SpectrumData2D[X, Y] shr 24) and 255);
Warum?! Wenn Du einen Byte-Wert um 8 oder mehr Bits shiftest, gleichgültig ob links oder rechts und das Ergebnis mit "and 255" begrenzt wird das Resultat stets 0 sein. Danach machst du
Delphi-Quellcode:
.
a := a - d;
Da a = 0 war ist a jetzt abhängig von d im Bereich -255 .. 0
Delphi-Quellcode:
.
c := SpectrumData2D[X, Y] and RGB(255, 255, 255);
c ist im Bereich 0..255 (identisch mit SpectrumData2D[X, Y])
Delphi-Quellcode:
Das wirst du inzwischen durch den von Klaus01 vorgeschlagenen Code aus #4 ersetzt haben.
if a > 127 then
SpectrumData2D[X, Y] := c or ((a - 256) * $1000000) // hier komm ich nicht klar wegen den $1000000 else SpectrumData2D[X, Y] := c or (a * $1000000); // hier komm ich nicht klar wegen den $1000000
Delphi-Quellcode:
Hier wird (weil a = -255..0) immer der Else-Zweig ausgeführt, was aber belanglos ist, denn SpectrumData2D[X, Y] wird immer = c gesetzt.
if a > 127 then
SpectrumData2D[X, Y] := c or ((a - 256) shl 24) else SpectrumData2D[X, Y] := c or (a shl 24); Warum?! In SpectrumData2D[X, Y] (ein Byte) wird immer das untere Byte des zugewiesenen Wertes gespeichert, das "or (a shl 24)" bzw. "or ((a - 256) shl 24)" verändert das untere Byte von c aber nicht. Da c identisch ist mit SpectrumData2D[X, Y] bleibt (zumindest wenn FEffect = 0 ist) SpectrumData2D unverändert. Komme ich mal zum Schluss. Meine Vermutung ist, dass SpectrumData2D ein Array of Array of UInt32 sein sollte und nicht ein Array of Array of Byte, wie von dir am Anfang von #1 geschrieben und wie auch in deinem Projekt definiert. Ich hab nicht wirklich alle Beiträge gelesen, aber alles was ich las, ließ mich vermuten, dass alle automatisch davon ausgingen dass SpectrumData2D 32Bit-Werte enthält, obwohl Du in der ersten Zeile von #1 schiebst " SpectrumData2D[X, Y] definiert als byte". Sei nicht böse, aber für mich ist dieser Thread Comedy pur. Ach, was mir per Zufall auffiel:
Delphi-Quellcode:
Mit
procedure TSpectrum.SetSymmetrical(const Value: BOOL);
begin FSymmetrical := Value; FillChar(SpectrumData2D[0], sizeof(SpectrumData2D), 0); CreateSpectrumBitmap; CreateMap; end;
Delphi-Quellcode:
willst Du vermutlich alle Bytes in SpectrumData2D = 0 setzen.
FillChar(SpectrumData2D[0], sizeof(SpectrumData2D), 0);
Tust du aber nicht! Deine Erwartung ist sicherlich, dass SizeOf(SpectrumData2D) die Größe des Speicherbereiches von SpectrumData2D ist. Damit hättest Du auch Recht, wenn SpectrumData2D ein statisches Array wäre. Da es sich aber um ein dynamisches Array handelt, ist SizeOf(SpectrumData2D) = 4. |
AW: Farbwert zu Dezimal
. ein 32bit Value and $FF maskiert den 32bit auf ein Byte.
$FFCCDD01 and $FF ($000000FF) ergibt $01 Bit Algebra : 0 and 0 = 0 0 and 1 = 0 1 and 0 = 0 1 and 1 = 1 Grüße Klaus |
AW: Farbwert zu Dezimal
Zitat:
Ich habe früher alles gewusst.. warum auch immer ich es heute nicht mehr weis mag dahingestellt sein spielt auch keine weitere rolle. Du hast es gut erklärt und aufgezeigt wo die Fehler liegen und warum es falsch ist so kann ich damit leben. Die von dir benannten Probleme sind aber mittlerweile Asbach(Vergangenheit, erledigt, behoben) da Michael mich in einer PN schon darauf aufmerksam gemacht hat. Wenigstens ziehst du nicht über mich her ohne aufzuzeigen wo die Probleme liegen. Trotz alledem ob Comedy oder nicht keine eurer Versuche(Wissen? ??) hat irgendeine Verbesserung gebracht. Leider. Die werte sind weiterhin falsch. @Klaus Zitat:
Zitat:
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&)
Zitat:
Code:
Fade ist ein property
Dim d As Long
Code:
Du solltest stets dir den vergleich vorher ansehen deine Berechnung erstellen und dann belegen warum etwas falsch ist, sein soll,
Public Property Let Fade(ByVal fNewValue As Single)
Public Property Get Fade() As Single 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. 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. Versuch doch mal ein Projekt zu übersetzen das zu 80 Prozent aus nur 1 DatenTyp besteht. :) Das hier war insbesondere schwierig da es hier ums eingemachte ging siehe FFT.. kennst du die Datentypen nicht fällst du auf die Nase. Zitat:
gruss |
AW: Farbwert zu Dezimal
Zitat:
Grüße Klaus |
AW: Farbwert zu Dezimal
Zitat:
gruss |
AW: Farbwert zu Dezimal
Zitat:
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:
Ich hab das nur ausgeführt um aufzuzeigen warum das spätere
Delphi-Quellcode:
zu einem Wert im Bereich -255 .. 0 führt-
a := a - d
Zitat:
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:
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:
Selbstverständlich musst Du dann überall dort, wo Du auf SpectrumData2D zugreifst, Änderungen vornehmen. Zitat:
|
AW: Farbwert zu Dezimal
Zitat:
erwartet ein zusammenhängendes Array wie soll ich das sonst machen als wie von Neutral General vorgeschlagen. Das 2 Dimensionale zu einen eindimensionales konvertieren.. Das anschließend das 2 Dimensionale nicht mehr das widergibt was es eigentlich sollte ist mir auch klar. Nur bitte schön wie ändern wenn es nicht erlaubt ist. Danke für deine Ausführung. Zitat:
Zitat:
Daher schien mir das als beste Lösung. Zitat:
Den Fehler warum es abgestürzt ist habe ich ebenfalls gefunden. Trotz alledem will es nicht so wie es soll. Zitat:
Range error, Überlauf Fehler usw.. Es stimmt definitiv noch nicht. Die anderen hier die ich getestet habe führen zu keinen Werten trotz des neuen DatenTyp LongWord. Habe das jetzt erstmal auf Seite gelegt. Source ist ja oben, wenn es jemand integrieren will muss er es selbst bewerkstelligen. Ich für meinen Teil bekomme das nicht gebacken. Es macht auch nur sinn wenn man das Projekt herunter lädt und es direkt damit testet imaginär etwas in den Raum stellen bringt nicht viel weil es in dem fall nur Vermutungen sind und nicht wirklich weiterhelfen.. auch wenn es gut gemeint ist. Mitunter ist die Praxis etwas anderes als die Theorie. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz