Stretch Image Speichern

  • VB.NET

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

    Stretch Image Speichern

    guten Abend ,
    ich liege vor ein kleines Problem ich will ein Image aus meiner Picturebox abspeichern dies mache ich so!

    VB.NET-Quellcode

    1. If Not (SearchPic.Image) Is Nothing Then
    2. Dim sfd As New SaveFileDialog
    3. sfd.Title = "Bild Speichern unter.."
    4. sfd.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyPictures
    5. sfd.Filter = "Jpeg files (*.jpg)|*.jpg|Bitmap files (*.bmp)|*.bmp"
    6. Dim result As DialogResult = sfd.ShowDialog
    7. If result = Windows.Forms.DialogResult.OK Then
    8. If sfd.FileName <> String.Empty Then
    9. Dim MyImageFormat As System.Drawing.Imaging.ImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg
    10. If sfd.FileName.ToString.ToUpper.EndsWith("JPG") Then
    11. MyImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg
    12. ElseIf sfd.FileName.ToString.ToUpper.EndsWith("BMP") Then
    13. MyImageFormat = System.Drawing.Imaging.ImageFormat.Bmp
    14. End If
    15. SearchPic.Image.Save(sfd.FileName, MyImageFormat)
    16. End If
    17. End If
    18. End If


    aber ich habe bei meiner Picturebox Stretch Image aktiviert , er Speichert zwar das Image aber nicht in Originalen Maxstab zu der Picturebox , sprich ich will das so gespeichert habe wie er es in der Picturebox auch lang gezogen hat , ist dies über haupt möglich ?



    LG :)
    Wenn du den Maßstab ändern willst, musst du halt eine neue Bitmap erstellen, um sie abzuspeichern. Nun ist deine Anforderung nicht genau genug definiert: Soll die neue Bitmap genau die Abmaße deiner Picturebox bekommen, oder willst du die Original-BildQualität möglichst erhalten?
    Bei letzterem kannst du nicht einfach die Picbox-Abmaße nehmen, sondern muß die Verzerrung in x/y-Richtung berechnen, und auf die Original-Abmaße der Bitmap übertragen (die Bitmap ist ja meißt viel größer als die Picbox)
    Hey, für sowas habe ich mir mal kleine Snippets geschrieben:

    Bitmap proportional verkleinern/vergrößern:
    Es berechnet den Skalierungsfaktor für die Breite und Höhe. Damit das Zielbild nicht größer als die maximal gewünschte größe wird sucht man sich den kleinsten Skalierungsfaktor heraus und berechnet anhand von diesem die Maße der Zielbitmap. Dann zeichnet man per GDI+ das Quellbild auf diese und ist schon fertig^^ Ich vermute mal, dass du ein solches Ergebnis haben willst.

    VB.NET-Quellcode

    1. Public Function ScalBitmap(ByVal Input As Bitmap, ByVal MaxSize As Size) As Bitmap
    2. Dim scalX As Double = MaxSize.Width / Input.Size.Width
    3. Dim scalY As Double = MaxSize.Height / Input.Size.Height
    4. Dim ScalRes As Double = 1
    5. If scalX > scalY Then ScalRes = scalY Else ScalRes = scalX
    6. Dim SizeX As Integer = CInt(Input.Size.Width * ScalRes)
    7. Dim SizeY As Integer = CInt(Input.Size.Height * ScalRes)
    8. Dim bit As New Bitmap(SizeX, SizeY)
    9. Using gra As Graphics = Graphics.FromImage(bit)
    10. gra.DrawImage(Input, 0, 0, SizeX, SizeY)
    11. End Using
    12. Return bit
    13. End Function


    Bitmap auf gewünschte Maße bringen:
    Wenn die neue Bitmap die Maße der Picturebox haben soll (Sizemode = StretchImage), dann verwende dieses Snippet. Die Zielbitmap wird eventuell verzerrt, das Seitenverhältnis wird nicht beibehalten!

    VB.NET-Quellcode

    1. Public Function UnscaledBitmap(ByVal input As Bitmap, ByVal Size As Size) As Bitmap
    2. Dim bit As New Bitmap(Size.Width, Size.Height)
    3. Using gra As Graphics = Graphics.FromImage(bit)
    4. gra.DrawImage(input, 0, 0, Size.Width, Size.Height)
    5. End Using
    6. Return bit
    7. End Function



    Verwendet werden beide Funtionen so:

    VB.NET-Quellcode

    1. Dim input As Bitmap = DirectCast(PictureBox1.Image, Bitmap)
    2. Dim ZielgrafikUnscaled As Bitmap = UnscaledBitmap(input, PictureBox1.Size)
    3. Dim ZielgrafikScaled As Bitmap = ScalBitmap(input, PictureBox1.Size)
    4. Zielgrafik.Save("m:\scaled.jpg", Imaging.ImageFormat.Jpeg)
    Mach mal einen anständigen WorkFlow:

    VB.NET-Quellcode

    1. Dim input As Bitmap = DirectCast(PictureBox1.Image, Bitmap)
    2. Dim ZielgrafikUnscaled As Bitmap = UnscaledBitmap(input, PictureBox1.Size)
    3. Dim ZielgrafikScaled As Bitmap = ScalBitmap(ZielgrafikUnscaled, PictureBox1.Size)
    4. ZielgrafikScaled.Save("m:\scaled.jpg", Imaging.ImageFormat.Jpeg)
    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!