Delphi-PRAXiS
Seite 7 von 10   « Erste     567 89     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Circular spectrum visualizer (https://www.delphipraxis.net/200135-circular-spectrum-visualizer.html)

EWeiss 2. Apr 2019 13:24

AW: Circular spectrum visualizer
 
Nehme ich DWord dann habe ich hier
Delphi-Quellcode:
SpectrumData2D[x, y] := LongWord(c or ((a - 256) * $1000000))


einen Integerüberlauf.
Und schon sind wir wieder beim Thema das es nicht funktioniert.

PS:
Als Byte definiert habe ich Daten im Array.
Ob sie richtig sind? Keine Ahnung. Ich sagte ja schon bekomme das nicht gebacken.

gruss

Michael II 2. Apr 2019 14:16

AW: Circular spectrum visualizer
 
Zitat:

SpectrumData2D[x, y] := LongWord(c or ((a - 256) * $1000000))
Du mischst hier Datentypen wild durcheinander. Ich hatte dir vor einigen Tagen per PN eine 'Release' gesendet, welche funktionieren sollte. [Wenn dort noch was klemmen sollte, dann schreibe mir eine PN.]

Bei deinem obigen Problem: a-256 kann - wenn du a als BYTE definiert - problematisch sein, wenn a=0.

Mein Tipp: Mische nicht BYTEs und WORDs und DWORDs. Nimm DWORD; dann wird der Code übersichtlicher, lesbarer und tut dann auch eher das, was du erwartest ;-).

EWeiss 2. Apr 2019 14:20

AW: Circular spectrum visualizer
 
Zitat:

Wenn dort noch was klemmen sollte, dann schreibe mir eine PN.
PN ist unterwegs.

gruss

EWeiss 4. Apr 2019 11:48

AW: Circular spectrum visualizer
 
Meine einfache Lösung..
Delphi-Quellcode:
  case FEffect of
    0:
      begin
        d := round(FFade * 255);

        for y := 0 to 239 do
        begin
          for x := 0 to 239 do
          begin
            GDIP_BitmapGetPixel(imgSpectrum, x, y, Color);
            SKAERO_SplitColorARGB(Color, _a, _r, _g, _b);

            a := _a;

            if a >= d then
              a := a - d
            else
            a := 0;

            c := Color and $ffffff;
            GDIP_BitmapSetPixel(imgSpectrum, x, y, (a shl 24) or c);
          end;
        end;
      end;
Wie man sich vorstellen kann ist Get\SetPixel nicht die allerbeste Methode weil zu langsam und geht extrem auf die CPU.
Also neue Methode.
Delphi-Quellcode:
  case FEffect of
    0:
      begin
        d := round(FFade * 255);

        if GDIP_BitmapLockBits(imgSpectrum, nil, ImageLockModeRead or ImageLockModeWrite,
          PixelFormat32bppARGB, @BitmapData) = OK then
        begin
          GDIP_BitmapUnlockBits(imgSpectrum, @BitmapData);

          for Row := 0 to BitmapData.Height - 1 do
          begin
            RGBQuad := Scanline(BitmapData, Row);

            for Col := 0 to BitmapData.Width - 1 do
            begin
              Pixel := RGBQuad^;
              alpha := Pixel.rgbReserved;

              if alpha >= d then
                alpha := alpha - d
              else
              alpha := 0;

              Color := Byte(@Pixel) and $ffffff;
              GDIP_BitmapSetPixel(imgSpectrum, Col, Row, (alpha shl 24) or Color);
              inc(RGBQuad);
            end;
          end;
      end;
GDIP_BitmapGetPixel ist Vergangenheit..
GDIP_BitmapSetPixel aber leider nicht da ich nicht weis wie ich die gesamt Farbe des Pixel an das Bitmap übergeben soll.

Wo ist mein Denkfehler, oder was verstehe ich nicht.

gruss

Neutral General 4. Apr 2019 11:57

AW: Circular spectrum visualizer
 
