Thema: Delphi Farbwert zu Dezimal

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#72

AW: Farbwert zu Dezimal

  Alt 2. Apr 2019, 06:42
@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
GetObject(hDIB, sizeof(bm), @bm);

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

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

redimensionier mein Array of TBytes.
    SetLength(bmpBits, BitmapLength);

hole die bits und kopiere sie in mein 1D Array vom Type TBytes
    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

Geändert von EWeiss ( 2. Apr 2019 um 15:49 Uhr)
  Mit Zitat antworten Zitat