Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   WaveFade (https://www.delphipraxis.net/133110-wavefade.html)

EWeiss 26. Apr 2009 19:59

Re: WaveFade
 
Habe noch ein kleines problem

Delphi-Quellcode:
procedure TfrmMain.FadeBackBuffer2;
type TPixelArray = packed array[0..0, 0..255] of packed record
    b, g, r: Byte;
  end;
  PPixelArray = ^TPixelArray;

var
  dx: integer;
  dy: integer;
  i: integer;
begin
  try
    BitBlt(hTempDc, 0, 0, 256, nHeight, DC, 256, 0, SRCCOPY);

    //' Fade The Data.
    for dy := 0 to nHeight - 1 do
    begin
      for dx := 0 to 255 do
      begin
        i := PPixelArray(pAddr)[dy, dx].b - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy, dx].b := i;

        i := PPixelArray(pAddr)[dy, dx].g - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy, dx].g := i;

        i := PPixelArray(pAddr)[dy, dx].r - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy, dx].r := i;
      end;
    end;

    //' Blit The Faded Image To The Back Buffer.
    BitBlt(DC, 0, 0, 256, nHeight, hTempDc, 256, 0, SRCCOPY);
  except

  end;
end;
Ich möchte jetzt die RGB werte von der position dx:=256 auslesen
Das problem ist aber das dx innerhalb des Array an die RGB werte gekoppelt sind also max 255
Jemand eine Idee wie ich das problem beheben kann ?

gruss Emil

himitsu 26. Apr 2009 20:07

Re: WaveFade
 
da es eh nur 256 Pixel pro Zeile gibt, existiert natürlich keine Spalte für dx=256

aber da gab's ja noch die Möglichkeit ein Eindimensionales Array über das ganze Bild zu legen.
Delphi-Quellcode:
TPixelArray = packed array[0..0] of packed record
    b, g, r: Byte;
  end;

PPixelArray(pAddr)[dy * 256 + dx]

[add]
dein Wunsch würde ja diesem entsprechen
Delphi-Quellcode:
type TPixelArray = packed array[0..0, 0..255] of packed record

PPixelArray(pAddr)[dy + dx div 256, dx mod 256]

dx=256   =>  PPixelArray(pAddr)[dy + 1, 0]
dx=300   =>  PPixelArray(pAddr)[dy + 1, 44]

EWeiss 26. Apr 2009 20:11

Re: WaveFade
 
Zitat:

Zitat von himitsu
da es eh nur 256 Pixel pro Zeile gibt, existiert natürlich keine Spalte für dx=256

aber da gab's ja noch die Möglichkeit ein Eindimensionales Array über das ganze Bild zu legen.
Delphi-Quellcode:
TPixelArray = packed array[0..0] of packed record
    b, g, r: Byte;
  end;

PPixelArray(pAddr)[dy * 256 + dx]

Nein es gibt 512
Delphi-Quellcode:
  BASS_ChannelGetData(stream, @SampleData, 1024);
  For intI := 0 To 511 do
    WaveData[intI] := SampleData[intI];
Delphi-Quellcode:
  TRA: array[1..512] of single;
  TIA: array[1..512] of single;
512 Sample Maximal für Wave mehr stellt die SDK nicht zur verfügung.
Könnte Theoretisch auch 1024 nehmen nur dann wären es 512 für den rechten und 512 für den linken Kanal.

gruss Emil

himitsu 26. Apr 2009 20:16

Re: WaveFade
 
du hattest aber vorher ein Array mit 768 Bytes pro Zeile
und bei 3 Farben macht das dann 256 Pixel


bei 512 wären es natürlich dann 0..511
Delphi-Quellcode:
type TPixelArray = packed array[0..0, 0..511] of packed record
  ...

oder wenn variabel dann:
Delphi-Quellcode:
TPixelArray = packed array[0..0] of packed record
    b, g, r: Byte;
  end;

