vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 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 aus verschiedenen PictureBoxen zusammenfügen 
Autor: RedFrog
Datum: 01.12.17 12:13

Wow, habe gerade gesehen, dass ich mich das letzte Mal im 2005 in dieses Forum eingalogt habe.
Habe eben wieder Lust bekommen und möchte eine neue Herausforderung angehen.

Und zwar habe ich zwei PictureBoxen übereinander mit unterschiedlichen Bildern.
Nun möchte ich die beiden Bilder zusammenfügen und als ein neues Bild speichern.
Ein Verlust der Auflösung wäre nicht schlimm.

Habt ihr eine Idee wie ich das anstellen könnte?

Danke und Gruss.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: Manfred X
Datum: 01.12.17 12:19

Hallo!

Was verstehst Du unter "Zusammenfügen"?
Nebeneinander/Untereinander?
Teil-Transparent Übereinander?
Per Farbcode die Bild-Pixel kombinieren?

Sind diese Bilder gleich groß? Einpassung? Seitenverhältnis?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: RedFrog
Datum: 01.12.17 12:24

Hi,

die beiden Teilbilder sollen nebeneinander zusammangefügt werden, so dass aus zwei Teilbilder ein ganzes entsteht.

Gruss
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: Manfred X
Datum: 01.12.17 12:28

Ok.

Aber wie sollen Größenunterschiede behandelt werden?
Größe beibehalten und ggf. einen leeren Bereich im Zielbild akzeptieren?
Anpassung auf gemeinsame Höhe vornehmen (des größeren oder kleineren Bildes)?
Seitenverhältnis der Bilder dabei beibehalten?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: RedFrog
Datum: 01.12.17 12:52

Die Teilbilder haben immer die gleiche Breite in Pixel.
Jedoch unterscheiden sie sich in der Höhe.
Das Seitenverhältnis der Teilbilder muss beibehalten werden.
Ein leerer Bereich vom Zielbild, z. B. unten wird akzeptiert.
Ein kleiner, gleichmässiger Abstand zwischen den Teilbildern (so wie im Beispiel) würde auch akzeptiert werden.

Hier ein Beispiel mit drei Teilbilder:
https://fotos.mtb-news.de/p/2219268?in=set

Beitrag wurde zuletzt am 01.12.17 um 12:54:28 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: Manfred X
Datum: 01.12.17 13:05

Ich habe auf die Schnelle in meinem BitmapStuff eine Methode gefunden,
bei der das kleinere Bild (Höhe) auf die Höhe des größeren Bildes
gezoomt wird.

Probier mal, ob Du das für Deine Zwecke umbauen kannst:
 Public Function ZoomBitmap(bmp As Bitmap, new_height As Integer) As Bitmap
 
     If bmp.Height = new_height Then Return DirectCast(bmp.Clone, Bitmap)
 
     Dim rect_source As New Rectangle(0, 0, bmp.Width, bmp.Height)
 
     Dim new_width As Integer = CInt(new_height / bmp.Height * bmp.Width)
     Dim rect_zoom As New Rectangle(0, 0, new_width, new_height)
 
     Dim bmp_zoom As New Bitmap(new_width, new_height)
     Using g As Graphics = Graphics.FromImage(bmp_zoom)
        g.DrawImage(bmp, rect_zoom, rect_source, Drawing.GraphicsUnit.Pixel)
     End Using
     Return bmp_zoom
 End Function
 
 
Public Function CombineBitmaps(bmp_left As Bitmap, _
      bmp_right As Bitmap) As Bitmap
 
     Dim new_height As Integer = Math.Max(bmp_left.Height, bmp_right.Height)
     Dim new_width As Integer = bmp_left.Width + bmp_right.Width
 
     Dim bmp_combine As New Bitmap(new_width, new_height)
 
     Using bmp_left_zoom As Bitmap = ZoomBitmap(bmp_left, new_height),
        bmp_right_zoom As Bitmap = ZoomBitmap(bmp_right, new_height), _
        g As Graphics = Graphics.FromImage(bmp_combine)
 
        g.DrawImage(bmp_left_zoom, 0, 0)
        g.DrawImage(bmp_right_zoom, bmp_left_zoom.Width, 0)
     End Using
     Return bmp_combine
 End Function
Anwendung:

"pb" ist eine Picturebox.
Die zu kombinierenden Bilddateien nennen sich "ew.jpg" und "ks.jpg".
      pb.Image = _
      CombineBitmaps _
        (New Bitmap("C:\daten\ew.jpg"), New Bitmap("C:\daten\ks.jpg"))
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: RedFrog
Datum: 01.12.17 13:25

Vielen Dank für die schnelle Hilfe. Mit diesem Code komme ich weiter.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: Manfred X
Datum: 01.12.17 13:39

