AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Durch ein Bild "hindurchklicken"? Darunterliegendes Bild erm
Thema durchsuchen
Ansicht
Themen-Optionen

Durch ein Bild "hindurchklicken"? Darunterliegendes Bild erm

Ein Thema von blackdrake · begonnen am 15. Mär 2009 · letzter Beitrag vom 24. Mär 2009
 
blackdrake

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

Re: Durch ein Bild "hindurchklicken"? Darunterlieg

  Alt 24. Mär 2009, 08: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
 


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 03:41 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