Delphi-PRAXiS
Seite 8 von 8   « Erste     678   

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)

Amateurprofi 1. Apr 2019 23:16

AW: Farbwert zu Dezimal
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Emil.
Kann sein ich habe da etwas gefunden, was ein Grund für Exceptions sein könnte.
Am Ende von #64 schrieb ich:

Zitat:

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.
Schon als ich das schrieb hatte ich das Gefühl dass da noch mehr ist und habe das deshalb noch mal überprüft.
Wenn du an FillChar SpectrumData2D[0] als StartAdresse übergibst, dann werden nicht die Daten in SpectrumData2D[0] gelöscht, sondern die in SpectrumData2D enthaltenen dynamischen Arrays, beginnend mit SpectrumData2D[0].
Bei Count=4 wird das Array SpectrumData2D[0] zerstört und wenn dann später darauf zugegriffen wird hagelt es Exceptions.
Außerdem wird ein Memory Leak erzeugt.

Setz mal einen Breakpoint auf die Zeile mit FillChar(SpectrumData2D[0], sizeof(SpectrumData2D), 0);
Wenn dann dort angehalten wird geh mit der Maus auf SpectrumData2D und schau dir an, wie das dargestellt wird.
Dann führe das FillChar mit F7 aus und danach gehe wieder auf SpectrumData2D.
In der anhängenden Abbildung siehst du wie es vor und nach Ausführung von SpectrumData2D ist.
Bei SpectrumData2D[0] kannst du sehen, dass nach dem FillChar keine Daten mehr da sind.
Ob das jetzt die Ursache für alle Probleme ist weiß ich nicht, aber zumindest ist das eine der Ursachen.

EWeiss 2. Apr 2019 05:42

AW: Farbwert zu Dezimal
 
@Amateurprofi
Danke daran kann es nicht liegen denn dieser Eintrag existiert nicht mehr.

Delphi-Quellcode:
{$REGION 'SetSymmetrical'}

procedure TSpectrum.SetSymmetrical(const Value: BOOL);
begin

  FSymmetrical := Value;

  CreateSpectrumBitmap;
  CreateMap;
end;
{$ENDREGION}
Es hat gekracht nach der Änderung zu LongWord weil der Pointer auf SpectrumData2D falsch übergeben worden ist
Alle hier bisher vorgestellten Lösungen geben keine Daten zurück alles ist leer ausgenommen davon die Originale HEX Funktion.
Hier bestehen jedoch mehrere Probleme: Overflow, Range check error, signed und unsigned typen werden gemischt.
Deshalb wollte ich das ganze auf Dezimal umlegen was leider nicht funktioniert wie man sieht.

Vorher
Delphi-Quellcode:
  if GDIP_CreateBitmapFromScan0(w, rc.Bottom, w * 4, PixelFormat32bppARGB, PByte
     (SpectrumData1D[0]), imgSpectrum) <> OK then
Nachher
Delphi-Quellcode:
  if GDIP_CreateBitmapFromScan0(w, rc.Bottom, w * 4, PixelFormat32bppARGB, PByte
     (@SpectrumData1D[0]), imgSpectrum) <> OK then
Das einzige was es bzg. FillChar noch gibt ist diese Zeile.
Ob es zwingend notwendig ist die vorherigen Daten zu Nullen mag dahin gestellt sein.
Ich mache es um vorher ermittelte werte im Speicher zu löschen damit beim Rendern keine Überbleibsel zurück bleiben was die Darstellung verändern könnte.
Delphi-Quellcode:
  FillChar(Spectrum[0], Length(Spectrum) * sizeof(TComplex), 0); // <<<<

  ToComplex(Wav, Spectrum);

  FFT(Spectrum);
Bin mir auch nicht sicher ob die von @Neutral General verwendete Funktion das 2D Array zu 1D Array zu konvertieren der richtige weg ist.
Man kann mit ihm leider unvoreingenommen nicht Diskutieren. Siehe
Bits vom Type Array of TBits ist Hundertfach bewährt nichts besonderes und man trifft immer wieder auf dieser oder ähnlicher Herangehensweise.

Normalerweise würde ich die länge des Arrays so übergeben wenn man davon ausgeht das es beim Start so oder so leer ist.
Ich erstelle ein HDib vom HBitmap oder DC.
Delphi-Quellcode:
  if hBmp <> 0 then
    hDIB := hBmp
  else
    hDIB := GetBitmapFromDC(DC);

Dann hole ich mir das Object über
Delphi-Quellcode:
GetObject(hDIB, sizeof(bm), @bm);


