AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap "auf die harte Tour" schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap "auf die harte Tour" schreiben

Ein Thema von alcaeus · begonnen am 28. Feb 2006 · letzter Beitrag vom 13. Mär 2006
 
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#26

Re: Bitmap "auf die harte Tour" schreiben

  Alt 13. Mär 2006, 22:10
es ist einfach ineffektiv bei jedem aufruf Scanline erneut zu nutzen. Es reicht wenn man ein einziges mal scanline benutzt und sich den Rückgabewert merkt. Anschließend kann man von diesem Wert ausgehend auf die anderen Bytes zugreifen.
Ich meinte nicht immer eine Zeile komplett zu bearbeiten. Ich meinte wirklich nur einmal scanline zu nutzen.

Zur Veranschauligung hier mal meine Unit die ich für schnelle Zugriffe nutze:
Delphi-Quellcode:
interface

uses
  windows, graphics;

type
  TBmpFast = class(TObject)
  private
    fFirstLine: Pointer;
    fHeight : Cardinal;
    fLineSize: Cardinal;
    fWidth : Cardinal;
  public
    constructor Create;

    property Height: Cardinal read fHeight;

    function GetByte(X, Y: Word): PByte;
    function GetRGBTriple(X, Y: Word): PRGBTriple;
    function GetRGBQuad(X, Y: Word): PRGBQuad;
    procedure Init(ABmp: TBitmap; ABitsPerPixel: Byte);
  end;


implementation

constructor TBmpFast.Create;
begin
  inherited Create;
  fFirstLine := nil;
  fLineSize := 0;
end;

function TBmpFast.GetByte(X, Y: Word): PByte;
begin
  result := PByte(Cardinal(fFirstLine) - (fLineSize * Y) + X);
end;

function TBmpFast.GetRGBTriple(X, Y: Word): PRGBTriple;
begin
  result := PRGBTriple(Cardinal(fFirstLine) - (fLineSize * Y) + (X * 3));
end;

function TBmpFast.GetRGBQuad(X, Y: Word): PRGBQuad;
begin
  result := PRGBQuad(Cardinal(fFirstLine) - (fLineSize * Y) + (X * 4));
end;

procedure TBmpFast.Init(ABmp: TBitmap; ABitsPerPixel: Byte);
begin
  fHeight := ABmp.Height;
  fWidth := ABmp.Width;
  fFirstLine := ABmp.ScanLine[0];
  fLineSize := BytesPerScanline(fWidth, ABitsPerPixel, 32);
end;

end.
Ich rufe einfach die Init-methode auf un darin wird ein mal Scanline aufgerufen. Die zugriffe auf das Pixel X,Y erfolgen anschließend mit Berechnungen der Werte die bei Init ermittelt wurden. Also ohne erneutes Aufrufen von Scanline. Und somit mehr performance weil nicht jedes mal das ausgeführt wird was in der Scanlinefunktion eben so von statten geht.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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: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 by Thomas Breitkreuz