vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Bild auf Bild einblenden 
Autor: Dikn
Datum: 22.06.20 11:57

Hallo!
Ich möchte ein Bild über ein anderes Bild schieben
Funktioniert mit diesem Code:

PictureBox [Pb1] – Size: 560/315 - SizeMode: Normal
PictureBox [Pb2] – Size: 560/315 - SizeMode: Zoom

Public Class frmMain
    Private ActivePic, NextPic As Bitmap
    Private PicBoxRect As New Rectangle(0, 0, 560, 315)
    Private i As Integer = 0
    Private strW, strH As String
 
    Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        PB2.Image = New Bitmap("C:\...\xxx.jpg")      '  561x637 - 0,880...
        Using bmp1 As New Bitmap(560, 315)
            PB2.BackColor = Color.Green
            PB2.DrawToBitmap(bmp1, PicBoxRect)
            PB1.Image = New Bitmap(bmp1)
            ActivePic = New Bitmap(bmp1)
        End Using
 
        PB2.Image = New Bitmap("C:\...\yyy.jpg")      ' 1920x1080 - 1,777...
        Using bmp2 As New Bitmap(560, 315)
            PB2.BackColor = Color.Red   ' -> .Black sonst Streifen rechts und 
                                              unten (unter PB1 schwarzes Panel)
            PB2.DrawToBitmap(bmp2, PicBoxRect)
            NextPic = New Bitmap(bmp2)
        End Using
    End Sub
 
    Private Sub BtnLR_Click(sender As Object, e As EventArgs) Handles _
      BtnLR.Click
        i = 0
        Do While i <= 560 / 10
            strW = CStr(i * 10)
            Fade("0, 0, " & strW & ", 315, 0, 0, " & strW & ", 315")
        Loop
    End Sub
 
    Private Sub BtnOU_Click(sender As Object, e As EventArgs) Handles _
      BtnOU.Click
        i = 0
        Do While i <= 315 / 10
            strH = CStr(i * 10)
            Fade("0, 0, 560, " & strH & ", 0, 0, 560, " & strH)
        Loop
        Fade("0, 0, 560, 315, 0, 0, 560, 315")
    End Sub
 
    Private Sub BtnL_Click(sender As Object, e As EventArgs) Handles BtnL.Click
        i = 0
        Do While i <= 560 / 10
            strW = CStr(i * 10)
            Fade("0, 0, " & strW & ", 315, " & _
                 CStr(560 - CInt(strW)) & ", 0, " & strW & " , 315")
        Loop
    End Sub
 
    Private Sub Fade(Str As String)
        Dim A() As String = Str.Split(",")
        i += 1
        'Threading.Thread.Sleep(100)
        Using bm As New Bitmap(PicBoxRect.Width, PicBoxRect.Height)
            Dim g2 As Graphics = Graphics.FromImage(bm)
            g2.DrawImage(ActivePic, PicBoxRect)
            g2.DrawImage(NextPic, New Rectangle(A(0), A(1), A(2), A(3)), _
                                  New Rectangle(A(4), A(5), A(6), A(7)), _
                                  GraphicsUnit.Pixel)
            Dim g As Graphics = PB1.CreateGraphics
            g.DrawImage(bm, PicBoxRect)
        End Using
    End Sub