PPixelArray(pAddr)[dy * Spalten + dx]

EWeiss 26. Apr 2009 20:22

Re: WaveFade
 
Wenn ich dich richtig verstanden habe dann so!

Delphi-Quellcode:
    //' Fade The Data.
    for dy := 0 to nHeight - 1 do
    begin
      for dx := 0 to 255 do
      begin
        i := PPixelArray(pAddr)[dy + dx div 256, dx mod 256].b - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy + dx div 256, dx mod 256].b := i ;

        i := PPixelArray(pAddr)[dy + dx div 256, dx mod 256].g - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy + dx div 256, dx mod 256].g := i ;

        i := PPixelArray(pAddr)[dy + dx div 256, dx mod 256].r - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy + dx div 256, dx mod 256].r := i ;
      end;
    end;
Leider kracht es gewaltig ;)

gruss Emil

EWeiss 27. Apr 2009 10:38

Re: WaveFade
 
Hmm will irgendwie nicht..
Sehe schon muss noch einiges lernen. :mrgreen:

Hat sich erledigt..

gruss EMil

EWeiss 28. Apr 2009 08:09

Re: WaveFade
 
Kleines Update
Die Flames wurden jetzt der richtigen Bildhöhe angepaßt und die weite auf 512 gesetzt.
Hab dann ein Menü addiert und die RadioGroup entfernt.

Meine das sieht jetzt besser aus.

gruss Emil

EWeiss 19. Jun 2019 18:57

AW: WaveFade
 
Hat vielleicht jemand von euch den Quelltext noch irgendwo auf seiner Platte oder Archiviert?
Hab meinen verloren.

gruss

EWeiss 20. Jun 2019 06:03

AW: WaveFade
 
Hat sich erledigt habe es neu geschrieben..
Es gibt noch 6 andere Farben.. :)

PS:
Es wäre nett wenn mal jemand meinen FFT gegenprüfen würde, habe ab und an einen Gleitkomma überlauf. @Michael II ?? :)
Delphi-Quellcode:
procedure TBassPlayer.XFFT(FR, FI: array of single; Sign, Sample, SampleCount: Integer);
// Wave Daten glätten
var
  Q, J, M, L, le, le1, ip: integer;
  tr, ti, s, ur, ur1, ui, wr, wi: single;

begin

    J := 1;
    for Q := Sample to SampleCount do
    begin
      if Q < J then
      begin
        s    := FR[Q];
        FR[Q] := FR[J];
        FR[J] := s;
        s    := FI[Q];
        FI[Q] := FI[J];
        FI[J] := s;
      end;
      M := ((SampleCount + 1) div 2);

      while M < J do
      begin
        J := J - M;
        M := M div 2;
      end;
      J := J + M;
    end;

    for L := 1 to 8 do
    begin
      le := trunc(Power(2, L));
      le1 := le div 2;
      ur := 1;
      ui := 0;
      wr := Cos(PI / le1);
      wi := Sign * Sin(PI / le1);
     
      for J := 1 to le1 do
      begin
        Q := J;
        while Q <= (SampleCount + 1) do
        begin
          ip    := Q + le1;
          tr    := FR[ip] * ur - FI[ip] * ui;
          ti    := FR[ip] * ui + FI[ip] * ur;
          FR[ip] := FR[Q] - tr;
          FI[ip] := FI[Q] - ti;
          FR[Q] := FR[Q] + tr;
          FI[Q] := FI[Q] + ti;
          Q     := Q + le;
        end;

        ur1 := ur * wr - ui * wi;
        ui := ur * wi + ui * wr;
        ur := ur1;
      end;
    end;

    for Q := Sample to (SampleCount + 1) do
    begin
      FR[Q] := FR[Q] * DivN;
      FI[Q] := FI[Q] * DivN;
    end;
end;
Wenn nötig stelle ich dafür den Quelltext des Projekts zur Verfügung.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Seite 2 von 2     12   

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