TImage-Objekte überblenden möglich?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hogga
Beiträge: 7
Registriert: So 3. Apr 2022, 20:35

TImage-Objekte überblenden möglich?

Beitrag von hogga »

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

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

Re: TImage-Objekte überblenden möglich?

Beitrag von theo »


hogga
Beiträge: 7
Registriert: So 3. Apr 2022, 20:35

Re: TImage-Objekte überblenden möglich?

Beitrag von hogga »

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.

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

Re: TImage-Objekte überblenden möglich?

Beitrag von theo »

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.
Steht doch unten auf der Seite, die ich dir verlinkt hatte, bei "Download".

Benutzeravatar
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?

Beitrag von Winni »

Hi!

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;
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.

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;
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

hogga
Beiträge: 7
Registriert: So 3. Apr 2022, 20:35

Re: TImage-Objekte überblenden möglich?

Beitrag von hogga »

@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ß.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TImage-Objekte überblenden möglich?

Beitrag von wp_xyz »

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) 51-mal heruntergeladen

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
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?

Beitrag von corpsman »

Also ich mache solche sachen immer mittels OpenGL, geht wunderbar...
--
Just try it

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: TImage-Objekte überblenden möglich?

Beitrag von six1 »

corpsman hat geschrieben:
Fr 15. Apr 2022, 19:11
Also ich mache solche sachen immer mittels OpenGL, geht wunderbar...
Kannst du mal ein kleines Beispiel zeigen, um in OpenGL zwei Bilder überzublenden?
Habe damit noch garnix gemacht, würde mich aber mal interessiern...

Danke!
Gruß, Michael

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
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?

Beitrag von corpsman »

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 ;)

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

Antworten