End Class
Aber:
Der rechte bzw. untere Rand des einblendenden Bildes flackert
Gut zu erkennen, wenn [Threading.Thread.Sleep(100] aktiv

Rechts und links sind Streifen in der Hintergrundfarbe sichtbar (Breite, Höhe 1 Pixel)
Fällt nicht auf, wenn Panel hinter dem Bild mit gleicher Farbe wie Hintergrundfarbe der PictureBox

Was muss ich ändern???
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Manfred X
Datum: 22.06.20 13:14

Hallo!

Ich habe nur einen kurzen Blick auf diesen Code geworfen.
Du verwendest Stringvariable statt Integer? Warum?
Die explizite Datentyp-Konvertierung fehlt. Schalte Option Strict ON
Wenn Du Using-Blöcke für Freigaben (Dispose) verwenden willst,
mußt Du diese Objekte im Using-Statement erstellen und nicht mit Dim
Beispiel:
  Private Sub Fade(Str As String)
        Dim A() As String = Str.Split(","c)
        i += 1
        'Threading.Thread.Sleep(100)
        Using bm As New Bitmap(PicBoxRect.Width, PicBoxRect.Height),
            g2 As Graphics = Graphics.FromImage(bm),
            g As Graphics = pb1.CreateGraphics
 
            g2.DrawImage(ActivePic, PicBoxRect)
            g2.DrawImage(NextPic, New Rectangle(CInt(A(0)), CInt(A(1)), CInt(A( _
              2)), CInt(A(3))),
                                  New Rectangle(CInt(A(4)), CInt(A(5)), CInt(A( _
                                  6)), CInt(A(7))),
                                  GraphicsUnit.Pixel)
            g.DrawImage(bm, PicBoxRect)
        End Using
    End Sub
Pictureboxen sind für die Anzeige zuständig. Zeichne in Bitmaps mit expliziten
Größenangaben und lasse die Boxen aus dem Spiel. Die besitzen ein Eigenleben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Bild-Datei zentriert in eine vorgegebene Fläche einpassen 
Autor: Manfred X
Datum: 22.06.20 14:15

Ich vermute, das ist die Funktion, die Du benötigst.
Der erste Parameter ist der Pfad der Bilddatei, der zweite
Parameter gibt an, in welche Fläche das Bild zentriert eingepasst werden
soll. Die Rückgabe ist eine Bitmap in der Größe des zweiten Parameters,
die das geladene Bild enthält.
Private Function GetPic(filename As String, picsize As Size) As Bitmap
 
        Dim bmpout As Bitmap  
        'Rückgabe-Bitmap (Bild zentriert eingepasst)
 
        Using bmp As New Bitmap(filename)
            'erforderliche Bildgröße berechnen (Zoomen)
            Dim w, h, l, t As Integer
            w = CInt(bmp.Width * picsize.Height / bmp.Height)
            h = picsize.Height
            If w > picsize.Width Then
                h = CInt(bmp.Height * picsize.Width / bmp.Width)
                w = picsize.Width
            End If
            'Bild zentrieren
            l = (picsize.Width - w) \ 2
            t = (pic_size.Height - h) \ 2
 
            'Ausgabebitmap
            bmpout = New Bitmap(pic_size.Width, pic_size.Height)
 
            'Geladenes Bild in erforderlicher Größe neu zeichnen
            Using gout As Graphics = Graphics.FromImage(bmpout)
                gout.InterpolationMode =
                    Drawing2D.InterpolationMode.HighQualityBicubic
                gout.Clear(Color.LightGray) 'Hintergrundfarbe setzen
                gout.DrawImage(bmp,
                            New Rectangle(l, t, w, h),
                            New Rectangle(0, 0, bmp.Width, bmp.Height),
                            GraphicsUnit.Pixel)
            End Using
        End Using
        Return bmpout
 
    End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Dikn
Datum: 23.06.20 13:41

Vielen Dank für Deine Tipps!!!
Ich habe es jetzt so geändert:

Public Class Form4
    Private ActivePic, NextPic As Bitmap
    Private i As Integer = 0
    Private PicSize As Size = New Size(560, 315)
 
    Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ActivePic = GetPic("C:\...\XXX.JPG", PicSize)
        NextPic = GetPic("C:\...\YYY.jpg", PicSize)
        PB1.Image = New Bitmap(ActivePic)
        PB2.Image = New Bitmap(NextPic)
    End Sub
 
    Private Function GetPic(filename As String, picsize As Size) As Bitmap
        Dim bmpout As Bitmap
 
        Using bmp As New Bitmap(filename)
            Dim w, h, l, t As Integer
            w = CInt(bmp.Width * picsize.Height / bmp.Height) 
            h = picsize.Height
            If w > picsize.Width Then
                h = CInt(bmp.Height * picsize.Width / bmp.Width)
                w = picsize.Width
            End If 
            l = (picsize.Width - w) \ 2
            t = (picsize.Height - h) \ 2
 
            bmpout = New Bitmap(picsize.Width + 1, picsize.Height)
 
            Using gout As Graphics = Graphics.FromImage(bmpout)
                gout.InterpolationMode = _
                  Drawing2D.InterpolationMode.HighQualityBicubic
                gout.Clear(Color.Black)
 
                'gout.DrawImage(bmp, New Rectangle(l, t, w, h), _
                        New Rectangle(0, 0, bmp.Width, bmp.Height), _
                        GraphicsUnit.Pixel)
               'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                gout.DrawImage(bmp, New Rectangle(l - 1, t - 1, w + 1, h + 1), _
                        New Rectangle(0, 0, bmp.Width - 1, bmp.Height), _
                        GraphicsUnit.Pixel)
               'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            End Using
        End Using
 
        Return bmpout
    End Function
 
    Private Sub Btn_LR_Click(sender As Object, e As EventArgs) Handles _
      Btn_LR.Click
        i = 0
        Do While i <= 560 / 10
            Fade(0, 0, i * 10, 315, 0, 0, i * 10, 315)
        Loop
    End Sub
 
    Private Sub Btn_OU_Click(sender As Object, e As EventArgs) Handles _
      Btn_OU.Click
        i = 0
        Do While i <= 315 / 10
            Fade(0, 0, 560, i * 10, 0, 0, 560, i * 10)
        Loop
        Fade(0, 0, 560, 315, 0, 0, 560, 315)
    End Sub
 
    Private Sub Btn_L_Click(sender As Object, e As EventArgs) Handles _
      Btn_L.Click
        i = 0
        Do While i <= 560 / 10
            Fade(0, 0, i * 10, 315, 560 - i * 10, 0, i * 10, 315)
        Loop
    End Sub
 
    Private Sub Fade(A0, A1, A2, A3, A4, A5, A6, A7)
         i += 1
        'Threading.Thread.Sleep(100)
        Using bm As New Bitmap(PicSize.Width, PicSize.Height)
            Dim g2 As Graphics = Graphics.FromImage(bm)
            g2.DrawImage(ActivePic, 0, 0, PicSize.Width, PicSize.Height)
            g2.DrawImage(NextPic, New Rectangle(A0, A1, A2, A3), _
                                                   New Rectangle(A4, A5, A6, _
                                                   A7), GraphicsUnit.Pixel)
            Dim g As Graphics = PB1.CreateGraphics
            g.DrawImage(bm, 0, 0, PicSize.Width, PicSize.Height)
        End Using
    End Sub