Hier noch eine Version, die auch die Breite des Zielbildes an die
gezoomte Breite der Teilbilder anpasst:
Public Shared Function CombineBitmaps(bmp_left As Bitmap, _
   bmp_right As Bitmap) As Bitmap
 
   Dim new_height As Integer = Math.Max(bmp_left.Height, bmp_right.Height)
   Dim bmp_combine As Bitmap
 
   Using bmp_left_zoom As Bitmap = ZoomBitmap(bmp_left, new_height), _
      bmp_right_zoom As Bitmap = ZoomBitmap(bmp_right, new_height)
 
      bmp_combine = New Bitmap _
         (bmp_left_zoom.Width + bmp_right_zoom.Width, new_height)
 
      Using g As Graphics = Graphics.FromImage(bmp_combine)
 
          g.DrawImage(bmp_left_zoom, 0, 0)
          g.DrawImage(bmp_right_zoom, bmp_left_zoom.Width, 0)
      End Using
   End Using
   Return bmp_combine
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: RedFrog
Datum: 01.12.17 15:06

Ich habe den Code mal stark vereinfacht und den Zoom weggelassen.
Die zwei Teilbilder zeichnet es zwar untereinander aber es füllt das vordefinierte Bild "bmp_combine" nicht aus.


 Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
      Button1.Click
        pb.Image = CombineBitmaps _
        (New Bitmap("C:\daten\ew.jpg"), New Bitmap("C:\daten\ks.jpg"))
        pb.Image.Save("C:\daten\new.jpg")
    End Sub
 
 
    Public Function CombineBitmaps(bmp_left As Bitmap,
      bmp_right As Bitmap) As Bitmap
 
        'Höhe der beiden Teilbiler ermitteln
        Dim new_height As Integer = bmp_left.Height + bmp_right.Height
 
        'Breite ermitteln (vom breitesten Teilbild)
        Dim new_width As Integer = Math.Max(bmp_left.Width, bmp_right.Width)
 
        'Neues Bildformat mit berechnete Höhe und Breite aus den beiden 
        ' Teilbilder
        Dim bmp_combine As New Bitmap(new_width, new_height)
        Dim g As Graphics = Graphics.FromImage(bmp_combine)
        g.DrawImage(bmp_left, 0, 0)
        g.DrawImage(bmp_right, 0, bmp_left.Height)
        Return bmp_combine
    End Function
 
End Class
Das gespeicherte Ergebnis sieht so aus (new.jpg)
https://fstatic1.mtb-news.de/v3/22/2219/2219284-lypjbyuatoqh-bild13-large.jpg
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bilder aus verschiedenen PictureBoxen zusammenfügen 
Autor: Manfred X
Datum: 01.12.17 16:31

Hallo!

Ich vermute, Deine kombinierten Teilbilder umfassen auch den
(weißen) Hintergrund Deiner Picturebox.

Hier eine grob getestete triviale Methode, um Randbereiche
einer bestimmten Farbe aus einer Bitmap zu entfernen.
   Public Function IsEqual(col1 As Color, _
                                  col2 As Color) As Boolean
        If col1.R <> col2.R Then Return False
        If col1.G <> col2.G Then Return False
        If col1.B <> col2.B Then Return False
        Return True
   End Function
 
 
   Public Function RemoveOutRegion(ByVal bmp As Bitmap, _
                          ByVal OutRegionColor As Color) As Bitmap
 
      Dim topleft As New Point(0, 0)
      Dim bottomright As New Point(bmp.Width - 1, bmp.Height - 1)
 
      Dim found As Boolean = False
      Dim i, k As Integer
      k = -1
      Do
         k += 1
         If k = bmp.Width Then
            k = 0 : i += 1
            If i = bmp.Height Then Return Nothing
         End If
 
         found = Not IsEqual(bmp.GetPixel(k, i), OutRegionColor)
     Loop Until found
     If Not found Then Return Nothing
     topleft = New Point(k, i)
 
     found = False
     k = bmp.Width : i = bmp.Height - 1
     Do
        k -= 1
        If k = -1 Then
           k = bmp.Width - 1 : i -= 1
           If i = -1 Then Return Nothing
        End If
        found = Not IsEqual(bmp.GetPixel(k, i), OutRegionColor)
     Loop Until found
 
     bottomright = New Point(k, i)
 
     Dim rect_source As New Rectangle _
        (topleft, New Size(bottomright.X - topleft.X, bottomright.Y - _
        topleft.Y))
 
     If rect_source.Width < 2 OrElse _        
        rect_source.Height < 2 Then Return Nothing
 
     Dim rect_dest As New Rectangle(New Point(0, 0), rect_source.Size)
     Dim bmp_center As New Bitmap(rect_source.Width, rect_source.Height)
 
     Using g As Graphics = Graphics.FromImage(bmp_center)
        g.DrawImage(bmp, rect_dest, rect_source, GraphicsUnit.Pixel)
     End Using
 
     Return bmp_center
 
  End Function
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