AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [erledigt] Scanline - was ist falsch?
Thema durchsuchen
Ansicht
Themen-Optionen

[erledigt] Scanline - was ist falsch?

Ein Thema von mr.winkle · begonnen am 24. Apr 2008 · letzter Beitrag vom 25. Apr 2008
 
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#2

Re: [erledigt] Scanline - was ist falsch?

  Alt 25. Apr 2008, 08:34
Auch wenn die Frage als erledigt gekennzeichnet ist würde ich dir empfehlen die Struktur etwas umzustellen. Denn du greifst für jedes Pixel 2 Mal auf Scanline zu. Scanline ist schnell keine Frage. Aber in deinem Falle wohl nur gerade doppelt so schnell wie die Methode über Pixels, denn ScanLines macht intern auch einiges.

Die Methode setzen würde ich direkt in die Schleifen einbauen, denn zur Übergabe musst du 2 TPoints erstellen und übergeben und innerhalb zerlegst du sie wieder. Das kann man sich sparen. Außerdem ist der Zugriff auf b1 Zeilen für Zeile und Pixel für Pixel fortlaufend. Das könntest du so lösen in dem du dir in der ersten Schleife das Scanline geben lässt und diesen in der zweiten Schleife immer ein Pixel weiter setzt. Beim 2ten Bitmap geht das so leider nicht. Da solltest du evtl ein dynamisches Array erzeugen und dir darin die Pointer von ScanLine cachen.

Delphi-Quellcode:
var
  X, Y: Integer;
  pDestPix, pTempPix: PRGBTriple;
  Rows: array of Pointer;
begin
  // Pointer der Scanlines cachen
  Setlength(Rows, B1.Height);
  for Y := 0 to B1.Height -1 do
    Rows[Y] := B1.ScanLine[Y];

  for Y := 0 to B2.Height -1 do begin
    // Zeilenanfang
    pDestPix := B2.ScanLine[Y];

    for X := 0 to B2.Width -1 do begin
      // Vektor berechnen

      // Pointer aus dem Cache holen
      pTempPix := Rows[Round(X.Y)];
      Inc(pTempPix, Round(X.X);

      // pixel zuweisen
      pDestPix^.rgbtRed := pTempPix^.rgbtRed;
      pDestPix^.rgbtGreen := pTempPix^.rgbtGreen;
      pDestPix^.rgbtBlue := pTempPix^.rgbtBlue;

      // nächstes Pixel der Zeile auswählen
      Inc(pDestPix);
    end;
  end;

  Setlength(Rows, 0);
end;
Oder ist es wichtig, dass du die Bilder Spaltenweise verarbeitest? Denn wenn ja (was ich nicht denke), dann solltest du die Scanlines des zweiten Bildes auch noch cachen. Ich denke es wird sich lohnen.

PS: Evtl lohnt es sich auch die Bilder als 32 Bit zu benutzen. Denn dann könntest du die Pixel auch auch PDWord oder PCardinal ansprechen und mit einem einzigen Befehl kopieren anstelle jetzt "umständlich" Byte für Byte. Da 32 Bit genau die Größe eines CPU Registers sind dürfte das das Kopieren noch mal gut vereinfachen. Weniger Befehle mit passender Datengröße = Schneller

PPS: Ich weiß nicht ob das so gut ist, wenn du für die Größe die Höhe des Images und nicht die des Bitmaps verwendest. Denn das Bitmap könnte unter Umständen auch mal kleiner als das Image sein?
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
 


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 05:19 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