End Class
Meine Alternative für gout.DrawImage(...) beseitigt die Streifen an den Rändern ???
Der rechte bzw. untere Rand des einblendenden Bildes flackert ???
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Manfred X
Datum: 23.06.20 16:35

Du deklarierst weiterhin Graphics-Objekte mit Dim und gibst sie nicht frei.
Die Freigabe am Ende des Using-Blockes bezieht sich nur auf Objekte, die
im Using-Statement erstellt worden sind.
Du verwendest immer noch die Picturebox-Graphic zum Zeichnen. Das ist unnötig
und schafft eventuell weitere Rundungen wegen des Zoom.
Die Bidgröße wird bereits in GetPic angepasst. Abhängig vom Seitenverhältnis
entstehen dabei Ränder, wenn das gesamte Bild in der vorgegebene Fläche
angezeigt werden soll.

Deine Rechnungen nützen so nichts.
Bei Reskalierung von Bildern treten Dezimalbrüche auf und es wird
auf ganze Zahlen gerundet. Dabei kann ein Unterschied von einem Pixel auftreten.

Um das zu verhindern, müßtest Du den Code in "GetPic" in zwei Funktionen aufteilen.
Eine Funktion, die jeweils die eingepaßte Bildgröße berechnet und als Parameter zurück
gibt (t,l,w,h). Diese Werte bei beiden Bildern sind zu vergleichen und ggf. anzupassen.
Der zweiten Funktion, sind diese angepaßten Größen als Parameter zu übergeben und
das Bild ist zu zeichnen. Eines der beiden Bilder wird dadurch um einen Pixel
gestreckt.

