Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zeichenroutine optimieren... (https://www.delphipraxis.net/106505-zeichenroutine-optimieren.html)

Green 11. Jan 2008 21:42


Zeichenroutine optimieren...
 
Delphi-Quellcode:
procedure TForm1.AssignColors(PB: TProgressbar);
var
  i, j: integer;
begin
  Image.canvas.brush.color:=clBlack;
  Image.canvas.rectangle(0,0,AufloesungX,AufloesungY);
  for i := 0 to AufloesungX - 1 do begin
    for j := 0 to AufloesungY - 1 do begin
      if not (CountArray[i,j] = Form3.TrackBar1.Position + 1) then
        MandelImage.Canvas.Pixels[i,j] := Image10.Canvas.Pixels[1,CountArray[i,j]];
    end;
    PB.Position := PB.Position + 1;
  end;
  PB.Position := 0;
end;
Diese funktion wandelt ein aus zahlen bestehendes Zweidimensionales Array in ein Bild um.
Sie funktioniert ist aber recht langsam.

Bei einer aufloesung von 1280 * 1024 geht das durchaus 5-6 sekunden.

Programme wie Paint oder IrfanView (insbesondere) Irfan brauchen bruchteile von sekunden um ein Bild zu zeichnen und das ja auch aus gegebenen Zahlenwerten.

Wie kann man das jetzt optimieren??

lG Green

SirThornberry 11. Jan 2008 21:45

Re: Zeichenroutine optimieren...
 
von welchem Typ ist MandelImage? Wenn es vom Typ TBitmap ist solltest du direkt auf den Speicher des Bildes mit der Methode Scanline zugreifen.

Green 11. Jan 2008 21:57

Re: Zeichenroutine optimieren...
 
Hab vergessen das umzubenennen ^^

is auch ein TImage. Wie soll das mit Scanline gehen?

inherited 11. Jan 2008 22:07

Re: Zeichenroutine optimieren...
 
Benutz die Forensuche!

Green 11. Jan 2008 22:36

Re: Zeichenroutine optimieren...
 
Zitat:

Zitat von inherited
Benutz die Forensuche!

Hab ich getan und die suche und ein wenig nachdenken brachte mir folgendes ergebnis:
Delphi-Quellcode:
procedure assign;
var
  i, j, iy, ix: integer;
  lPixel: PRGBQuad;
begin
  Image.canvas.brush.color:=clBlack;
  Image.canvas.rectangle(0,0,AufloesungX,AufloesungY);
  Image.Picture.Bitmap.PixelFormat := pf32bit;
  Image.Canvas.MoveTo(0,0);
  for iy := 0 to AufloesungY - 1 do
  begin
    lPixel := Image.Picture.Bitmap.Scanline[iy];
    for ix := 0 to AufloesungX - 1 do
    begin
      if not (CountArray[ix,iy] = Form3.TrackBar1.Position + 1) then begin
        lPixel^.rgbRed := GetRValue(Image10.Canvas.Pixels[1,CountArray[ix,iy]]);
        lPixel^.rgbGreen := GetGValue(Image10.Canvas.Pixels[1,CountArray[ix,iy]]);
        lPixel^.rgbBlue := GetBValue(Image10.Canvas.Pixels[1,CountArray[ix,iy]]);
        lPixel^.rgbReserved := 0;
      end;
      Inc(lPixel);
    end;
    PB.Position := PB.Position + 1;
  end;
  PB.Position := 0;
end;
Doch zufriedenstellend war es nicht gerade: ungefähr 2-3 mal so lang...
was mach ich falsch?

SirThornberry 11. Jan 2008 23:48

Re: Zeichenroutine optimieren...
 
folgendes machst du noch falsch:
Delphi-Quellcode:
Image10.Canvas.Pixels[1,CountArray[ix,iy]
du nutzt weiterhin das Pixels-Property. Und anstelle es einmal abzufragen und auf eine Zwischenvariable zu zuweisen fragst du es 3 mal ab.

Green 12. Jan 2008 12:01

Re: Zeichenroutine optimieren...
 
Ok, jetzt hab ich davor die RGB werte einzeln in ein Array gespeichert, jetzt geht das ganze sehr sehr fix!!

Vielen Dank!!!

inherited 12. Jan 2008 16:37

Re: Zeichenroutine optimieren...
 
Zitat:

Zitat von Green
Ok, jetzt hab ich davor die RGB werte einzeln in ein Array gespeichert, jetzt geht das ganze sehr sehr fix!!

Wozu?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 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