weise dem Header bmiHeader die werte zu
Delphi-Quellcode:
bi.bmiHeader.biSize := sizeof(bi.bmiHeader)


errechne die Bitmap länge anhand der vorher zugewiesenen werte
Delphi-Quellcode:
BitmapLength := bm.bmWidth * bm.bmHeight * 4;


redimensionier mein Array of TBytes.
Delphi-Quellcode:
    SetLength(bmpBits, BitmapLength);


hole die bits und kopiere sie in mein 1D Array vom Type TBytes
Delphi-Quellcode:
    GetDIBits(DC, hDIB, 0, bm.bmHeight, @bmpBits[0], bi, DIB_RGB_COLORS);


erst dann erstelle ich das Bitmap über
Delphi-Quellcode:
      if GdipCreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, bm.bmWidth * 4, PixelFormat32bppARGB,
        @bmpBits[0], lpImg) = OK then
Glaube es ist besser wenn die Leute die den Effekt haben möchten es selbst implementieren anhand ihres Wissensstand.
Dann muss ich mich nicht mehr damit rumärgern.

Danke für deine Analyse..
Bei bedarf kann ich gerne die aktuelle Version mit alter Release HEX Funktion hochladen.

PS:
Aber nochmal.. Nein es ist keine Comedy auch wenn es den Anschein hat.
Warum gehen denn alle hier vorgeschlagenen Lösungen ins leere? Gute frage oder?
Keine variante die hier von Spezialisten ? erstellt, vorgestellt wurde funktioniert warum wohl? Weil es nun mal nicht so einfach ist.
Das ist kein Vorwurf (Bin über Hilfe Dankbar) aber eine Feststellung.
Leider sind hier einige Leute sehr überheblich einen Unfähigkeit vorwerfen und am ende selbst nichts auf die reihe kriegen.

gruss

TiGü 2. Apr 2019 09:31

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von EWeiss (Beitrag 1429296)
@Amateurprofi
Danke daran kann es nicht liegen denn dieser Eintrag existiert nicht mehr.

Delphi-Quellcode:
{$REGION 'SetSymmetrical'}

procedure TSpectrum.SetSymmetrical(const Value: BOOL);
begin

  FSymmetrical := Value;

  CreateSpectrumBitmap;
  CreateMap;
end;
{$ENDREGION}

Es wäre natürlich praktisch für diejenigen die noch (!) helfen wollen, wenn du deine Änderungen und Anpassungen immer aktuell halten würdest, so dass man sich die doppelte Mühe sparen kann.

In dem anderen Thread - es ist übrigens für Außenstehende und neue Leute im Forum nicht ersichtlich, worauf sich dein Problem hier in diesem Thread bezieht - kann man bisher nur Version 1.0.2.0 herunterladen.
Dieser Versionsstand beinhaltet noch den von Amateurprofi gefundenen Fehler.
Für die Nachwelt:
https://www.delphipraxis.net/200135-...isualizer.html

Es wäre für andere übrigens einfacher zu helfen, wenn der Visualizer noch die Möglichkeit böte eine Wave-Datei direkt zu öffnen, abzuspielen und zu visualisieren.
Ich habe zwei, drei Minuten erfolglos mit den Windows-Aufnahmegeräten herumprobiert, aber außer leises Rauschen wurde nichts angezeigt (kurzes Flackern und blinken im Kreis).
Für mehr fehlt mir die Zeit und Motivation.

Du solltest die Eingangshürden so gering wie möglich halten, wenn du wirklich Hilfe erwartest.
Dein NonVCL-Quelltext weicht stark von dem ab, was der durchschnittliche Delphiprogrammierer gewohnt ist.
Daher wäre es vorteilhaft, wenn du den Einstieg so bequem wie möglich gestaltest.

Zitat:

Zitat von EWeiss (Beitrag 1429296)
Leider sind hier einige Leute sehr überheblich einen Unfähigkeit vorwerfen und am ende selbst nichts auf die reihe kriegen.

:roll:

EWeiss 2. Apr 2019 12:02

AW: Farbwert zu Dezimal
 
Zitat:

Es wäre natürlich praktisch für diejenigen die noch (!) helfen wollen, wenn du deine Änderungen und Anpassungen immer aktuell halten würdest, so dass man sich die doppelte Mühe sparen kann.
Wurde erledigt neue aktuelle Version ist oben.

Zitat:

Es wäre für andere übrigens einfacher zu helfen, wenn der Visualizer noch die Möglichkeit böte eine Wave-Datei direkt zu öffnen, abzuspielen und zu visualisieren.
Es macht keine sinn da dieser darauf ausgelegt ist die Visualisierung wiederzugeben die man auch als "sehe was du hörst" (what you hear) bezeichnet.
Dazu wird waveInOpen mit entsprechender Callback verwendet.
Ich will nicht vom Stream sondern von der Soundkarte visualisieren. Unabhängig davon welcher Datei Typ abgespielt wird.