Windows-Forms-Formular:
Public Class frmFader
 
 
    Dim pic_size As New Size(1920, 1080)
 
    Dim bmp1, bmp2 As Bitmap
 
    Dim pb As New PictureBox With {.Parent = Me, 
        .Size = New Drawing.Size(400, 400),
        .Top = 10, .Left = 10, 
        .SizeMode = PictureBoxSizeMode.Zoom}
 
    Dim WithEvents tm As New Timer With {.Interval = 500, .Enabled = False}
 
 
    Private Sub frmFader_Load(sender As Object, e As EventArgs) Handles _
      MyBase.Load
 
 
        Dim r1 As Rectangle = GetPicRect("G:\daten\x1.jpg", pic_size)
        Dim r2 As Rectangle = GetPicRect("G:\daten\x2.jpg", pic_size)
 
        If Math.Abs(r1.Width - r2.Width) < 3 And 
            Math.Abs(r1.Height - r2.Height) < 3 Then
            r2 = r1
        End If
 
        bmp1 = DrawPic("G:\daten\x1.jpg", pic_size, r1)
        bmp2 = DrawPic("G:\daten\x2.jpg", pic_size, r2)
 
        tm.Enabled = True
    End Sub
 
 
    Private Function GetPicRect(filename As String, picsize As Size) As _
      Rectangle
        Dim w, h, l, t As Integer
        Using bmp As New Bitmap(filename)
            'erforderliche Bildgröße berechnen (Zoomen)
 
            w = CInt(bmp.Width * picsize.Height / bmp.Height)
            h = picsize.Height
            If w > picsize.Width Then
                h = CInt(bmp.Height * picsize.Width / bmp.Width)
                w = picsize.Width
            End If
            'Bild zentrieren
            l = (picsize.Width - w) \ 2
            t = (pic_size.Height - h) \ 2
        End Using
 
        Return New Rectangle(l, t, w, h)
    End Function
 
 
    Private Function DrawPic(filename As String, picsize As Size, 
        picrect As Rectangle) As Bitmap
 
        Dim bmpout As New Bitmap(picsize.Width, pic_size.Height)
 
        Using bmp As New Bitmap(filename)
            'Ausgabebitmap
 
            'Geladenes Bild in erforderlicher Größe neu zeichnen
            Using gout As Graphics = Graphics.FromImage(bmpout)
                gout.InterpolationMode =
                    Drawing2D.InterpolationMode.HighQualityBicubic
                gout.Clear(Color.LightGray)
                gout.DrawImage(bmp,
                            picrect,
                            New Rectangle(0, 0, bmp.Width, bmp.Height),
                            GraphicsUnit.Pixel)
            End Using
        End Using
        Return bmpout
    End Function
 
 
    Private Sub Fade(ByVal Alpha As Single)
        Dim ColMat As New System.Drawing.Imaging.ColorMatrix _
        With {.Matrix33 = Alpha}            ' 
 
        Using bmp As New Bitmap(pic_size.Width, pic_size.Height),
                g As Graphics = Graphics.FromImage(bmp),
                imgAtt As New System.Drawing.Imaging.ImageAttributes
 
            imgAtt.SetColorMatrix(ColMat)
 
            ' Bild deckend in Buffer zeichnen
            g.DrawImage(bmp1, 0, 0)
            ' neues Bild transparent
            ' in Buffer zeichnen
            Dim r As New Rectangle(0, 0, pic_size.Width, pic_size.Height)
            g.DrawImage(bmp2, r, 0, 0, pic_size.Width, pic_size.Height,
                        GraphicsUnit.Pixel, imgAtt)
 
            If pb.Image IsNot Nothing Then pb.Image.Dispose()
            pb.Image = DirectCast(bmp.Clone, Bitmap)
        End Using
 
    End Sub
 
 
    Private Sub tm_Tick(sender As Object, e As EventArgs) Handles tm.Tick
 
        Static alpha As Single = 0
        alpha += CSng(0.1)
        If alpha > 1 Then alpha = 0
        Fade(alpha)
    End Sub
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Dikn
Datum: 25.06.20 12:26

Hallo Manfred X!

Vielen, vielen Dank für Deine Mühe!!!
Ich hab's ausprobiert -> funktioniert prima

aber: Rechts ist ein Streifen in der Hintergrundfarbe sichtbar (Breite 1 Pixel)
verschwindet, wenn pic_size (1920, 1080) geändert in (1919, 1080)

