| |
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 |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. 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
|