Was soll
Delphi-Quellcode:
//
Color := Byte(@Pixel) and $ffffff;
genau bewirken?
Zum einen tut ein "and $ffffff" rein gar nichts mit einem Byte und zum anderen castest du die (Adresse des (Pointers auf den Pixel)) auf ein Byte.
Das hat ziemlich wenig mit irgendeiner Farbe zu tun. Da hast du nur die untersten 8-Bit von irgendeiner Stackadresse.

EWeiss 4. Apr 2019 12:01

AW: Circular spectrum visualizer
 
Zitat:

Zitat von Neutral General (Beitrag 1429499)
Was soll
Delphi-Quellcode:
//
Color := Byte(@Pixel) and $ffffff;
genau bewirken?
Zum einen tut ein "and $ffffff" rein gar nichts mit einem Byte und zum anderen castest du die (Adresse des (Pointers auf den Pixel)) auf ein Byte. Das hat ziemlich wenig mit irgendeiner Farbe zu tun.

Hmmm…
Wenn das Pixel keinen Alpha wert hat soll das Pixel den Wert 0 erhalten also schwarz.
So verstehe ich das.

Delphi-Quellcode:
(alpha shl 24) or Color


PS:
Dann die Berichtigung..
Delphi-Quellcode:
Color := DWORD(@Pixel) and $FFFFFF;
GDIP_BitmapSetPixel(imgSpectrum, Col, Row, (alpha shl 24) or Color);
gruss

Neutral General 4. Apr 2019 12:31

AW: Circular spectrum visualizer
 
Ah jetzt verstehe ich was du machen willst.
Mach es einfach so:
Delphi-Quellcode:
if alpha >= d then
  Pixel.rgbReserved := alpha - d
else
  Pixel.rgbReserved := 0;

GDIP_BitmapSetPixel(imgSpectrum, Col, Row, DWORD(Pixel));

EWeiss 4. Apr 2019 12:38

AW: Circular spectrum visualizer
 
Zitat:

Zitat von Neutral General (Beitrag 1429504)
Ah jetzt verstehe ich was du machen willst.
Mach es einfach so:
Delphi-Quellcode:
if alpha >= d then
  Pixel.rgbReserved := alpha - d
else
  Pixel.rgbReserved := 0;

GDIP_BitmapSetPixel(imgSpectrum, Col, Row, DWORD(Pixel));

Danke.
Aber mein Problem ist ich möchte BitmapSetPixel nicht mehr verwenden darum geht es denn sonst macht die Funktion eigentlich keinen sinn.
Diese soll ja get\set ersetzen.

Mit Get\Set habe 30% CPU Auslastung das gilt zu minimieren weil Get oder SetPixel zu lastig sind.

gruss

Neutral General 4. Apr 2019 12:40

AW: Circular spectrum visualizer
 
Delphi-Quellcode:
RGBQuad^ := Pixel
statt
Delphi-Quellcode:
GDIP_BitmapSetPixel
:
Delphi-Quellcode:
if alpha >= d then
  Pixel.rgbReserved := alpha - d
else
  Pixel.rgbReserved := 0;
RGBQuad^ := Pixel;
Theoretisch geht auch einfach:
Delphi-Quellcode:
for Col := 0 to BitmapData.Width - 1 do
begin
  alpha := RGBQuad^.rgbReserved;

  if alpha >= d then
    RGBQuad^.rgbReserved := alpha - d
  else
    RGBQuad^.rgbReserved := 0;

  inc(RGBQuad);
end;

EWeiss 4. Apr 2019 12:42

AW: Circular spectrum visualizer
 
Zitat:

Zitat von Neutral General (Beitrag 1429506)
Delphi-Quellcode:
RGBQuad^ := Pixel
statt
Delphi-Quellcode:
GDIP_BitmapSetPixel
(Kombiniert mit dem Code von mir ohne das GDIP_BitmapSetPixel)

Danke werde ich mal versuchen.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr.
Seite 7 von 10   « Erste     567 89     Letzte »    

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 by Thomas Breitkreuz