| |
VB.NET - FortgeschritteneBilder überblenden | | | Autor: Dikn | Datum: 22.05.20 12:35 |
| Hallo!
Ich möchte Bilder mit unterschiedlicher Größüe überblenden.
Das funktioniert hiermit ganz gut:
Imports System.Drawing.Imaging
Public Class Form1
Private ActivePic As Bitmap = New Bitmap("C:\...\xxx.jpg") _
' 1920/1080 - 1.7777...
Private NextPic As Bitmap = New Bitmap("C:\...\yyy.JPG") _
' 561/637
Private PicBoxRect As Rectangle = New Rectangle(0, 0, 624, 351) _
' 624/351 - 1.7777...
Private Alpha As Single = 0
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim bmp As New Bitmap(PicBox1.Width, PicBox1.Height)
PicBox1.Image = ActivePic _
' 1920/1080 - 1.7777...
PicBox1.DrawToBitmap(bmp, New Rectangle(0, 0, PicBox1.Width, _
PicBox1.Height))
ActivePic = New Bitmap(bmp)
PicBox1.Image = ActivePic _
' 1920/1080 - 1.7777...
PicBox2.Image = NextPic _
' 1920/1080 - 1.7777...
bmp = New Bitmap(PicBox2.Width, PicBox2.Height)
PicBox2.DrawToBitmap(bmp, New Rectangle(0, 0, PicBox2.Width, _
PicBox2.Height))
NextPic = New Bitmap(bmp)
bmp.Dispose()
End Sub
Private Sub BtnFade_Click(sender As Object, e As EventArgs) Handles _
BtnFade.Click ' Timer!!!
Alpha += 0.05
If Alpha >= 1.0 Then
BtnFade.Enabled = False
ActivePic = NextPic
PicBox1.Image = PicBox2.Image '
' sonst kleine Fehlstellen ?????????
End If
Call Fade(Alpha)
TB1.Text = Alpha
End Sub
Private Sub Fade(ByVal Alpha As Single)
Dim ColMat As New ColorMatrix With {.Matrix33 = Alpha} '
' Farbmatrix anlegen
Dim imgAtt As New ImageAttributes() '
' Bildattribute anlegen
imgAtt.SetColorMatrix(ColMat)
Dim bm As New Bitmap(PicBoxRect.Width, PicBoxRect.Height) '
' Buffer Zeichenoperationen 624/351
Dim g2 As Graphics = Graphics.FromImage(bm) '
' Graphics-Objekt für Buffer holen
' Bild deckend in Buffer zeichnen
g2.DrawImage(ActivePic, PicBoxRect)
' neues Bild transparent
' in Buffer zeichnen
g2.DrawImage(NextPic, PicBoxRect, 0, 0, NextPic.Size.Width, _
NextPic.Size.Height, GraphicsUnit.Pixel, imgAtt)
Dim g As Graphics = PicBox1.CreateGraphics '
' Ergebnis auf Picturbox ausgeben
g.DrawImage(bm, PicBoxRect)
g2.Dispose() '
' entsorgungen
imgAtt.Dispose()
bm.Dispose()
End Sub
End Class wie entstehen die Fehlstellen?
was kann man vereinfachen, verbessern? | |
Re: Bilder überblenden | | | Autor: Manfred X | Datum: 23.05.20 21:18 |
| Hallo!
Dein Code scheint weder die Größe noch die Seitenverhältnisse
der beiden Bilder zu beachten, von weiteren Bild-Eigenschaften
ganz abgesehen (BytePerPixel etc.).
Wieso benutzt Du keine Using-Blöcke?
In der Routine btnFade_Click wird "g" (Graphics) nicht freigegeben (Dispose).
Das Graphics-Objekt kann über weitere Eigenschaften eingerichtet werden:
z.b. Interpolationmode oder Smoothingmode.
Zeichne nicht in Pictureboxen, sondern in Bitmap-Objekten und weise sie
den Controls zu.
Beitrag wurde zuletzt am 23.05.20 um 21:19:29 editiert. | |
Re: Bilder überblenden | | | Autor: Dikn | Datum: 24.05.20 07:48 |
| Hallo Manfred X!
Vielen Dank für Deine rasche Antwort!
Aber folgende Fragen zu Deinen Bemerkungen:
Dein Code scheint weder die Größe noch die Seitenverhältnisse
der beiden Bilder zu beachten
PictureBox.SizeMode Eigenschaft: Zoom
-> „Wenn Sie den Zoom Wert verwenden, wird das Bild gestreckt oder verkleinert, damit es dem
PictureBoxentspricht.
Das Seitenverhältnis in der ursprünglichen wird jedoch beibehalten.“
von weiteren Bild-Eigenschaften ganz abgesehen (BytePerPixel etc.).
Welche???
Wieso benutzt Du keine Using-Blöcke?
Wo kann ich die verwenden??
In der Routine btnFade_Click wird "g" (Graphics) nicht freigegeben (Dispose).
??? In [btnFade_Click] wird „g“ nicht verwendet
Das Graphics-Objekt kann über weitere Eigenschaften eingerichtet werden:
z.b. Interpolationmode oder Smoothingmode.
???
Zeichne nicht in Pictureboxen, sondern in Bitmap-Objekten und weise sie
den Controls zu.
Die Bitmaps der Pictureboxen haben die gleiche Größe. -> Einfache Überblendung
| |
Bilder überblenden - Beispiel | | | Autor: Manfred X | Datum: 24.05.20 10:09 |
| Ein simples Beispiel ohne Beachtung der Seitenverhältnisse der
Bilder
Public Class frmFader
Dim bmp1, bmp2 As Bitmap
Dim sz As Size = New Size(300, 300) 'Größe der Bildanzeige
Dim pb As New PictureBox With
{.Parent = Me, .Size = sz, .Top = 10, .Left = 10}
Dim WithEvents tm As New Timer With {.Interval = 500, .Enabled = False}
Private Sub frmFader_Load(sender As Object, e As EventArgs) Handles _
MyBase.Load
bmp1 = New Bitmap("G:\daten\x1.jpg") 'Hier zwei Bilddateien angeben
bmp2 = New Bitmap("G:\daten\x2.jpg")
'Bilder in Größe abschneiden (oder stretchen)
'und Parameter vereinheitlichen (24er - 3 Byte pro Pixel)
Using bmp As New Bitmap(sz.Width, sz.Height,
System.Drawing.Imaging.PixelFormat.Format24bppRgb),
g As Graphics = Graphics.FromImage(bmp)
g.InterpolationMode =
Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(bmp1, 0, 0, sz.Width, sz.Height)
bmp1 = bmp.Clone
g.DrawImage(bmp2, 0, 0, sz.Width, sz.Height)
bmp2 = bmp.Clone
End Using
tm.Enabled = True
End Sub
Private Sub Fade(ByVal Alpha As Single)
Dim ColMat As New System.Drawing.Imaging.ColorMatrix _
With {.Matrix33 = Alpha} '
' Farbmatrix anlegen
Dim imgAtt As New System.Drawing.Imaging.ImageAttributes() _
'
' Bildattribute anlegen
imgAtt.SetColorMatrix(ColMat)
Using bmp As New Bitmap(sz.Width, sz.Height),
g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bmp1, 0, 0, sz.Width, sz.Height)
g.DrawImage(bmp2, New Rectangle(0, 0, sz.Width, sz.Height),
0, 0, sz.Width, sz.Height,
GraphicsUnit.Pixel, imgAtt)
If pb.Image IsNot Nothing Then pb.Image.Dispose()
pb.Image = bmp.Clone
End Using
End Sub
Private Sub tm_Tick(sender As Object, e As EventArgs) Handles tm.Tick
Static alpha As Single = 0
alpha += 0.1
If alpha > 1 Then alpha = 0
Fade(alpha)
End Sub
End Class
Beitrag wurde zuletzt am 24.05.20 um 10:27:23 editiert. | |
Re: Bilder überblenden - Beispiel | | | Autor: Dikn | Datum: 26.05.20 09:26 |
| Hallo Manfred X!
Vielen, vielen Dank für Dein Beispiel!!!
Noch eine Frage:
Meine Bilder haben normalerweise ein Verhältnis Breite/Höhe = 1.777...
Diese lassen sich problemlos überblenden.
Bilder mit einem anderen Verhältnis werden in Deiner Version gestreckt.
In meiner Version habe ich das Bild erst in eine PictureBox mit SizeMode = Zoom geladen,
dann davon ein Bitmap erstellt -> Überblendung OK.
Wie kann ich das in Deiner Version erreichen? | |
Re: Bilder überblenden - Beispiel | | | Autor: Manfred X | Datum: 26.05.20 10:19 |
| Hallo!
Wenn Du Bilder mit unterschiedlichen Seitenverhältnissen durch einen Zoom
in der Größe einander anpasst, erhälst Du entweder oben/unten oderlinks/rechts
einen Rand.
Um das zu vermeiden, mußt Du überstehende Bereiche der Bilder abschneiden.
Das erledigt folgende Routine.
''' <summary>Bilddatei in einer vorgegebenen Größe einpassen
''' (Ränder werden ggf. abgeschnitten)
''' </summary>
''' <param name="file">Bilddatei</param>
''' <param name="sz">Zielgröße (Breite, Höhe in Pixel)</param>
''' <param name="pixfmt">Pixelformat des Ausgabe-Bildes</param>
Public Shared Function LoadPic(ByVal file As String, ByVal sz As Size,
Optional ByVal CutMode As CutModeEnum = CutModeEnum.center,
Optional ByVal pixfmt As PixelFormatEnum =
PixelFormatEnum.Format24bppRgb) As Bitmap
Dim adj_width, adj_height, adj_top, adj_left As Integer
Dim bmp_out As Bitmap = Nothing
Try
If sz.Width < 10 Or sz.Height < 10 Then Return Nothing
Dim sv As Double = sz.Width / sz.Height
Using bmp_in As New Bitmap(file)
Dim bsv As Double = bmp_in.Width / bmp_in.Height
If sv < bsv Then
'Bild ist für Display-Size zu breit
adj_width = CInt(bmp_in.Height * sv)
adj_height = bmp_in.Height
If CutMode = CutModeEnum.center Then
adj_left = (bmp_in.Width - adj_width) \ 2
ElseIf CutMode = CutModeEnum.topleft Then
adj_left = bmp_in.Width - adj_width
ElseIf CutMode = CutModeEnum.bottomright Then
adj_left = 0
ElseIf cutmode = CutModeEnum.topleft25 Then
adj_left = CInt(0.25 * (bmp_in.Width - adj_width))
ElseIf cutmode = CutModeEnum.bottomright25 Then
adj_left = CInt(0.75 * (bmp_in.Width - adj_width))
End If
Else
'Bild ist für Display eventuell zu hoch
adj_height = CInt(bmp_in.Width / sv)
adj_width = bmp_in.Width
If CutMode = CutModeEnum.center Then
adj_top = (bmp_in.Height - adj_height) \ 2
ElseIf CutMode = CutModeEnum.topleft Then
adj_top = bmp_in.Height - adj_height
ElseIf CutMode = CutModeenum.bottomright Then
adj_top = 0
ElseIf CutMode = CutModeEnum.topleft25 Then
adj_top = CInt(0.25 * (bmp_in.Height - adj_height))
ElseIf CutMode = CutModeEnum.bottomright25 Then
adj_top = CInt(0.75 * (bmp_in.Height - adj_height))
End If
End If
'Ausgabe-Bitmap in gewünschter Größe und Format
bmp_out = New Bitmap _
(sz.Width, sz.Height, CType(pixfmt, Imaging.PixelFormat))
Dim dest_rect As New Rectangle(0, 0, sz.Width, sz.Height)
'erforderlichen Ausschnitt des Bildes definieren
Dim src_rect As New Rectangle(adj_left, adj_top,
adj_width, adj_height)
Using g As Graphics = Graphics.FromImage(bmp_out)
'qualitative hochwertige Anpassung
g.InterpolationMode = _
Drawing2D.InterpolationMode.HighQualityBicubic
'ggf. Zoomen und Zuschneiden
g.DrawImage(bmp_in, dest_rect, src_rect, GraphicsUnit.Pixel)
End Using
End Using
Catch ex As exception
If bmp_out IsNot Nothing Then bmp_out.Dispose()
bmp_out = Nothing
End Try
Return bmp_out
End Function Benötigte Enumerationen:
''' <summary>Position der abgeschnittenen Streifen
''' </summary>
Public Enum CutModeEnum
center = 0
topleft = 1
bottomright = 2
topleft25 = 3
bottomright25 = 4
End Enum
Public Enum PixelFormatEnum
Format16bppRgb555 = Imaging.PixelFormat.Format16bppRgb555 '
Format16bppRgb565 = PixelFormat.Format16bppRgb565
Format24bppRgb = PixelFormat.Format24bppRgb
Format32bppRgb = PixelFormat.Format32bppRgb
Format32bppPArgb = PixelFormat.Format32bppPArgb
Format48bppRgb = PixelFormat.Format48bppRgb
Format64bppPArgb = PixelFormat.Format64bppPArgb
Format32bppArgb = PixelFormat.Format32bppArgb
Format64bppArgb = PixelFormat.Format64bppArgb
End Enum | |
Re: Bilder überblenden | | | Autor: Dikn | Datum: 28.05.20 10:17 |
| Hallo!
Mit Deinem Beispiel kann man Bereiche eines Bildes anzeigen. Ich brauche aber zum Überblenden das ganze Bild.
Ich habe in meiner Form eine PictureBox [PB1] in der ich Bilder überblenden möchte.
In einer weiteren PictureBox [PB2] mit SizeMode = Zoom hinter [PB1] (also nicht sichtbar) wird das Bild vollständig mittig angezeigt. Hiervon wird ein Bitmap erstellt und kann dann zum Überblenden verwendet werden.
'Pb1/PB2.Width = 624, Pb1/PB2.Height = 351
Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load
PB2.Image = Image.FromFile("C:\xxx\yyy.JPG")
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
Dim bmp As New Bitmap(624, 351)
' wandelt die Innenfläche der PictureBox [PB2] in ein
' Bitmap um
PB2.DrawToBitmap(bmp, New Rectangle(0, 0, 624, 351))
' PictureBox [PB1] zuweisen bzw. für Überblendung nutzen
PB1.Image = New Bitmap(bmp)
' PictureBox [PB1] zuweisen bzw. für Überblendung nutzen
End Sub Nochmal Dank für Deine Mühe! | |
Re: Bilder überblenden | | | Autor: Kuno60 | Datum: 28.05.20 14:05 |
| Hallo Dikn,
ich habe jetzt deinen ersten Code getestet, mit 2 gleich großen PictureBoxen.
SizeMode = PictureBoxSizeMode.Zoom
BackColor = Color.Black
BorderStyle = BorderStyle.None
PicBoxRect = PicBox1.ClientRectangle dabei geht das Überblenden völlig Problemlos, auch mit unterschiedlich großen Bildern und verschiedenen Seitenverhältnissen.
Auch bei deaktivieren der Zeile:
PicBox1.Image = PicBox2.Image ' sonst kleine Fehlstellen ?????????
Wo also genau liegt dein Problem? | |
Re: Bilder überblenden | | | Autor: Dikn | Datum: 29.05.20 08:23 |
| Hallo Kuno!
Meine Frage war:
"was kann man vereinfachen, verbessern?"
Hierzu gab es gute Tipps von Manfred X | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|