| |
VB.NET - FortgeschritteneBilder 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. | |
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? | |
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 | |
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? | |
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. | |
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")) | |
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. | |
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 | |
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 | |
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 | |
| 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
|