Neu:
Ich möchte ein Bild von "Links" nach "Rechts" auf ein Bild einschieben
Mein Code Funktioniert, ist aber sehr langsam. (Timer.Interval = 10, Verschiebung: 20)

Private Sub FadeLR()
        i += 1
 
        Using bmp As New Bitmap(pic_size.Width, pic_size.Height), _
                                g As Graphics = Graphics.FromImage(bmp)
            g.DrawImage(bmp1, 0, 0)
 
            Dim r As New Rectangle(-pic_size.Width + i * 20, 0, _
                                   pic_size.Width, pic_size.Height)
 
            If i >= pic_size.Width / 20 Then
                r = New Rectangle(0, 0, pic_size.Width, pic_size.Height)
                Timer2.Enabled = False
            End If
 
            pb.Image = DirectCast(bmp.Clone, Bitmap)
            g.DrawImage(bmp2, r, 0, 0, pic_size.Width, pic_size.Height, _
                        GraphicsUnit.Pixel)
 
            If pb.Image IsNot Nothing Then pb.Image.Dispose()
            pb.Image = DirectCast(bmp.Clone, Bitmap)
        End Using
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Animation: Bild in Picturebox verschieben 
Autor: Manfred X
Datum: 25.06.20 13:34

Wenn es nur um die Animation (= temporäre Anzeige) des Bildes geht,
kannst Du direkt in die Picturebox zeichen.
Public Class frmPicMove
 
    Dim bmp As Bitmap
    Dim bmp_rect As Rectangle
 
    Dim WithEvents timMove As New Timer With 
         {.Interval = 50, .Enabled = False}
    Dim WithEvents btnStart As New Button With 
         {.Parent = Me, .Width = 150, .Text = "Move"}
    Dim WithEvents pbMove As New PictureBox With 
        {.Parent = Me, .Top = 50,
        .SizeMode = PictureBoxSizeMode.Zoom}
 
    Dim startleft As Integer, anim_left As Integer
 
 
    Private Sub frmPicMove_Load(sender As Object, 
                          e As EventArgs) Handles MyBase.Load
 
        Me.Width = 1050
        Me.Height = 550
 
        pbMove.Width = Me.Width - 20
        pbMove.Height = Me.ClientSize.Height - (btnStart.Top + btnStart.Height _
          + 20)
 
        'anzuzeigende Bilddatei
        Dim picfile As String = "G:\Daten\x1.jpg"
 
        'in Box eingepaßte Bildgröße berechnen (Funktion von oben)
        bmp_rect = GetPicRect(picfile, pbMove.Size)
 
        'Bild aus Datei in passender Größe erstellen
        Using bmp_orig As New Bitmap(picfile)
            bmp = New Bitmap(bmp_orig, New Size(bmp_rect.Width, _
              bmp_rect.Height))
        End Using
 
        pbMove.BackColor = Color.Yellow
 
        'linke Bildposition in der Box zum Verschieben
        'Die Box muss dabei wesentlichbreiter sein als das eingepaßte Bild
        startleft = pbMove.Width - bmp.Width
        anim_left = startleft + 5
 
    End Sub
 
 
    Private Sub pbMove_Paint(sender As Object, e As PaintEventArgs) Handles _
      pbMove.Paint
 
        'aktuelles Bildrechteck in der Box
        Dim rect_paint As New Rectangle(anim_left, 0, bmp_rect.Width, _
          bmp_rect.Height)
 
        e.Graphics.Clear(Color.Yellow)
        e.Graphics.DrawImage(bmp, rect_paint, New Rectangle(0, 0, bmp.Width, _
          bmp.Height),
                             GraphicsUnit.Pixel)
    End Sub
 
 
 
    Private Sub timMove_Tick(sender As Object, e As EventArgs) Handles _
      timMove.Tick
 
        'um 5 Pixel nach links verschieben
        anim_left -= 5
        If anim_left < 0 Then anim_left = startleft
        'neu zeichnen lassen (Paint wird gerufen) 
        pbMove.Invalidate()
 
    End Sub
 
 
    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles _
      btnStart.Click
 
        timMove.Enabled = Not timMove.Enabled
    End Sub
End Class


Beitrag wurde zuletzt am 25.06.20 um 13:46:29 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Dikn
Datum: 26.06.20 08:48

