vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 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
Bilder ü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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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