AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Farbwert zu Dezimal

Ein Thema von EWeiss · begonnen am 28. Mär 2019 · letzter Beitrag vom 3. Apr 2019
Antwort Antwort
Seite 7 von 8   « Erste     567 8      
EWeiss
(Gast)

n/a Beiträge
 
#61

AW: Farbwert zu Dezimal

  Alt 29. Mär 2019, 17:38
Zitat:
hast du den Code offensichtlich inzwischen geändert und die Effekte werden wie du es erwartest gezeichnet. Ich gratuliere dir zum fertigen Programm .
Nein werden sie nicht.

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:
Debug Output: < 127 -1711276032 Process TrickSpectrum.exe (15616)
Debug Output: < 127 -1711276032 Process TrickSpectrum.exe (15616)
Debug Output: < 127 -1711276032 Process TrickSpectrum.exe (15616)
Debug Output: < 127 -1711276032 Process TrickSpectrum.exe (15616)
Zitat:
Debug Output: > 127 -2147483648 Process TrickSpectrum.exe (2400)
Debug Output: > 127 -2147483648 Process TrickSpectrum.exe (2400)
Debug Output: > 127 -2147483648 Process TrickSpectrum.exe (2400)
Debug Output: > 127 -2147483648 Process TrickSpectrum.exe (2400)
und immer der gleiche wert.

aber nicht wie in VB 255, 254 usw..
Der Code von VB lässt sich definitiv auf Delphi umlegen und das ganz ohne Tricks.
Wo ist der Spezialist der das anscheinend kann? Sorry konnte ich mir nicht verkneifen.

7 Seiten und kein Erfolg vielleicht sollten wir es besser doch lassen.
Will einfach nicht.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#62

AW: Farbwert zu Dezimal

  Alt 29. Mär 2019, 20:22
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#63

AW: Farbwert zu Dezimal

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

Geändert von EWeiss (29. Mär 2019 um 21:05 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

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

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 04:05
Hallo Emil,
schau dir mal #1 genauer an.

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

Der auskommentierte Ausdruck
//a := (((SpectrumData2D[X, Y] and $FF000000) div $1000000) and 255); Ergibt immer a = 0
Deine fehlerhafte Umsetzung
a := ((SpectrumData2D[X, Y] shl 24) and 255); ergibt ebenfalls immer a = 0
Die korrekte Umsetzung
a := ((SpectrumData2D[X, Y] shr 24) and 255); ergibt ebenfalls immer a = 0
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
a := a - d; .
Da a = 0 war ist a jetzt abhängig von d im Bereich -255 .. 0

c := SpectrumData2D[X, Y] and RGB(255, 255, 255); .
c ist im Bereich 0..255 (identisch mit SpectrumData2D[X, Y])

Delphi-Quellcode:
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
Das wirst du inzwischen durch den von Klaus01 vorgeschlagenen Code aus #4 ersetzt haben.
Delphi-Quellcode:
if a > 127 then
   SpectrumData2D[X, Y] := c or ((a - 256) shl 24)
else
   SpectrumData2D[X, Y] := c or (a shl 24);
Hier wird (weil a = -255..0) immer der Else-Zweig ausgeführt, was aber belanglos ist, denn SpectrumData2D[X, Y] wird immer = c gesetzt.
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:
procedure TSpectrum.SetSymmetrical(const Value: BOOL);
begin
  FSymmetrical := Value;
  FillChar(SpectrumData2D[0], sizeof(SpectrumData2D), 0);
  CreateSpectrumBitmap;
  CreateMap;
end;
Mit FillChar(SpectrumData2D[0], sizeof(SpectrumData2D), 0); willst Du vermutlich alle Bytes in SpectrumData2D = 0 setzen.
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#65

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 07:22
. 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
Klaus
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#66

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 08:12
Zitat:
Sei nicht böse, aber für mich ist dieser Thread Comedy pur.
Kein Problem bin ich nicht.
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:
. ein 32bit Value and $FF maskiert den 32bit auf ein Byte.
$FFCCDD01 and $FF ($000000FF) ergibt $01
Es wäre nett wenn du mir sagen würdest auf was du dich beziehst.

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&)
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

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.


Zitat:
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.
Wurde schon lange behoben.

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:
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.

gruss

Geändert von EWeiss (30. Mär 2019 um 12:21 Uhr)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#67

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 08:22
@Klaus
Zitat:
. ein 32bit Value and $FF maskiert den 32bit auf ein Byte.
$FFCCDD01 and $FF ($000000FF) ergibt $01
Es wäre nett wenn du mir sagen würdest auf was du dich beziehst.
Hab' mich verlesen/ es falsch verstanden.
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#68

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 08:24
@Klaus
Zitat:
. ein 32bit Value and $FF maskiert den 32bit auf ein Byte.
$FFCCDD01 and $FF ($000000FF) ergibt $01
Es wäre nett wenn du mir sagen würdest auf was du dich beziehst.
Hab' mich verlesen/ es falsch verstanden.
Grüße
Klaus
Ach so ok Danke

gruss

Geändert von EWeiss (30. Mär 2019 um 08:33 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

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

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 16: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
EWeiss
(Gast)

n/a Beiträge
 
#70

AW: Farbwert zu Dezimal

  Alt 30. Mär 2019, 16:49
Zitat:
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?
Klar kommt mir das komisch vor wollte ja auch das 2 Dimensionale Array direkt an Gdip_CreateBitmapFromScan0 übergeben nur Gdip_CreateBitmapFromScan0
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:
Nirgends ist da ein Widerspruch oder Problem.
JO habe ich im nachhinein auch so verstanden du bist ja von Byte ausgegangen.

Zitat:
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?
Nein kam mir nicht komisch vor aus dem Grund weil ich nicht immer hin und her konvertieren will wenn es nicht nötig ist.
Daher schien mir das als beste Lösung.

Zitat:
Es spricht ja auch nichts dagegen, SpectrumData2D auf Basis Bytes zu definieren, allerdings nicht nur 1 Byte je Pixel sondern 4 Bytes (= 1 UInt32).
Habe es als LongWord definiert und es kommen nun auch Daten.. ist also nicht mehr 0
Den Fehler warum es abgestürzt ist habe ich ebenfalls gefunden.

Trotz alledem will es nicht so wie es soll.

Zitat:
Selbstverständlich musst Du dann überall dort, wo Du auf SpectrumData2D zugreifst, Änderungen vornehmen.
Nun mit der Originalen Version von VB bekomme ich das nicht gebacken.
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

Geändert von EWeiss (30. Mär 2019 um 18:25 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 8   « Erste     567 8      


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 12:28 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