Was man installieren bzw. ins System integriert haben muss um es zu testen siehe Shot.
Zitat:

Du solltest die Eingangshürden so gering wie möglich halten, wenn du wirklich Hilfe erwartest.
Dein NonVCL-Quelltext weicht stark von dem ab, was der durchschnittliche Delphiprogrammierer gewohnt ist.
Die GUI(Oberfläche) hat nichts mit dem eigentlichen Problem zu tun.
Ich stelle etwas zur Verfügung aus dem man für sich entsprechende Funktionen entnehmen kann oder auch nicht.
Hilfe ist willkommen aber kein muss und erwarten tue ich diese auch nicht.

Für den einen ist das Spielerei für den anderen eine willkommene Hilfe wenn es auch nur um diverse Dinge innerhalb des Quellcodes geht.
Was er daraus entnimmt ist seine Sache.
Es gibt keine gewähr das alles seine Richtigkeit hat.. Man kennt das ja! Aber ich hätte das alles anders gemacht. :)

gruss

Amateurprofi 2. Apr 2019 13:11

AW: Farbwert zu Dezimal
 
Zitat:

Zitat von EWeiss (Beitrag 1429296)
Bin mir auch nicht sicher ob die von @Neutral General verwendete Funktion das 2D Array zu 1D Array zu konvertieren der richtige weg ist.

Delphi-Quellcode:
function Array2DTo1D(AArray: TArray2D): TArray1D;
var
  y, x: Integer;
  n: Integer;
begin
   SetLength(Result, Length(AArray) * Length(AArray[0]));

   n := 0;
   for y := 0 to High(AArray) do begin
     for x := 0 to High(AArray[y]) do begin
       Result[n] := AArray[y,x];
       inc(n);
     end;
   end;
end;
Ich bin mir vollkommen sicher dass die Funktion Array2DTo1D korrekt funktioniert, allerdings unter der Bedingung dass alle in SpectrumData2D enthaltenen Arrays die gleiche Länge haben. Das scheint in Deinem Projekt der Fall zu sein.

Die nachstehende Version liefert die gleichen Ergebnisse aber deutlich schneller (Laufzeit ca. 1/3 der obigen Version).
Auch hier gilt die Bedingung dass alle in SpectrumData2D enthaltenen Arrays die gleiche Länge haben.

Delphi-Quellcode:
FUNCTION xArray2DTo1D(AArray: TArray2D): TArray1D;
var I,Len,Size:Integer;
begin
   Len:=Length(AArray[0]);
   SetLength(Result, Length(AArray)*Len);
   Size:=Len*SizeOf(Result[0]);
   for I:=0 to High(AArray) do
      Move(AArray[I,0],Result[I*Len],Size);
end;

EWeiss 2. Apr 2019 13:14

AW: Farbwert zu Dezimal
 
Zitat:

Ich bin mir vollkommen sicher dass die Funktion Array2DTo1D korrekt funktioniert
Du hast meinen Beitrag gelesen bzg. meiner Art das 1Dimensional Array zu erstellen? Das ist meines Erachtens der korrekte weg.
Danke wenn sie schneller ist werde ich sie in der neuen Version übernehmen.

gruss

Neutral General 2. Apr 2019 13:17

AW: Farbwert zu Dezimal
 
Nur als Hinweis: Ich hatte in dem alten Thread auch schon eine schnellere Version nachgereicht:

https://www.delphipraxis.net/1428640-post39.html

Wobei das von Byte-Arrays ausgeht. Da sollte wie bei Amateurprofi wahrscheinlich
Delphi-Quellcode:
rowLen * SizeOf(AArray[y][0])
als Länge für das Move übergeben werden.

EWeiss 3. Apr 2019 05:58

AW: Farbwert zu Dezimal
 
Es ist definitiv auf der Basis wie es in VB mit den Arrays gemacht wird nicht möglich.
Ich habe das Array rausgeschmissen und mache es jetzt auf meiner weise und siehe da es funktioniert.
Fade und Blur laufen..

Der Rest im anderen Thread
Trotzdem nochmals Danke an alle für den Versuch zu helfen.

Der ganze Mist mit Arrays, Datentypen, HEX, Dezimal brauch ich alles nicht es geht auch ohne.
Mein Problem war ich habe mich da fest gefressen.. ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr.
Seite 8 von 8   « Erste     678   

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