Layer mit TImage und Transparenz

Rund um die LCL und andere Komponenten
Antworten
AlterMann
Beiträge: 239
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Layer mit TImage und Transparenz

Beitrag von AlterMann »

Hallo

Ich versuche mittels zweier gleich großer, übereinanderliegender Images Layer zu realisieren.
Der Untere soll die Druckvorschau einer Seite anzeigen, und am Oberen möchte ich einen Textbaustein anzeigen, sodaß der Benutzer diesen positionieren kann.

Ich schaff es einfach nicht, daß man den Text am oberen durchsieht.

Ich habe ein kleines Beispiel angehängt (bei dem die beiden Images allerdings zur besseren Sichtbarkeit nicht deckungsgleich angeordnet sind)

Vielleicht hat wer einen Tipp für mich?
LayerTest.zip
(126.47 KiB) 95-mal heruntergeladen
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 11185
Registriert: Mo 11. Sep 2006, 19:01

Re: Layer mit TImage und Transparenz

Beitrag von theo »

AlterMann hat geschrieben: Vielleicht hat wer einen Tipp für mich?
Nimm keine Images, sondern zeichne Text und Bild auf einen Canvas in OnPaint.
Mit Canvas.Draw und Canvas.TextRect (oder TextOut).

Soner
Beiträge: 774
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Layer mit TImage und Transparenz

Beitrag von Soner »

Das Ding(TImage) verhält sich ganz merkwürdig. Ich glaube man muss erst komplett das Bild zeichnen dann auf Transparent umschalten. Wen du das machst, dann ist es transparent:
1. Im Objektinspektor:
Image2.Transparent:=false;
2. Nach dem Programmstart klick auf [Text]-Knopf.
3. Jezt auf [Sichbarkeit]-Knopf klicken.
Jetzt wird es Transparent gezeichnet.

Aber wenn du erst [Sichbarkeit]-Knopf klickst, dann auf [Text]-Knopf dann wird es nicht Transparent gezeichnet.

Ich habe den Eindruck, dass Lazarus Maskedbild erstellt um Transparent zu zeichnen, wenn du einmal Transparenz gesetzt hast, dann werden alle weiteren Zeichnungen in Transparenz-Mode nicht mehr angezeigt.
Also nach jede Änderung alle Zeichnungen in ein Bitmap machen und an TImage weitergeben.

AlterMann
Beiträge: 239
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Layer mit TImage und Transparenz

Beitrag von AlterMann »

@Soner: Das hat mir schon sehr geholfen.

Aus- und Einschalten der Transparenz während der Ausgabe hilft wirklich. Danke

@theo: Meinst Du auf den Canvas des unteren Images, oder auf einen anderen? Kann ich denn einen Canvas ohne zugehörige Komponente einfach einfügen (zur Laufzeit?)?
Früher war alles besser. Und aus Holz!

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: Layer mit TImage und Transparenz

Beitrag von SoE »

Mag ja sein, dass ich gar nicht kapiert hab' was später daraus werden soll, aber eigentlich arbeitet man doch mit PNG oder ähnlichen Formaten und benutzt Alphablending um "Durchscheinen" (semi-transparente Pixel) zu realisieren und nicht mit CookieCutter-Transparenz mit Hilfe von einzelnen Farben??? Oder ???

Bei anspruchsvolleren Dingen sieht das eh sehr bescheiden aus...

Edit: Man kann doch ein transparentes TLabel ganz einfach auf jedem TImage positionieren...

Benutzeravatar
theo
Beiträge: 11185
Registriert: Mo 11. Sep 2006, 19:01

Re: Layer mit TImage und Transparenz

Beitrag von theo »

AlterMann hat geschrieben: @theo: Meinst Du auf den Canvas des unteren Images, oder auf einen anderen? Kann ich denn einen Canvas ohne zugehörige Komponente einfach einfügen (zur Laufzeit?)?
Jedes Formular hat einen Canvas, da muss man nichts spezielles machen.
Das in OnPaint reicht schon:

Code: Alles auswählen

 
procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Brush.Color:=clYellow;
  Canvas.FillRect(10,10,100,50);
  Canvas.TextOut(15,15,'Test');
end;  
Wenn du nun statt FillRect das Bild zeichnest, geht das so.

AlterMann
Beiträge: 239
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Layer mit TImage und Transparenz

Beitrag von AlterMann »

SoE hat geschrieben:Mag ja sein, dass ich gar nicht kapiert hab' was später daraus werden soll, ...
Was es werden soll:

Ich habe vor einiger Zeit eine Unit geschrieben, die mir eine Druckvorschau erstellt.
Dort werden die einzelnen Seiten in dynamisch erzeugten TBitMapobjekten gespeichert, vor dem Drucken angezeigt, wenn man möchte noch nummeriert (Seite x von y) und Ich kann Seiten noch auswählen die gedruckt werden sollen.

Im Hauptprogramm verhält sich die Vorschau wie ein TPrinter.

Da ich nun noch einzeln postitionierbare Textbausteine brauche aber die Druckroutine nicht zweimal im Code haben wollte, dachte ich, ich öffne die Druckvorschau, kopiere die Seite vom Bitmap in ein Image auf einem anderen Formular (alle diese Objekte haben die selben Abmaße in Pixeln wie die Canvas vom Drucker) und lege ein transparentes Image drüber.
Auf dieses zeichne ich den zu positionierenden Textbaustein, schiebe ihn darauf herum bis er passt (ich denke das geht auf einer sonst leeren Canvas wesentlich einfacher als auf der vollen, wo schon das zu druckende Formular daruf gezeichnet ist) und übernehme ihn dann auf den Ausdruck.

Ich hoffe das war irgendwie verständlich ... :oops:
Früher war alles besser. Und aus Holz!

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: Layer mit TImage und Transparenz

Beitrag von SoE »

Da ich nun noch einzeln postitionierbare Textbausteine brauche aber die Druckroutine nicht zweimal im Code haben wollte, dachte ich, ich öffne die Druckvorschau, kopiere die Seite vom Bitmap in ein Image auf einem anderen Formular (alle diese Objekte haben die selben Abmaße in Pixeln wie die Canvas vom Drucker) und lege ein transparentes Image drüber.
Ach so...
Also mein erster Ansatz wäre ohne beide TImages auszukommen, falls das nicht geht, dann nur ein TImage benutzen, das zweite soll ja sowieso transparent sein, wird also eigentlich nicht gebraucht... oder?
Also quasi direkt auf das Bitmap zeichnen oder das Bitmap in ein TImage laden und dann direkt auf das Bitmap im TImage zeichnen oder ein TLabel erzeugen und auf dem TImage herumschieben. Kommt halt drauf an wieviel Text so ein Textbaustein enthält und woraus dieser besteht. (Komponente oder selbst gezeichnet ... und wie das Verschieben erledigt werden soll oder muß...)
Oder wie theo schon gesagt hat: direkt auf das andere Formular zeichnen...
Je weniger man braucht (Form, TImage...) desto besser... naja zumindest meistens...

AlterMann
Beiträge: 239
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Layer mit TImage und Transparenz

Beitrag von AlterMann »

SoE hat geschrieben:... oder ein TLabel erzeugen und auf dem TImage herumschieben....
So hab ich es jetzt letztendlich gelöst.


Vielen Dank für die vielen Anregungen
Christian
Früher war alles besser. Und aus Holz!

Antworten