Sorry!
Ich habe das anders gemeint:

In der Picturebox „PB1“ wird das Bild „x1.jpg“ angezeigt.

Pb1: W= 560/H= 315 – W/H=1.7777…
X1.jpg: W=1920/H=1080 – W/H=1.7777…
X2.jpg: W= 561/H= 637 – W/H=0.8806…

Bild „x2“ wurde mittig auf eine schwarze Fläche platziert.
Jetzt soll diese schwarze Fläche mit dem mittig platzierten Bild von links nach rechts über das Bild „x1“ eingeschoben werden bis Bild „x1“ nicht mehr sichtbar ist.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Manfred X
Datum: 26.06.20 11:40

Worum geht es in Deinem Programm?
Sollen Bilddaten bearbeitet werden, um diese Bilder zu speichern
oder sie im Code weiterzuverarbeiten?
Oder sollen irgendwelche Effekte am Bildschirm realisiert werden,
ohne dass eine Bearbeitung der Bild-Daten zu erfolgen braucht.

Die erste Variante erledigt man durch die Berechnung von Größe und
Position im Code und die entsprechende Gestaltung von Bitmap-Objekten
durch das Graphics-Objekt (FromImage in der Bitmap).
Die zweite Variante erledigt man durch Verwendung der Zeichenoberfläche
der Picturebox, wie im letzten Beispiel gezeigt (Invalidate, Paint,
Graphics-Objekt der Picturebox).

Erstelle zunächst zwei Bitmaps in geeigneter Größe, wie im letzten Beispiel
bereits gezeigt.
Zeichne die jeweils benötigten Abschnitte dieser beiden Bitmaps
in der Picturebox, wie im letzten Beispiel gezeigt (Timersteuerung der
Bildposition).

Du besitzt alle Mittel, die Du benötigst. Jetzt muss Du nur noch
einige Anpassungen programmieren (Gestaltung der Paint-Methode der
Picturebox - zwei e.graphics-Anweisungen.)
Wo genau liegt das Problem?

Beitrag wurde zuletzt am 26.06.20 um 11:54:53 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Animation: Bild über Bild schieben 
Autor: Manfred X
Datum: 26.06.20 12:26

Public Class frmPicMove
 
    Dim bmp As Bitmap
    Dim bmp_rect As Rectangle
 
    Dim WithEvents timMove As New Timer With 
         {.Interval = 50, .Enabled = False}
    Dim WithEvents btnStart As New Button With 
         {.Parent = Me, .Width = 150, .Text = "Move"}
    Dim WithEvents pbMove As New PictureBox With 
        {.Parent = Me, .Top = 50,
        .SizeMode = PictureBoxSizeMode.Zoom}
 
 
    Dim startleft, stopleft, anim_left As Integer
 
 
    Private Sub frmPicMove_Load(sender As Object, 
               e As EventArgs) Handles MyBase.Load
 
        Me.Width = 1050
        Me.Height = 550
 
        pbMove.Width = Me.Width - 20
        pbMove.Height = 
             Me.ClientSize.Height - (btnStart.Top + btnStart.Height + 20)
 
        Dim picfile As String = "G:\Daten\x1.jpg"
 
        bmp_rect = BitmapFunctions.GetPicRect(picfile, pbMove.Size)
 
        Using bmp_orig As New Bitmap(picfile)
            bmp = New Bitmap(bmp_orig, 
               New Size(bmp_rect.Width, bmp_rect.Height))
        End Using
 
        'Das Bild im Hintergrund in die Image der Picturebox
        pbMove.Image = bmp
 
 
        startleft = -bmp.Width
        stopleft = bmp_rect.Left
        anim_left = startleft - 5
 
    End Sub
 
 
    Private Sub pbMove_Paint(sender As Object, 
        e As PaintEventArgs) Handles pbMove.Paint
 
        Dim rect_paint As New Rectangle(anim_left, 0, bmp.Width, bmp.Height)
 
        'Das animierte Bild in die Zeichenebene der Picturebox
        e.Graphics.DrawImage(bmp, rect_paint, 
                             New Rectangle(0, 0, bmp.Width, bmp.Height),
                             GraphicsUnit.Pixel)
    End Sub
 
 
    Private Sub timMove_Tick(sender As Object, e As EventArgs) Handles _
      timMove.Tick
 
        anim_left += 5
        If anim_left >= stopleft Then
            timMove.Enabled = False
            anim_left = startleft - 5
        Else
            pbMove.Invalidate()
        End If
 
    End Sub
 
 
    Private Sub btnStart_Click(sender As Object, 
           e As EventArgs) Handles btnStart.Click
 
        timMove.Enabled = Not timMove.Enabled
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Dikn
Datum: 28.06.20 13:50

