AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Circular spectrum visualizer
Thema durchsuchen
Ansicht
Themen-Optionen

Circular spectrum visualizer

Ein Thema von EWeiss · begonnen am 22. Mär 2019 · letzter Beitrag vom 23. Jun 2019
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Circular spectrum visualizer

  Alt 2. Apr 2019, 13:20
Zitat:
Wenn dort noch was klemmen sollte, dann schreibe mir eine PN.
PN ist unterwegs.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Circular spectrum visualizer

  Alt 4. Apr 2019, 10:48
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

Geändert von EWeiss ( 4. Apr 2019 um 11:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Circular spectrum visualizer

  Alt 4. Apr 2019, 10:57
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 4. Apr 2019 um 11:02 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Circular spectrum visualizer

  Alt 4. Apr 2019, 11:01
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.

(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

Geändert von EWeiss ( 4. Apr 2019 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Circular spectrum visualizer

  Alt 4. Apr 2019, 11:31
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));
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Circular spectrum visualizer

  Alt 4. Apr 2019, 11:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Circular spectrum visualizer

  Alt 4. Apr 2019, 11:40
RGBQuad^ := Pixel statt 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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 4. Apr 2019 um 11:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:36 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