TImage-Objekte überblenden möglich?
TImage-Objekte überblenden möglich?
Hallo,
ich möchte in Lazarus eine Diashow programmieren, bei der die Bilder ineinander übergehen. Meine Idee ist, zwei TImage-Objekte übereinander zu legen und das obere Objekt immer transparenter zu machen, so daß allmählich das untere zum Vorschein kommt. Geht das überhaupt so oder wie kann ich das sonst erreichen?
Vielen Dank
ich möchte in Lazarus eine Diashow programmieren, bei der die Bilder ineinander übergehen. Meine Idee ist, zwei TImage-Objekte übereinander zu legen und das obere Objekt immer transparenter zu machen, so daß allmählich das untere zum Vorschein kommt. Geht das überhaupt so oder wie kann ich das sonst erreichen?
Vielen Dank
Re: TImage-Objekte überblenden möglich?
Würde ich mal hiermit versuchen:
https://wiki.freepascal.org/BGRABitmap/ ... erblendung
https://wiki.freepascal.org/BGRABitmap/ ... erblendung
Re: TImage-Objekte überblenden möglich?
Danke für die schnelle Antwort. Habs gerade mal überflogen. Sieht so aus, als wäre es das, was ich gesucht habe. Scheint aber auch ziemlich komplex zu sein. Da werde ich mich erst mal intensiv mit beschäftigen müssen.
Edit:
Noch eine Frage: Wie kann ich BGRABitmap in der aktuellen Lazarus-Version unter Windows 10 installieren, wenn der Lazarus-Rechner keine Online-Verbindung hat (also Online Package Manager und fpcupdeluxe fallen aus)? Andere Rechner zu Herunterladen von Dateien stehen natürlich zur Verfügung.
Edit:
Noch eine Frage: Wie kann ich BGRABitmap in der aktuellen Lazarus-Version unter Windows 10 installieren, wenn der Lazarus-Rechner keine Online-Verbindung hat (also Online Package Manager und fpcupdeluxe fallen aus)? Andere Rechner zu Herunterladen von Dateien stehen natürlich zur Verfügung.
Re: TImage-Objekte überblenden möglich?
Steht doch unten auf der Seite, die ich dir verlinkt hatte, bei "Download".hogga hat geschrieben: Mi 13. Apr 2022, 21:27 Noch eine Frage: Wie kann ich BGRABitmap in der aktuellen Lazarus-Version unter Windows 10 installieren, wenn der Lazarus-Rechner keine Online-Verbindung hat (also Online Package Manager und fpcupdeluxe fallen aus)? Andere Rechner zu Herunterladen von Dateien stehen natürlich zur Verfügung.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: TImage-Objekte überblenden möglich?
Hi!
Du kannst die zwei BGRAbitmap in Stufen überblenden, indem Du MergeBGRA benutzt:
Für zwei TBGRAbitmap machst Du Folgendes für die Überblendung. Voraussetzung für den Code ist, dass bmp1 und bmp2 die gleichen Dimensionen haben.
Diese Bitmap kannst du t.B. mittels draw auf den Canvas eines TImage zeichnen.
Und diese Function ruftst Du per Timer auf und veränderst das Verhältnis zwischen weight1 und weight2 von 100 zu 0 auf 0 zu 100.
Winni
Du kannst die zwei BGRAbitmap in Stufen überblenden, indem Du MergeBGRA benutzt:
Code: Alles auswählen
function MergeBGRA(c1: TBGRAPixel; weight1: integer; c2: TBGRAPixel; weight2: integer): TBGRAPixel;
Code: Alles auswählen
function merge2Bitmaps (bmp1, bmp2 : TBGRAbitmap; weight1, weight2 : Integer) : TBGRAbitmap;
var p, q, r : PBGRApixel;
i : integer;
tmp : TBGRAbitmap;
begin
tmp := TBGRAbitmap.create (bmp1.width, bmp1.height);
p := bmp1.data;
q := bmp2.data;
r := tmp.data;
for i := 0 to bmp1.data - 1 do
begin
r^ := MergeBGRA (p^, weight1, q^, weight2);
inc(p); inc(q); inc (r);
end; // i
tmp.invalidateBitmap;
result := tmp;
end;
Und diese Function ruftst Du per Timer auf und veränderst das Verhältnis zwischen weight1 und weight2 von 100 zu 0 auf 0 zu 100.
Winni
Re: TImage-Objekte überblenden möglich?
@theo
Den Download. habe ich gefunden. Beim Kompilieren der mitgelieferten Beispiele hat sich Lazarus jedoch über fehlende Packages beschwert. Habs aber mittlerweile hinbekommen.
@winni
Deine Funktion werde ich mal ausprobieren.
Vielen Dank für eure Mühe. Ich denke, ihr habt mich ein ganzez Stück weiter gebracht. Jetzt habe ich eine Vorstellung davon, wie ich weiter vorgehen muß.
Den Download. habe ich gefunden. Beim Kompilieren der mitgelieferten Beispiele hat sich Lazarus jedoch über fehlende Packages beschwert. Habs aber mittlerweile hinbekommen.
@winni
Deine Funktion werde ich mal ausprobieren.
Vielen Dank für eure Mühe. Ich denke, ihr habt mich ein ganzez Stück weiter gebracht. Jetzt habe ich eine Vorstellung davon, wie ich weiter vorgehen muß.
Re: TImage-Objekte überblenden möglich?
Hab mal vesucht, ob man das Überblenden auch mit Bordmitteln hinbekommt - ja, zumindest für die 1000er-Auflösung des Lazarus-Cheetah geht es erstaunlich gut.
- Dateianhänge
-
blend_images.zip
- (240.39 KiB) 70-mal heruntergeladen
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: TImage-Objekte überblenden möglich?
Also ich mache solche sachen immer mittels OpenGL, geht wunderbar...
--
Just try it
Just try it
Re: TImage-Objekte überblenden möglich?
Kannst du mal ein kleines Beispiel zeigen, um in OpenGL zwei Bilder überzublenden?corpsman hat geschrieben: Fr 15. Apr 2022, 19:11 Also ich mache solche sachen immer mittels OpenGL, geht wunderbar...
Habe damit noch garnix gemacht, würde mich aber mal interessiern...
Danke!
Gruß, Michael
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: TImage-Objekte überblenden möglich?
Hier mal als super einfaches Beispiel
i1, i2 = die in OpenGL geladenen Texturen
Scrollbar1 [0..100] das Blenden von der einen in die Andere Textur
Wichtig, TiefenCheck ausschalten
i1, i2 = die in OpenGL geladenen Texturen
Scrollbar1 [0..100] das Blenden von der einen in die Andere Textur
Wichtig, TiefenCheck ausschalten

Code: Alles auswählen
Procedure TForm1.OpenGLControl1Paint(Sender: TObject);
Begin
If Not Initialized Then Exit;
// Render Szene
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
go2d;
If (i1 <> 0) And (i2 <> 0) Then Begin
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glcolor4f(1, 1, 1, ScrollBar1.Position / 100);
glBindTexture(GL_TEXTURE_2D, i1);
glbegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(10, 10);
glTexCoord2f(1, 0);
glVertex2f(100, 10);
glTexCoord2f(1, 1);
glVertex2f(100, 100);
glTexCoord2f(0, 1);
glVertex2f(10, 100);
glend;
glcolor4f(1, 1, 1, 1 - (ScrollBar1.Position / 100));
glBindTexture(GL_TEXTURE_2D, i2);
glbegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(10, 10);
glTexCoord2f(1, 0);
glVertex2f(100, 10);
glTexCoord2f(1, 1);
glVertex2f(100, 100);
glTexCoord2f(0, 1);
glVertex2f(10, 100);
glend;
End;
exit2d;
OpenGLControl1.SwapBuffers;
End;
--
Just try it
Just try it