bildbox, bilder und ?resizing/?reskalieren?/?einbetten?

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    bildbox, bilder und ?resizing/?reskalieren?/?einbetten?

    hey zusammen,

    cliffs:
    - vb-level: anfänger
    - 2 herausforderungen und ich bin für gedankengänge und anregungen dankbar.
    - google seit stunden - bereits einiges gefunden - bspw. fürs image-resizing und einbetten. (reskalieren auch, aber da blick ich nicht durch)

    Challenge1:

    z.B. "Dim BMP As New Drawing.Bitmap(1000,500)"

    Wie schaffe ich es, dass sich Width(1000) und Height(500) eines "Layers", der im Zuge von "Text auf geöffnetem Bild schreiben" entsteht,
    an der Größe des Bildes, respektive des Eingebetteten/Reskalierten, orientieren und nicht an den Abmessungen der Picbox(1000, 500) in der das Bild/Image geöffnet wurde.

    (das Ganze ohne "background.image")

    Challenge2 baut auf Challenge1 auf und würde sich nach Lösen von Callenge1 selbsterklären, da ich weiß, dass mich der obengenannte VB-Code-Schnipsel aufhält.


    Challenge3:

    Ich möchte ein geöffnetes Bild, welches zu groß für die Picbox ist, an die Picbox anpassen/angleichen lassen und nicht die Picbox an das Bild.
    (Das Ganze ohne "Stretching-/Zoom/etc-Eigenschaft der PicBox")

    Das Anpassen idealerweise so, dass ich im Nachgang einige Sätze geschriebenen Textes auf dem Bild in der richtigen Relation "Schriftgröße-Bild-Originalgröße" setzen kann.

    Würde ich diese C3 mit "Stretching" lösen, könnte ich nicht auf dem Bild herumschreiben, weil es sich direkt Auto-resizen würde
    und ich bei einem zu großem Bild daraufhin nur noch den linken oberen Bereich in der Picbox sehe.


    Vielen Dank für eure Ideen und Anregungen.

    Freundliche Grüße

    u.h.

    Dieser Beitrag wurde bereits 16 mal editiert, zuletzt von „unknownhero“ ()

    Ok, schon viel besser :)

    Du könntest das Paint-Event der PictureBox abonnieren. In den PaintEventArgs erhälst du ein Graphics-Objekt, mit welchem du Texte auf die PictureBox zeichnen kannst (DrawString() und das Bild in einer bestimmten Größe (DrawImage()) auf die PictureBox zeichnen kannst.

    Wichtig wären beim zeichnen noch die Qualitätseinstellungen:
    Zum ersten Punkt: Die Bitmap-Klasse verfügt ebenfalls über Width & Height, also kannst du deinen Text von der Größe her einfach an dieser orientieren.

    LG :)
    zu 1.
    Entweder ich steh auf dem Schlauch oder es ist schon zu spät :D Ich verstehe nicht was du meinst und auf was du dich beziehst,
    ich sehe da steht "zum ersten Punkt", aber nicht den Bezug.

    "Dim BMP As New Drawing.Bitmap(1000,500)"

    Es handelt sich doch um ein "New Drawing.Bitmap" , sprich ein neu gezeichnetes Bitmap, wenn Ereignis 1 eintrifft.
    Die Werte dürfe beim New.Drawing.Bitmap nicht 0,0 sein. Ist das Anpassen an Ereignis 1 oder Bild1(geöffnetes Bild in Picbox)
    dann überhaupt möglich? Kenne vor dem Debuggen weder Schriftart noch Größe noch die Anzahl der Worte, Sätze oder Absätze.

    Zu 2. Wird wohl länger dauern^^.

    Freundliche Grüße

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „unknownhero“ ()

    ich versteh das Problem noch nicht so recht.
    Auch schlage ich vor, sich erstmal auf ein Problem zu beschränken.

    Also die Bitmap soll sich der Picbox anpassen - das ist einfach - mit Picbox.SizeMode.Zoom oder .Stretch (oder beim BackgroundImage gibts entsprechendes).

    Und der Text soll sich der Bitmap anpassen?
    Das kann aber blöd aussehen.
    Etwa ein Text von 200pix Breite füllt eine 200*200-Bitmap schön aus, wird aber auf einer 3000*3000-Bitmap echt winzig. Wäre das beabsichtigt?
    @Erfinder des Rades. Hab ich übersehen. :) - Da hast du recht.

    Challenge1:
    Die Maße des new.drawing.bitmaps sollen sich am geöffneten Bild, welches in der Picturebox platziert wird, orientieren und nicht durch die der Picturebox starr vorgegeben werden müssen.
    Denn diese Starrheit hindert mich daran das geöffnete Bild mit den bildeigenen Original-Abmessungen abspeichern zukönnen.
    K.A. vielleicht habe ich auch einen Denkfehler, falscher Ansatz ?

    Eine andere Idee wie ich das verhindern könnte, wäre, indem ich den abzuspeichernden Bereich oder den Arbeitsbereich auf die Größe des geöffneten Bildes beschränke. Aber langfristig gesehen, würde ich mich schon auf den ersten Lösungsansatz versteifen wollen und erfolgreich umsetzen - nur irgendwie habe ich meine Zweifel ob das funktioniert. Da x und y nicht 0 sein dürfen und auch kein Text.^^
    Zumindest "sagt" mir das VBXpress2010.

    Edit:

    Kann das mit einem Screenshot funktionieren ? Wie bei diesem Code ? Quelle:
    Speicher-Variante - VB-Code-Screenshot-Video


    Screenshot - und anstatt den Computer-Screen die Bounds der angepassten Picturebox oder des geöffneten Bildes nehmen?


    Speicher-Variante - Screenshot-Vb-Code

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.Opacity = 0
    Dim picture As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Width)
    Dim graphics As Graphics = graphics.FromImage(picture)

    graphics.CopyFromScreen(0, 0, 0, 0, picture.Size)
    PictureBox1.Image = picture
    Me.Opacity = 1
    End Sub


    EDIT: Als Bsp. Das kleine Bild ist das Originalbild. Find meine Comics nicht (anderer LT), deshalb muss das jetzt herhalten. Wenn ich jetzt darauf rumschreibe oder herummale, wird die besagte "new.drawing.bitmap" erstellt, die die Größe der Picbox hat und nicht die Abmessungen des geöffneten Bildes.:/
    Bilder
    • fdrfdrdr.png

      14,38 kB, 940×625, 119 mal angesehen

    Dieser Beitrag wurde bereits 23 mal editiert, zuletzt von „unknownhero“ ()

    ErfinderDesRades schrieb:

    Auch schlage ich vor, sich erstmal auf ein Problem zu beschränken.
    Also ich beschränke mich auf Challenge1:

    unknownhero schrieb:

    Challenge1:
    Die Maße des new.drawing.bitmaps sollen sich am geöffneten Bild, welches in der Picturebox platziert wird, orientieren und nicht durch die der Picturebox starr vorgegeben werden müssen.
    Denn diese Starrheit hindert mich daran das geöffnete Bild mit den bildeigenen Original-Abmessungen abspeichern zukönnen.
    K.A. vielleicht habe ich auch einen Denkfehler, falscher Ansatz ?
    Jo, falscher Ansatz, würd ich sagen - zumindest gefällt er mir nicht.
    In meiner Welt will man eine Picturebox immer groß ziehen können, um das Bild genau anzugucken, aber auch zusammen-schieben, wenn mans grad nicht braucht.

    Wenn deine Bitmap aber beim Zusammenschieben wirklich verkleinert wird, gehen Bild-Informationen endgültig verloren, und beim zurück-vergrößern ist dann die Qualität absolutely :thumbdown:

    Daher werden bei mir Bitmapse ühaupt nicht angefasst, sondern wie gesagt mit Stretch oder Zoom präsentiert (evtl auch Eigenbau-"Lupe").
    Und ein Layer wird auf die Picturebox gemalt, nicht in die Bitmap, denn was man in die Bitmap malt ist unwiderruflich.
    Dabei ist dann natürlich einiger Aufwand zu treiben, um den Layer immer richtig zu skalieren - also der Layer muss auch stretchen/zoomen können.
    Hey @'ErfinderDesRades.

    Gern. C1.
    Als Veranschauungsbeispiel könnte man auch irfanview heranziehen.
    Lade dort ein Bild hinein, vergrößere oder verkleinere es per Zoom.
    Gehe über "Bearbeiten-Wasserzeichen einfügen" und setze ein Wasserzeichen.

    Das Wasserzeichen wird sich immer an das Bild anpassen (wenn das bild 300x300 ist und das wasserzeichenbild 100x100, bleibt das wz-bild 100x100) und wenn das "Wasserzeichen"-Bild größer als das geöffnete Bild ist,
    wird das Bild was man nach Bearbeiten abspeichert stets nur so groß sein wie das geöffnete Bild.

    Eigentlich ist das genau das was ich brauche :D^^

    ---
    @topic Mein Layer wird doch auf die PictureBox gemalt. ;) Nur bleibt der beim Abspeichervorgang abmessungstechn. immer gleich (in der vordefinierten Ausgangsgröße, welche sich mit der PictureBox deckt), selbst wenn ich den Rahmen der PictureBox an das geöffnete Bild anpassen lasse.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „unknownhero“ ()

    unknownhero schrieb:

    @topic Mein Layer wird doch auf die PictureBox gemalt. Nur bleibt der beim Abspeichervorgang abmessungstechn. immer gleich (in der vordefinierten Ausgangsgröße, welche sich mit der PictureBox deckt), selbst wenn ich den Rahmen der PictureBox an das geöffnete Bild anpassen lasse.
    Also drücke ich das in meinen Worten richtig aus, wenn ich sage: Dein Layer kann nicht zoomen und stretchen?

    Dann wäre C1 also in meiner Formulierung:

    ErfinderDesRades schrieb:

    also der Layer muss auch stretchen/zoomen können.
    ?

    Wie gesagt: Wichtig ist, die Problemstellung eindeutig zu definieren, also wenn das jetzt ist, dann kann man weiter fragen, welchen Datentyp dein Layer überhaupt hat, und überlegen, wie ein eigener Layer-Datentyp auszusehen hätte, der stretchen kann.