Frage zum Zusammenführen von Bildern

  • VB.NET

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Frage zum Zusammenführen von Bildern

    Hallo,

    mit folgenden Code will ich erstmal zwei Bilder übereinander zusammenführen.
    Das Ergebnis sieht Ihr ja...
    A ist der Abstand zueinander zu groß, sollte direkt übereinander sein.
    B hat das untere Bild volle Breite und das obere wurde verkleinert.

    Könnt Ihr mie da vielleicht auf die sprünge helfen?

    VB.NET-Quellcode

    1. Dim sys As String = Environment.GetEnvironmentVariable("SYSTEMROOT")
    2. Dim newImage As Image = Nothing
    3. Dim sz As New Size((Math.Max(img1.Width, img2.Width)), img1.Height + img2.Height)
    4. Dim bmp As New Bitmap(sz.Width, sz.Height)
    5. Dim gr As Graphics = Graphics.FromImage(bmp)
    6. gr.DrawImage(img1, 0, 0)
    7. gr.DrawImage(img2, 0, img1.Height, img2.Width, img2.Height)
    8. '// gr.DrawImage(img2, 0, img1.Height)
    9. newImage = CType(bmp, Image)
    10. Me.Ad_Pb.Image = newImage


    Später soll mal eine Datatable ausgelesen werden, wo dann so 3 - 7/8 Einträge enthalten sind, die sollen dan abgeklappert werden und dementsprechend die Anzhal an Bilder, die natürlich zusammenpassen und alle die gleiche Breite nur andere Höhe haben zusammengeführt werden.

    Gruß
    lris

    ..so nun Weihnachtsgeschenke einpacken und dann is Weihnachten... Wünsch euch allen, schöne Weihnachten und alles gute :)
    Bilder
    • Image6.jpg

      16,79 kB, 464×204, 316 mal angesehen
    was meinst du genau mit zusammenführen? einfach so übereinanderlegen, dass beide sich verdecken und kein zwischenraum rechts oder unten bleibt?
    was mir komisch vorkommt ist, dass du in zeile 3 nur einmal math.max verwendest..


    ich glaube ich verstehe jetzt^^ du willst eine beliebige anzahl von bildern untereinander darstellen.

    ich würde das mit einer list(of bitmap) machen. einfach in einer schleife durchlaufen, die höhen addieren und die breiteste breite zum bestimmen der Zielbitmap-size verwenden. dann die Zielbitmap zeichnen:
    wieder eine schleife, nur diesmal wird jede bitmap auf die zielbitmap gezeichnet, der tmpY wert (für die Y-Position, alle soll ja untereinander gemalt werden) erhöht sich nach dem zeichnen um die höhe der aktuell gezeichneten bitmap. fertig^^



    achso: natürlich auch frohe weihnachten^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()

    ich hab mal ähnliches gemacht, nur habichmich nicht um die Positionierung gekümmert, sondern genau gleichgroße images genommen, mit transparentem Hintergrund.
    FaceBuilder00.zip

    IMO müsste deine Positionierung aber hinhauen.

    Was aber soll CType hier?

    lris08 schrieb:

    VB.NET-Quellcode

    1. newImage = CType(bmp, Image)
    Hallo,

    also ich hab den Fehler zwar gefunden, aber wie ich ihn beheben kann weis ich auch noch nicht...

    Damit wird das Bild zusammengeschrumpft:

    VB.NET-Quellcode

    1. Dim sz As New Size((img1.Width + img2.Width) / 2, img1.Height + img2.Height)
    2. Dim b As New Bitmap(sz.Width, sz.Height)


    und mit dem Code wird das zweite Bild gezeichnet, ABER bei img2 wird die Höhe vom img1 verwendet - und jetzt kommts! :) Das Bild wurde vorher "geschrumpft"
    Somit ist die Höhe vom Bild1 nicht mehr aussagekräftig!

    VB.NET-Quellcode

    1. g.DrawImage(img1, 0, 0)
    2. g.DrawImage(img2, 0, img1.Height) '<<<<< nicht mehr aussagekräftig!
    3. Me.Ad_Pb.Image = b


    Gibts den eine Möglichkeit die Bilder erstmal zusamenzuführen, egal was für eine Höhe dabei rauskommt und anschließend wird geschrumpft??
    Im übrigen die Breite ist immer die gleiche!


    Gruß
    lris

    EDIT:

    So war nun mein Ansatz...

    VB.NET-Quellcode

    1. Dim Hoehe As Integer = img1.Height + img2.Height
    2. Dim b As New Bitmap(300, Hoehe)
    3. Dim g As Graphics = Graphics.FromImage(b)
    4. g.DrawImage(img1, 0, 0)
    5. g.DrawImage(img2, 0, img1.Height)
    6. Me.Ad_Pb.Image = b


    Hat aber leider nicht geklappt, zwischen den Grafiken ist immer noch der Abstand...
    so, ich hab grade mal meinen pc etwas aufgeräumt und musste längere zeit auf einen kopiervorgang warten... hab die zeit genutzt und etwas fabriziert^^
    sehe es als kleines weihnachtsgeschenk xD

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. With New OpenFileDialog
    3. .Multiselect = True
    4. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    5. 'läd alle markierten grafikdateien in eine liste
    6. Dim tmpLst As New List(Of Bitmap)
    7. For Each file As String In .FileNames
    8. Try
    9. Dim tmpBitmap As New Bitmap(file)
    10. tmpLst.Add(tmpBitmap)
    11. Catch ex As Exception
    12. MsgBox(file & vbCr & vbCr & ex.ToString) 'z.b. wenn die aktuelle datei keine gültige grafikdatei ist. könnte natürlich auch vorher geprüft werden
    13. End Try
    14. Next
    15. 'schustert die bilder zusammen und speichert sie in eine datei
    16. If tmpLst.Count > 0 Then
    17. Dim tmp As Bitmap = BilderZusammenSchustern(tmpLst)
    18. With New SaveFileDialog
    19. .FileName = "ergebnis.png"
    20. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    21. tmp.Save(.FileName, Imaging.ImageFormat.Png)
    22. End If
    23. End With
    24. End If
    25. End If
    26. End With
    27. End Sub
    28. Public Function BilderZusammenSchustern(ByVal BilderListe As List(Of Bitmap)) As Bitmap
    29. Dim tmpSizeX As Integer = 0
    30. Dim tmpSizeY As Integer = 0
    31. For Each img As Bitmap In BilderListe
    32. If tmpSizeX < img.Size.Width Then
    33. tmpSizeX = img.Size.Width 'das Zielbild soll so breit werden wie das breiteste bild in der liste
    34. End If
    35. tmpSizeY += img.Size.Height 'das zielbild wird so hoch wie alle bilder aus der liste zusammen, darum jede höhe dazuaddieren
    36. Next
    37. Dim Zielbitmap As New Bitmap(tmpSizeX, tmpSizeY)
    38. Using gra As Graphics = Graphics.FromImage(Zielbitmap)
    39. Dim LocY As Integer = 0
    40. For Each img As Bitmap In BilderListe
    41. 'wenn die bilder unscaliert gezeichnet werden sollen:
    42. gra.DrawImage(img, 0, LocY, img.Size.Width, img.Size.Height)' muss so gemacht werden, da es sonst aus irgend einem grund zu verschiebungen kommt... gra.DrawImage(img, 0, LocY) funst also nicht
    43. 'wenn die bilder in der breite scaliert werden sollen (höhe beibehalten, breite auf maximum)
    44. 'gra.DrawImage(img, 0, LocY, tmpSizeX, img.Size.Height)
    45. LocY += img.Size.Height
    46. Next
    47. End Using
    48. Return Zielbitmap
    49. End Function


    falls es nicht genau das macht, was du willst kann dir die funktion die ich geschrieben habe sicher weiterhelfen. ansonsten poste doch mal eine kleine skizze vom input (img1 und img2) und wie das das ganze später aussehen soll...
    lg
    oh das Christkind war da :)

    ich werds gleich mal ausprobieren... soweit ich meine Augen noch aufhalten kann...

    Ich schreibe ob es geklappt hat, spätestens morgen Vormitag :)


    EDIT:

    Es macht genau das was ich brauche !!!! Vielen vielen dank !!!!!!!! :)


    Meine Bilder bzw. den ganzen Pfad dahin "C:\meinProgramm\Grafiken\xyz.jpg" sind bereits in einer Datatable enthalten...
    Eine Datatable die ich über den Designer erstellt habe...

    aber denke- hoffe :) ich bekomme das morgen dann schon hin !!!


    nochmals meinen Dank !!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „lris08“ ()

    ja, das solltest du hinbekommen^^

    @ErfinderDesRades
    ist schon interessant wie du das alles mit deinen datasets realisierst!
    Hat das bei so kleinen "projekten" überhaupt vorteile? ich meine du brauchst ja fast garkeine variablen mehr... ist ja alles in ieiner tabelle gespeichert^^
    so nun habe ich mein Glück gerade mal versucht... :)

    Eigentlich doch gar nicht so schwer... (ABER :))

    VB.NET-Quellcode

    1. Private Sub Ad_Picturebox()
    2. Dim tmpLst As New List(Of Bitmap)
    3. For Each r As DataRow In ProgrammDatenSet.AltDach.Rows
    4. 'MsgBox(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString) 'Test
    5. Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString)
    6. tmpLst.Add(tmpBitmap)
    7. Next
    8. 'Bild ausgeben
    9. Ad_Pb.Image = BilderZusammenSchustern(tmpLst) End Sub


    sollte doch so eigentlich funktionieren oder?

    ...beim Ausführen kommt dan die Fehlermeldung: "Ungültiger Parameter."
    in Zeile:

    VB.NET-Quellcode

    1. Dim tmpBitmap As New Bitmap(r("A_Grafik").ToString)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „lris08“ ()

    VB.NET-Quellcode

    1. For Each r As DataRow In ProgrammDatenSet.AltDach.Rows
    2. dim Path as string = Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString
    3. Try
    4. Dim tmpBitmap As New Bitmap(path)
    5. tmpLst.Add(tmpBitmap)
    6. Catch ex As Exception
    7. MsgBox(path & vbCrLf & vbCrLf & ex.ToString)
    8. End Try
    9. Next



    damit sollte sicher der störenfried ausfindig machen lassen. von datenbanken/rows/.. hab ich leider garkeine ahnung, vllt liegt es ja an einem falsch zusammengebautem pfad (die error-msgbox wird dir den pfad anzeigen, dann kannst du ja checken ob dieser korrekt ist). System.IO.Path.Combine könnte vllt einen möglichen fehler beseitigen, theoretisch reicht es auch wenn du nicht den ganze pfad angibts sonder nur "grafiken\xy.png" - vorausgesetzt der ordner grafiken liegt im selben verzeichnis wie die exe...

    lris08 schrieb:

    VB.NET-Quellcode

    1. Dim tmpBitmap As New Bitmap(r("A_Grafik").ToString)
    Das darf man wohl ein Trauerspiel nennen: Du hast ein typisiertes Dataset, und ich hab dir schon zig-mal gesagt: "benutze es auch" - aber du schmeisst lieber deine tastatur aussm Fenster.

    Naja - ist ja weihnachten, da gibts eh lauter neuen Kram.

    Nun also zum xx-ten mal vorgekaut:

    VB.NET-Quellcode

    1. For Each r In ProgrammDatenSet.AltDach
    2. 'MsgBox(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString) 'Test
    3. Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\" & r.A_Grafik)
    4. tmpLst.Add(tmpBitmap)
    5. Next

    Und wenn da ein Fehler kommt, kannste im Debugger die .A_Grafik - Property auch direkt einsehen - einen anneren Parameter gibts ja weitundbreit nicht.

    Vermutlich ists eine Datei, aus der man keine Bitmap erstellen kann.
    Hallo zusammen :)

    Dank eurer Hilfe habe ich es hinbekommen :) Vielen Dank!

    Heute Nachmitag ist mir aber noch was eingefallen, was ich euch noch fragen wollte.
    Generell aber, habe mir den Code wo die Größen berechnet werden nochmal angeschaut, wirklich schlau werd ich da nicht... Aber das ganz mir DrawImage ist mir eh recht suspekt :)

    In der Datatable wo die Grafiknamen drinnen stehen, sind auch Größen angegeben (Höhe).

    z.B.

    Quellcode

    1. ID Bezeichnung Dicke(m) Grafik
    2. 1 Beton 0,1800 <Pfad>\Beton.jpg
    3. 2 Abdichtung 0,0045 <Pfad>\Abdichtung.jpg
    4. 3 Dämmung 0,1650 <Pfad>\Dämmung.jpg
    5. usw.


    Meine Frage an euch, besteht nun die Möglichkeit die grafiken nicht einfach übereinander zu setzen, sondern erstmal die gesamthöhe zu addieren = 100% und dann anteilsmäßig gem. der angegebenen Dicke von der Höhe her anzupassen?
    Mir ist klar, dass die Grafik damit auseinandergezogen werden wird, aber des macht gar nichts.

    Ist sowas umsetzbar? oder nur mit einem Mega Aufwand ??

    Liebe Grüße lris
    mir scheint, du willst weniger iwellche bilder anzeigen, als einen Wand-Aufbau selber zeichnen, und dabei die geladenen Bilder als Textur benutzen (wie man sie etwa bei DirectX verwendet).
    Na, vlt. bekommstejawas mittm TextureBrush hin - damit bräuchteman nur Rectangles auszufüllen, und das kann dann wie Putz oder sonstne Oberfläche aussehen.
    Also :)

    Hab grad noch bisserl gelesen, was das Zeichnen so angeht... wie ich oben schon sagte, ist das leider für mich nur schwer nachvollziehbar- alles was das zeichnen betrifft.

    Mit diesem Code funktioniert es erstmal super, aber die Bilder sind halt statisch- also fest.
    Code: [Übersichtshalber verkleinert]
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Picturebox_AD()
    2. Pb_AltDach.Image = Nothing
    3. System.Threading.Thread.Sleep(500)
    4. Dim tmpLst1 As New List(Of Bitmap)
    5. For Each r As DataRow In ProgrammDatenSet.AltDach
    6. Try
    7. If r("A_Grafik").ToString <> "" And File.Exists(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString) Then
    8. Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString)
    9. tmpLst1.Add(tmpBitmap)
    10. lbl_Grafikfehlt_AD.Text = "ok"
    11. Else
    12. Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\GrafikFehlt.jpg".ToString)
    13. tmpLst1.Add(tmpBitmap)
    14. lbl_Grafikfehlt_AD.Text = "es fehlt eine Grafik"
    15. End If
    16. Catch ex As Exception
    17. MessageBox.Show(ex.Message, "Programminfo...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    18. Exit Sub
    19. End Try
    20. Next
    21. 'Bild ausgeben
    22. Pb_AltDach.Image = BilderZusammenSchustern_AD(tmpLst1)
    23. End Sub
    24. Public Function BilderZusammenSchustern_AD(ByVal BilderListe1 As List(Of Bitmap)) As Bitmap
    25. Dim tmpSizeX As Integer = 0
    26. Dim tmpSizeY As Integer = 0
    27. For Each img As Bitmap In BilderListe1
    28. If tmpSizeX < img.Size.Width Then
    29. tmpSizeX = img.Size.Width 'das Zielbild soll so breit werden wie das breiteste bild in der liste
    30. End If
    31. tmpSizeY += img.Size.Height 'das zielbild wird so hoch wie alle bilder aus der liste zusammen, darum jede höhe dazuaddieren
    32. Next
    33. Dim Zielbitmap As New Bitmap(tmpSizeX, tmpSizeY)
    34. Using gra As Graphics = Graphics.FromImage(Zielbitmap)
    35. Dim LocY As Integer = 0
    36. For Each img As Bitmap In BilderListe1
    37. 'wenn die bilder unscaliert gezeichnet werden sollen:
    38. 'gra.DrawImage(img, 0, LocY, img.Size.Width, img.Size.Height) ' muss so gemacht werden, da es sonst aus irgend einem grund zu verschiebungen kommt... gra.DrawImage(img, 0, LocY) funst also nicht
    39. 'wenn die bilder in der breite scaliert werden sollen (höhe beibehalten, breite auf maximum)
    40. gra.DrawImage(img, 0, LocY, tmpSizeX, img.Size.Height)
    41. LocY += img.Size.Height
    42. Next
    43. End Using
    44. Return Zielbitmap
    45. End Function


    Anbei mal zwei Bilder wie ich das gerne hätte...

    Wie Ihr sehr, ist der Mittenteil (Dämmung) unterschiedlich stark. Die anderen Ebenen werden halt dementsprechend angepasst.

    Mal angenommen ich habe 4 schichten, 1, 2 und 3 sind jeweils einen halben cm stark, die Dämmung also 2 ist aber 16 cm stark, dann soll darauf das Verhältnis angepasst werden.
    Bilder
    • Image8.jpg

      41,5 kB, 561×214, 206 mal angesehen
    • Image9.jpg

      41,04 kB, 547×204, 187 mal angesehen
    Hallo,

    ich muß leider noch einmal auf dieses Thema zurück kommen.

    Den Code habe ich so weit ganz gut verstanden, jedoch tüftel ich nun rum, die Grafiken die zusammengesetzt werden Höhenmäßig anzupassen.
    Ich weis zwar wie ich es rechnen kann:

    1. Rechenschritt: 250 [Höhe Picturebox] / (GesamtaufbauhöheBauteile * 100)
    2. Rechenschritt: 1.Rechenschr. * Bauteileinzelhöhe

    Zusammen ergibt das dan wieder die 250 der Picturebox aber die Bauteile haben im Bild verschiedene Höhen.

    Mein Problem ist dabei nir, dass ich mich zu doof -anscheinend- anstelle, weitere Werte als nur das Bild

    VB.NET-Quellcode

    1. Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString)
    2. tmpLst1.Add(tmpBitmap)
    an die Function "BilderZusammenSchustern" übergebe.


    Will echt ned nerven, aber könntet Ihr mir da weiterhelfen ?




    FreakJNS schrieb:


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. With New OpenFileDialog
    3. .Multiselect = True
    4. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    5. 'läd alle markierten grafikdateien in eine liste
    6. Dim tmpLst As New List(Of Bitmap)
    7. For Each file As String In .FileNames
    8. Try
    9. Dim tmpBitmap As New Bitmap(file)
    10. tmpLst.Add(tmpBitmap)
    11. Catch ex As Exception
    12. MsgBox(file & vbCr & vbCr & ex.ToString) 'z.b. wenn die aktuelle datei keine gültige grafikdatei ist. könnte natürlich auch vorher geprüft werden
    13. End Try
    14. Next
    15. 'schustert die bilder zusammen und speichert sie in eine datei
    16. If tmpLst.Count > 0 Then
    17. Dim tmp As Bitmap = BilderZusammenSchustern(tmpLst)
    18. With New SaveFileDialog
    19. .FileName = "ergebnis.png"
    20. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    21. tmp.Save(.FileName, Imaging.ImageFormat.Png)
    22. End If
    23. End With
    24. End If
    25. End If
    26. End With
    27. End Sub
    28. Public Function BilderZusammenSchustern(ByVal BilderListe As List(Of Bitmap)) As Bitmap
    29. Dim tmpSizeX As Integer = 0
    30. Dim tmpSizeY As Integer = 0
    31. For Each img As Bitmap In BilderListe
    32. If tmpSizeX < img.Size.Width Then
    33. tmpSizeX = img.Size.Width 'das Zielbild soll so breit werden wie das breiteste bild in der liste
    34. End If
    35. tmpSizeY += img.Size.Height 'das zielbild wird so hoch wie alle bilder aus der liste zusammen, darum jede höhe dazuaddieren
    36. Next
    37. Dim Zielbitmap As New Bitmap(tmpSizeX, tmpSizeY)
    38. Using gra As Graphics = Graphics.FromImage(Zielbitmap)
    39. Dim LocY As Integer = 0
    40. For Each img As Bitmap In BilderListe
    41. 'wenn die bilder unscaliert gezeichnet werden sollen:
    42. gra.DrawImage(img, 0, LocY, img.Size.Width, img.Size.Height)' muss so gemacht werden, da es sonst aus irgend einem grund zu verschiebungen kommt... gra.DrawImage(img, 0, LocY) funst also nicht
    43. 'wenn die bilder in der breite scaliert werden sollen (höhe beibehalten, breite auf maximum)
    44. 'gra.DrawImage(img, 0, LocY, tmpSizeX, img.Size.Height)
    45. LocY += img.Size.Height
    46. Next
    47. End Using
    48. Return Zielbitmap
    49. End Function


    ich versuche mich gerade an einer mehrdimensionalen List of Möglichkeit...

    Lacht mit bitte aber nicht aus ...

    VB.NET-Quellcode

    1. Dim Vars As List(Of String)() = New List(Of String)(3) {}
    2. Dim GesamtHoehe As Integer = 0
    3. For Each r As DataRow In ProgrammDatenSet.AltDach
    4. Try
    5. If r("A_Grafik").ToString <> "" And File.Exists(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString) Then
    6. 'Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString)
    7. 'tmpLst1.Add(tmpBitmap)
    8. Vars(0).Add(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString)
    9. Vars(1).Add(r("A_WirsameDicke"))
    10. GesamtHoehe += CInt("A_WirsameDicke")
    11. Vars(2).Add(GesamtHoehe)
    12. Else
    13. lbl_Grafikfehlt_AD.Text = "es fehlt eine Grafik"
    14. End If
    15. Catch ex As Exception
    16. MessageBox.Show(ex.Message, "Programminfo...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    17. Exit Sub
    18. End Try
    19. Next
    20. 'Bild ausgeben
    21. Pb_AltDach.Image = BilderZusammenSchustern_AD(Vars)
    22. End Sub
    23. Public Function BilderZusammenSchustern_Test(ByVal BilderListe1 As List(Of Bitmap)) As Bitmap



    Der Anstz völlig daneben oder gehe ich nen richtigen WEg???

    EDIT:

    so sehen die Höhenangaben der Bauteile aus- im Meter angegeben... aber zum Rechen, egal...

    0,0045 (4,5mm halt)
    0,004 (4 mm)
    0,100 (10 cm)
    0,0042 (4,2 mm)
    0,18 (148 cm)

    zusammen: 0,2927 * 100 = 29,27 der gesamte Aufbau der Bauteile ich der Realität -> übertragen auf die PicBox:

    250 / 29,27 = 8,5411

    Bauteilzusammengesetzt / Einzelgröße:

    0,0045 * 8,5411 = 3,843
    0,004 * 8,5411 = 3,416
    0,100 * 8,5411 = 85,4
    0,0042 * 8,5411 = 3,58
    0,18 * 8,5411 = 153,72

    ergibt PicBoc-Hleh von 249,95 ~Runddung halt o. Kommastellenverschiebung >> PicBochöhe = 250

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „lris08“ ()

    also als erstes mal - auch wenn ich von datasets keine ahnung habe - verweise ich auf den post vom erfinder: [VB 2010] Frag zu Bilder zusammenführen... ... r("A_Grafik").ToString sieht doch arg komisch aus...

    dann eine frage, der code von dir macht doch sicher fehler?!?
    ich meine du übergibst der zusammenschustern-funktion einen listofarray-irgendwas.. was da nachher rauskommt ist ein großer haufen durcheinander! dafür wurden doch klassen erfunden, um alle nötigen werte in EINEM zu speichern. mein lösungsvorschlag wäre also eine eigene klasse, die dicke, bildpfad und sonstiges speichert. dann kannst du ganz einfach eine list(of MeineKlasse) machen und alles ist schonmal übersichtlicher.

    ansonsten passt deine rechnerei für die pixel-größen in zusammenhang mit der realen größe..

    PS: warum der try-block? finde ich in dem fall seh unsauber, da man fehler durch vorheriges abfragen (existiert die datei, etc) im ansatz unterbinden kann, so macht dein programm später irgendwas und niemand kann mehr nachvollziehen woher "unerklärliche werte" kommen
    Hallo FreakJNS,

    ich habe es hinbekommen- habe meine Änderungen erst mal wieder gelöscht und mir das nochmal alles durch den Kopf gehen lassen und habe mir Notizen gemacht.
    Habe Bitmap etc. nochmal angeschaut und durchgelesen... und da kam mit ein Licht :)


    VB.NET-Quellcode

    1. Private Sub Picturebox_AD()
    2. Pb_AltDach.Image = Nothing
    3. System.Threading.Thread.Sleep(500)
    4. Dim GesamtAufbauHoehe As Decimal = 0
    5. For i = 0 To AltDachDataGridView.RowCount - 1
    6. GesamtAufbauHoehe = GesamtAufbauHoehe + AltDachDataGridView.Rows(i).Cells(1).Value
    7. Next
    8. Dim tmpLst1 As New List(Of Bitmap)
    9. For Each r As DataRow In ProgrammDatenSet.AltDach
    10. Dim PicBoxVariabel As Decimal = 0
    11. Dim BauteilHoehe As Decimal = 0
    12. PicBoxVariabel = 250 / (GesamtAufbauHoehe * 100)
    13. BauteilHoehe = PicBoxVariabel * (CDbl(r("A_WirsameDicke")) * 100)
    14. Try
    15. If r("A_Grafik").ToString <> "" And File.Exists(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString) Then
    16. Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString)
    17. Dim OutputBitmap As New Bitmap(tmpBitmap, tmpBitmap.Width, BauteilHoehe)
    18. tmpLst1.Add(OutputBitmap)
    19. lbl_Grafikfehlt_AD.Text = "ok"
    20. Else
    21. lbl_Grafikfehlt_AD.Text = "es fehlt eine Grafik"
    22. End If
    23. Catch ex As Exception
    24. MessageBox.Show(ex.Message, "Programminfo...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    25. Exit Sub
    26. End Try
    27. Next
    28. 'Bild ausgeben
    29. Pb_AltDach.Image = BilderZusammenSchustern_AD(tmpLst1)
    30. End Sub


    Einfach - naja, einfach is gut ;), im Vorfeld die Größe berechnen und das Bild was eine gewisse Größe als Originalbild hat in der Höhe anpassen.
    Dies sind meine Änderungen an den von Dir zu Weihnachten bekommenen Code:

    VB.NET-Quellcode

    1. Dim GesamtAufbauHoehe As Decimal = 0
    2. For i = 0 To AltDachDataGridView.RowCount - 1
    3. GesamtAufbauHoehe = GesamtAufbauHoehe + AltDachDataGridView.Rows(i).Cells(1).Value
    4. Next
    5. Dim PicBoxVariabel As Decimal = 0
    6. Dim BauteilHoehe As Decimal = 0
    7. PicBoxVariabel = 250 / (GesamtAufbauHoehe * 100)
    8. BauteilHoehe = PicBoxVariabel * (CDbl(r("A_WirsameDicke")) * 100)
    9. If r("A_Grafik").ToString <> "" And File.Exists(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString) Then
    10. Dim tmpBitmap As New Bitmap(Application.StartupPath & "\Grafiken\" & r("A_Grafik").ToString)
    11. Dim OutputBitmap As New Bitmap(tmpBitmap, tmpBitmap.Width, BauteilHoehe)
    12. tmpLst1.Add(OutputBitmap)


    Somit habe ich die Höhe angepasst, in deinem Code geht er davon aus, dass dies die wirkliche Größe des Bildes ist... und schwups- haut hin :)

    Das einzigste was mich noch stört ist, dass ich das DGV durchlaufen muß und nicht die DataTable selbst wo alle Daten drinnen stehen...

    VB.NET-Quellcode

    1. Dim GesamtAufbauHoehe As Decimal = 0
    2. For i = 0 To AltDachDataGridView.RowCount - 1
    3. GesamtAufbauHoehe = GesamtAufbauHoehe + AltDachDataGridView.Rows(i).Cells(1).Value
    4. Next
    5. .... SO GEHTS JA NICHT:
    6. For a = 0 To ProgrammDatenSet.AltDach.Count - 1
    7. GesamtAufbauHoehe = GesamtAufbauHoehe + ProgrammDatenSet.AltDach.Rows(a).Cells(1).Value
    8. Next


    Aber habe ich doch ganz ok hinbekommen oder ?


    ...nur die Grafiken brauche ich nun in einem größern Format als das was ich jetzt habe... wird manchmal bisserl unscharf :)