Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#17

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 24. Mär 2009, 09:29
Hallo.

Vielen Dank für die Beispiele.

Bei dem FormDemo habe ich noch einen Bugfix machen müssen, damit auch 1-Pixel-Breite Linien dargestellt werden können:

Excl := CreateRectRGN(StartX, Y, X (** Bugfix: hier war +1 **), Y + 1); Bei dem FrmDemo, das mit ScanLines arbeitet, geht es jetzt schon viel schneller. Natürlich ist es je nach Grafik unterschiedlich. Hier mein aktueller Testlauf:

Testcomputer: 500 MHz; 2 Durchläufe innerhalb Debugger, gemessen mit Now+TimeToStr+ShowMessage.
Referenz-Testgrafik siehe Anhang.

Modifizierter TCoolForm Code (siehe oben)
--> 23 Sekunden

FrmDemo
--> 4 Sekunden

Tranform
--> (hat ja gar nichts mit BMP-Masken zu tun)

* 4 Sekunden sind hingegen trotzdem ein bisschen lahm, auch wenn ich zugeben muss, dass meine Referenzgrafik darauf optimiert ist, den Code auszubremsen. Gibt es denn keine andere Möglichkeit als CreateRectRgn+CombineRgn z.B. mit Assembler oder API-Varianten, bei denen man die BMP direkt übergibt?

Was ich bei den Scanlines aber noch nicht ganz verstehe, ist die Implementierung im FrmDemo.

In der Delphi-Hilfe steht im Beispiel PByteArray.

Dieser ist in Delphi definiert als:

Delphi-Quellcode:
type
  PByteArray = ^TByteArray;
  TByteArray = array[0..32767] of Byte;

var
  P: PByteArray;
begin
  P := Bmp.ScanLine[i];
end;
In deinem Beispiel ist die Verwendung:

Delphi-Quellcode:
type
  PRGBTriple = ^TRGBTriple;
  {$EXTERNALSYM tagRGBTRIPLE}
  tagRGBTRIPLE = packed record
    rgbtBlue: Byte;
    rgbtGreen: Byte;
    rgbtRed: Byte;
  end;
  TRGBTriple = tagRGBTRIPLE

type
  TRGBArray = array[0..32767] of TRGBTriple;
  PRGBArray = ^TRGBArray;

var
  P: PRGBArray;
begin
  P := Bmp.ScanLine[i];
end;
* Seltsam:
- Im Delphi-Beispiel wird ScanLine[] in ein 32767x1 Byte großen Typ gepackt
- Im FormDemo-Beispiel wird ScanLine[] in ein 32767x3 Byte großen packed Typ gepackt
Wird es bei letzterem Probleme geben, weil der Typ 3fach so groß ist? Komisch, dabei ist 32768 (Länge des Arrays) nicht mal durch 3 teilbar... Welche Werte repräsentieren dann die Elemente? Wäre die Reihenfolge RGBRGBRGB... wäre es doch ein Vielfaches von 3.

* Wo die Zahl 32767 (2^15-1) herkommt bzw. wer dieses Limit vorschreibt, ist mir ebenfalls rätselhaft und ich weiß nicht, ob es dabei zu Limitationen beim Einlesen von großen BMPs kommen könnte.

Gruß
blackdrake
Angehängte Dateien
Dateityp: zip referenzgrafik_338.zip (2,0 KB, 13x aufgerufen)
Daniel Marschall
  Mit Zitat antworten Zitat