Qualität eines Screenshots in VB runter schrauben für kleinere Datei

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von DieKey.

    Qualität eines Screenshots in VB runter schrauben für kleinere Datei

    Guten Tag,

    wenn ich ein Screenshot mache und mir diesen im JPG Format speicher, und mir diesen per Mail zu schicke, ist dieser manchmal 2 MB groß.
    Für UMTS und nur 200 MB Internetnutzung in Monat ist mir das zu viel.
    Wie kann ich die Datei von der Dateigröße kleiner kriegen? Das die Qualität nachlässt, macht wenn nix.

    Mein Quelltext zum Screen machen:

    VB.NET-Quellcode

    1. Public Function ScreenshotErstellen() As Bitmap
    2. Dim b As New Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height)
    3. Dim g As Graphics = Graphics.FromImage(b)
    4. g.CopyFromScreen(0, 0, 0, 0, b.Size)
    5. g.Dispose()
    6. Return b
    7. End Function
    8. 'Dann einfach nur noch mit "save" speichern!


    Wäre über Hilfe erfreut!

    DieKey
    Die Bitmap b mithilfe eines anderen Graphics-Objektes auf eine andere Bitmap zeichnen, die z.B. halb so groß ist. Dazu die Graphics.DrawImage() Methode verwenden. Der kann man die Größe mitgeben. Und beim Verkleinern der Größe empfiehlt es sich die InterpolationMode-Eigenschaft des Graphics-Objektes auf HighQualityBicubic zu setzen.
    Dann die neue Bitmap zurückgeben, anstelle von b.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Wie sondern? Du musst das .bmp erst mit der Anleitung meines Vorredners komprimieren. Ein .bmp ist unkomprimiert und daher hat es diese Grösse. Ein .pdf bleibt auch ein .pdf, auch wenn Du .txt dahinter schreibst.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @DieKey: Du kannst gerne den Inhalt einer MP3-Datei in einer Datei mit der Endung .doc speichern. Windows wird dann halt aufgrund der Endung MSWord anweisen, die Datei zu öffnen. Das wird natürlich fehlschlagen. Aber wenn Du die Datei einem Mediaplayer vorwirfst (und nicht nach erlaubten Endungen filterst, dann wird der Mediaplayer die Datei abspielen.

    @SpaceyX: Ich verstehe aber nicht ganz was das mit dem Thema zu tun hat.
    Die Bitmap.Save(String)-Methode erkennt das richtige Format automatisch anhand des Dateinamens (Endung). Ich bin mir aber nicht sicher, ob das auch auf diese Überladung zutrifft.
    Aber ich vermute mal, weil "GetEncoder(ImageFormat.Jpeg)" verwendet wurde, wird das richtige Format verwendet.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    VB.NET-Quellcode

    1. b.Save("test.jpg", Imaging.ImageFormat.Jpeg)


    So ja. An der Dateiendung erkennt die .Save()-Sub das nicht. Der TE macht das aber nicht. Er schreibt einfach "Dann noch speichern".
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX:
    Ok, wir haben beide teilweise recht.

    VB.NET-Quellcode

    1. Using Bipm As New Bitmap(1366, 768), _
    2. g As Graphics = Graphics.FromImage(Bipm)
    3. g.CopyFromScreen(0, 0, 0, 0, New Size(1366, 768))
    4. Bipm.Save("C:\Users\Administrator\Desktop\SavedWithout.jpeg")
    5. End Using
    6. Using Bipm As New Bitmap(1366, 768), _
    7. g As Graphics = Graphics.FromImage(Bipm)
    8. g.CopyFromScreen(0, 0, 0, 0, New Size(1366, 768))
    9. Bipm.Save("C:\Users\Administrator\Desktop\SavedWith.jpeg", Imaging.ImageFormat.Jpeg)
    10. End Using


    Beides sind JPEG-Dateien, aber die, bei der das Format angegeben wurde, ist um ein vielfaches kleiner.
    Bilder
    • Unbenannt.png

      123,53 kB, 757×534, 137 mal angesehen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Und das ist auch ne .jpeg-Datei. Ist aber in Wirklichkeit ne .zip :)
    Dateien
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich speicher das ganze so:


    VB.NET-Quellcode

    1. PictureBox1.Image = ScreenshotErstellen()
    2. Dim Number As Integer = My.Settings.lv_Settings
    3. Dim Pfad As String = "D:/Mail_bot/" & Number.ToString() & "Screenshot.jpg"
    4. ' MessageBox.Show(Pfad)
    5. PictureBox1.Image.Save(Pfad)
    6. Number += 1
    7. My.Settings.lv_Settings = Number
    8. My.Settings.Save()




    @ Niko:

    Ist das der Quelltext zum kleiner machen??

    @ SpaceyX: wie hast du das jetzt hin bekommen ? :O

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

    @DieKey:
    (anstelle des [ vb ] beim zweiten musst Du [/ vb ] schreiben (ohne Leerzeichen))

    Ganz simpel: Statt PictureBox1.Image.Save(Pfad) verwendest Du PictureBox1.Image.Save(Pfad, Imaging.ImageFormat.JPEG).

    Nein, es ist ein simpler Code um einen Screenshot zu machen.

    Rechtsklick auf den Desktop -> Neu -> Zip-Archiv.
    Dateien hineinziehen.
    Rechtsklick auf Datei -> Umbenennen -> "FractalLandscape.jpg"
    ????
    Profit!


    Edit: @Samus Aran: Komisch. Ich hätte erwartet, dass Windows den Dateityp aus dem Inhalt zieht (also das, was auf dem Screenshot zu sehen ist).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner

    Schau mal das Bild an.

    test.bmp wurde so gespeichert b.Save(.bmp)
    test.jpg wurde so gespeichert b.Save(.jpg)
    test.jpeg wurde so gespeichert b.Save(.jpeg, Imaging.ImageFormat.Jpeg)

    Zwischen .bmp und .jpg gibt es kaum nen unterschied. Die 4KB kommen einfach durch das Bild selber. .bmp und .jpg sind Bitmaps. Nur die .jpeg-Endung ist komprimiert. Die Endung .jpeg hab ich nur gewählt, damit die .jpg-Datei nicht überschrieben wurde. Könnte genau so gut .jpg heissen.
    Bilder
    • comp.jpg

      332,53 kB, 1.131×515, 135 mal angesehen
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    !!

    Habe die "COMPRESSION" mal versucht anzuwenden!!

    VB.NET-Quellcode

    1. PictureBox1.Image = ScreenshotErstellen()
    2. Dim Number As Integer = My.Settings.lv_Settings
    3. Dim Pfad As String = "D:/Mail_bot/" & Number.ToString() & "Screenshot.jpg"
    4. ' MessageBox.Show(Pfad)
    5. PictureBox1.Image.Save(Pfad)
    6. Number += 1
    7. My.Settings.lv_Settings = Number
    8. My.Settings.Save()
    9. ' Get a bitmap.
    10. Dim bmp1 As New Bitmap(Pfad)
    11. Dim jgpEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)
    12. ' Create an Encoder object based on the GUID
    13. ' for the Quality parameter category.
    14. Dim myEncoder As System.Drawing.Imaging.Encoder = System.Drawing.Imaging.Encoder.Quality
    15. ' Create an EncoderParameters object.
    16. ' An EncoderParameters object has an array of EncoderParameter
    17. ' objects. In this case, there is only one
    18. ' EncoderParameter object in the array.
    19. Dim myEncoderParameters As New EncoderParameters(1)
    20. Dim myEncoderParameter As New EncoderParameter(myEncoder, 50&)
    21. myEncoderParameters.Param(0) = myEncoderParameter
    22. bmp1.Save(Pfad, jgpEncoder, myEncoderParameters)
    23. myEncoderParameter = New EncoderParameter(myEncoder, 100&)
    24. myEncoderParameters.Param(0) = myEncoderParameter
    25. bmp1.Save(Pfad, jgpEncoder, myEncoderParameters)
    26. ' Save the bitmap as a JPG file with zero quality level compression.
    27. myEncoderParameter = New EncoderParameter(myEncoder, 0&)
    28. myEncoderParameters.Param(0) = myEncoderParameter
    29. bmp1.Save(Pfad, jgpEncoder, myEncoderParameters)



    PS: Habe den Slash vergessen! Danke dafür!


    So! so weit so gut, bei

    VB.NET-Quellcode

    1. Dim jgpEncoder As ImageCodecInfo = GetEncoder(ImageFormat.Jpeg)

    wird "GetEncoder" blau unterstrichen und als Fehler wird gemeldet:
    Name "GetEncoder" is not declared"
    Weil Du vergessen hast, die GetEncoder-Function zu copy und pasten

    VB.NET-Quellcode

    1. Private Function GetEncoder(ByVal format As ImageFormat) As ImageCodecInfo
    2. Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageDecoders()
    3. Dim codec As ImageCodecInfo
    4. For Each codec In codecs
    5. If codec.FormatID = format.Guid Then
    6. Return codec
    7. End If
    8. Next codec
    9. Return Nothing
    10. End Function
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o