| |
VB.NET - FortgeschritteneBild 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??? | |
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. | |
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 | |
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 ??? | |
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 | |
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 | |
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. | |
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. | |
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. | |
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 | |
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 | |
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... | |
| 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 |
|
|
sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|