Bild im Clipboard größe ändern bevor es eingefügt wird

  • WPF

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von r0tzi.

    Bild im Clipboard größe ändern bevor es eingefügt wird

    Hallo,

    hat jemand eine Idee oder Code wie ich ein Bild das im Cliboard ist, verkleinern kann bevor es eingefügt wird?

    Folgendes Szenario:

    Ich markier z.B. ein Bildausschnitt in Paint und mit STRG+C setzte ich es ins Clipboard. Sagen wir, das bild hat 100x100 pixel.

    Nun klicke ich in eine Richtextbox und drücke STRG+V, dann sollte dieses Bild aber nur 80x80 groß sein. Es soll also geschrumpft werden bevor es in die RTB eingefügt wird.

    Grüße
    Versuch es mal so:
    Key Press Event verwendet um STRG + V abfangen. Dann die Zwischenablage überprüfen ob darin ein Bild ist. Falls ja, dieses als Bitmap Objekt „übernehmen“, anpassen und in die RTB einfügen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    r0tzi schrieb:

    width und height is readonly
    Klar. Du liest alles aus und malst das Bild in eine entsprechend große neue Vorlage zu Deiner Verwendung.
    Ddann kannst Du das Original löschen oder nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also nach langem suchen und rumprobieren hab ich das gefunden.. nun , das bild wird kleiner gemacht okay.. aber es bleibt schwarz... -.-

    VB.NET-Quellcode

    1. Clipboard.SetImage(create_ResizedImage(Clipboard.GetImage, 1))


    VB.NET-Quellcode

    1. Private Shared Function create_ResizedImage(ByVal source As ImageSource, ByVal width_centimeters As Integer) As BitmapFrame
    2. Dim margin As Integer = 1
    3. Dim dpi As Integer = 96
    4. Dim scale_Height As Double = source.Height / source.Width
    5. Dim width_Dpi As Integer = CInt((width_centimeters * 0.393700787 * dpi))
    6. Dim height_Dpi As Integer = CInt((width_Dpi * scale_Height))
    7. Dim rect = New Rect(margin, margin, width_Dpi - margin * 1, height_Dpi - margin * 1)
    8. Dim group = New DrawingGroup()
    9. RenderOptions.SetBitmapScalingMode(group, BitmapScalingMode.Fant)
    10. group.Children.Add(New ImageDrawing(source, rect))
    11. Dim drawingVisual As DrawingVisual = New DrawingVisual()
    12. Dim drawingContext As DrawingContext = drawingVisual.RenderOpen()
    13. drawingContext.DrawDrawing(group)
    14. Dim resizedImage As RenderTargetBitmap = New RenderTargetBitmap(width_Dpi, height_Dpi, dpi, dpi, PixelFormats.[Default])
    15. resizedImage.Render(drawingVisual)
    16. Return BitmapFrame.Create(resizedImage)
    17. End Function


    jmd ne idee?

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

    Würde das Bild nutzen, um eine Bitmap (mit benötigter Größe) erzeugen und damit dann weiter zu arbeiten.

    docs.microsoft.com/de-de/dotne…ystem_Int32_System_Int32_
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hä warum soll das wieder in die Zwischenablage zurück und nicht in deine RTB?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    hm ich dachte mir das eben so.. habs nun endlich gefunden.. eigentlich ganz leicht :-/

    VB.NET-Quellcode

    1. Sub RTB_PreviewKeyDown(sender As Object, e As KeyEventArgs) Handles RTB.PreviewKeyDown
    2. If Keyboard.Modifiers.HasFlag(ModifierKeys.Control) AndAlso e.Key = Key.V Then
    3. If Clipboard.ContainsImage Then
    4. Dim bitmap = New TransformedBitmap(Clipboard.GetImage, New ScaleTransform(100 / Clipboard.GetImage.PixelWidth, 100 / Clipboard.GetImage.PixelHeight))
    5. Clipboard.SetImage(bitmap)
    6. End If
    7. End If
    8. End Sub


    Darauf bin ich aber erst gekommen als ich mir auch dachte, warum eigentlich ins clipboard zurück... probierte dann direkt einzufügen und dann kam das dabei heraus..

    am schluss schaute ich ob man die bitmap auch wieder zurück ins clipboard bringen kann und siehe da es geht.. :P

    so geht es ohne das das Clipbaord verändert wird:

    VB.NET-Quellcode

    1. Private Sub Pastepicture(source As Object)
    2. Dim New_Inline As New InlineUIContainer(New Image() With {.Source = source, .Width = 100, .Height = 100}, RTB.CaretPosition)
    3. End Sub
    4. Sub RTB_PreviewKeyDown(sender As Object, e As KeyEventArgs) Handles RTB.PreviewKeyDown
    5. If Keyboard.Modifiers.HasFlag(ModifierKeys.Control) AndAlso e.Key = Key.V Then
    6. If Clipboard.ContainsImage Then
    7. Dim bitmap = New TransformedBitmap(Clipboard.GetImage, New ScaleTransform(100 / Clipboard.GetImage.PixelWidth, 100 / Clipboard.GetImage.PixelHeight))
    8. ' Clipboard.SetImage(bitmap)
    9. Pastepicture(bitmap)
    10. e.Handled = True
    11. End If
    12. End If
    13. End Sub

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