Ich habe eine Bildschau von einem Architekturentwurf erstellt.
Es werden CAD-Zeichnungen, 3D-Bilder und 3D-Videos von Außen und Innen in einer vorgegebenen Reihenfolge automatisch angezeigt.
Die Videos zeigen Wege um bzw. durch das Gebäude.
Die Bilder können in vorgegebenen unterschiedlichen Zeiten angezeigt werden.
Gleichzeitig ist eine Bildbeschreibung unterhalb der PictureBox sichtbar.

Nun möchte ich noch die Bilder unterschiedlich überblenden.

Mein letzter Stand:
Public Class Form1
    Private Bmp As Bitmap
    Private PB_Size As Size = New Size(560, 315)
    Private PicLeft As Integer
    Private PicExpan As Integer = 5
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        PbMove.Image = GetPic("C:\...\Pic1.jpg", PB_Size)
        Bmp = GetPic("C:\...\Pic2.jpg", PB_Size)
        StartLeft = -Bmp.Width
        PicLeft = StartLeft - PicExpan
    End Sub
 
    Private Sub BtnStart_Click(sender As Object, e As EventArgs) Handles _
      BtnStart.Click
        PicLeft = -Bmp.Width - PicExpan
 
        If TimerMove.Enabled = False Then
            TimerMove.Enabled = True
            BtnStart.Text = "Stop"
        Else
            TimerMove.Enabled = False
            BtnStart.Text = "Start"
        End If
    End Sub
 
    Private Function GetPic(FileName As String, PicSize As Size) As Bitmap
        Dim BmpOut As Bitmap
 
        Using Bmp As New Bitmap(FileName)
            Dim w, h, l, t As Integer
            w = CInt(Bmp.Width * PicSize.Height / Bmp.Height) + 1
            h = PicSize.Height + 1
            If w > PicSize.Width Then
                h = CInt(Bmp.Height * PicSize.Width / Bmp.Width) + 1
                w = PicSize.Width + 1
            End If
 
            l = ((PicSize.Width - w) \ 2) - 1
            t = ((PicSize.Height - h) \ 2) - 1
 
            BmpOut = New Bitmap(PicSize.Width, PicSize.Height)
 
            Using gout As Graphics = Graphics.FromImage(BmpOut)
                'gout.InterpolationMode = 
                ' Drawing2D.InterpolationMode.HighQualityBicubic
                gout.Clear(Color.Black)
                gout.DrawImage(Bmp, New Rectangle(l, t, w, h), New Rectangle(0, _
                  0, Bmp.Width, Bmp.Height), GraphicsUnit.Pixel)
            End Using
        End Using
 
        Return BmpOut
    End Function
 
    Private Sub PbMove_Paint(sender As Object, e As PaintEventArgs) Handles _
      PbMove.Paint
        Dim Rect_Paint As New Rectangle(PicLeft, 0, Bmp.Width, Bmp.Height)
        e.Graphics.DrawImage(Bmp, Rect_Paint, New Rectangle(0, 0, Bmp.Width, _
          Bmp.Height), GraphicsUnit.Pixel)
    End Sub
 
    Private Sub TimMove_Tick(sender As Object, e As EventArgs) Handles _
      TimerMove.Tick
        If PicLeft >= 0 Then
            TimerMove.Enabled = False
            PicLeft = 0
            PbMove.Invalidate()
            BtnStart.Text = "Start"
        Else
            PicLeft += PicExpan
            PbMove.Invalidate()
        End If
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bild auf Bild einblenden 
Autor: Dikn
Datum: 28.06.20 14:04

Fehler in TimMove_Tick:

If PicLeft >= 0 Then... ---> If PicLeft > -PicExpan Then...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel