Laden...

[Solved] Wie kann ich mit VB.NET einen Screenshot erstellen und ausdrucken?

Erstellt von _Cashisclay vor 6 Jahren Letzter Beitrag vor 6 Jahren 4.393 Views
_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren
[Solved] Wie kann ich mit VB.NET einen Screenshot erstellen und ausdrucken?

Servus,

ich versuch jetzt schon seit Tagen einen Screenshot vom Bildschirm zu machen, um diesen dann auszudrucken, leider funktioniert irgendwas immer nicht.

Ich benutze die Klasse System.Drawing.Printing.PrintDocument

Ich erstelle mein Image :

            ' --- Einstellungen vom Fenster --- '

            GetWindowRect(GetActiveWindow, Rectangle)

            ' --- Bereinigung --- '

            Image_From_Screenshot = Nothing


            Dim Image As New System.Drawing.Bitmap(Rectangle.Right - Rectangle.Left, Rectangle.Bottom - Rectangle.Top)

            ' --- Screenshot --- '

            Using Graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(Image)

                Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit

                Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality

                Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic

                Graphics.CopyFromScreen(New System.Drawing.Point(Rectangle.Left, Rectangle.Top), New System.Drawing.Point(0, 0), Image.Size)

            End Using

            Image.SetResolution(400, 400)

            Image.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipNone)

            ' --- Druckvorgang --- '

            Dim Print_Dialog As New System.Windows.Forms.PrintPreviewDialog

            '' --- Zuweisung --- '

            Image_From_Screenshot = Image

Und versuche dieses Image dann auszudrucken, leider stimmen entweder die Maße nicht oder wie aktuell sieht die Auflösung furchtbar aus, ich bin langsam am verzweifeln, hat jemand mit dem Thema bereits Erfahrungen sammeln können? Beim Googlen hat mir nichts weitergeholfen.

Image drucken :

            'Print_Document.DefaultPageSettings.Margins = New System.Drawing.Printing.Margins(0, 0, 0, 0)

            'Dim x As Integer = e.MarginBounds.X + (e.MarginBounds.Width - Image_From_Screenshot.Width) / 2

            'Dim y As Integer = e.MarginBounds.Y + (e.MarginBounds.Height - Image_From_Screenshot.Height) / 2

            'Dim imgRect As New System.Drawing.Rectangle(New System.Drawing.Point(0, 0), Image_From_Screenshot.Size)

            e.Graphics.DrawImage(Image_From_Screenshot, 0, 0, e.PageBounds.Width, e.PageBounds.Height) 'e.MarginBounds.Width - 100, e.MarginBounds.Height - 100

Grüße

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo _Cashisclay,

Ich hab den Titel mal angepasst... [Hinweis] Wie poste ich richtig?

Gruss

Coffeebean

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Niemand Erfahrungen oder eine Idee? 😕

3.003 Beiträge seit 2006
vor 6 Jahren

Das mag damit zusammen hängen, dass die URL in deiner Browserleiste mycsharp anzeigt, nicht myvb 😉

http://bfy.tw/EgZK

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Den Titel hab ich nicht gewählt sondern Coffeebean, btw. so eine Antwort ist absolut 0 hilfreich und anscheinend hast du dir weder meine Frage noch Quelltext durchgelesen, weil du anscheinend nicht wirklich einen Plan hast um was es geht.

Und hätte ja sein können das jemand unter C# das gleiche auch schon mal probiert hat, scheint aber in deiner Welt nicht der Fall zu sein 😉

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

wie kommst Du auf die Angabe 400 für die Resolution?

Image.SetResolution(400, 400)

Du machst ja einen Screenshot. Die meisten Bildschirme haben eher eine Auflösung von 96 dpi, das solltest Du dann auch für das Bild verwenden, sonst wird es viel zu klein gedruckt.

hth

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Hab ich aus einem alten Projekt übernommen wo ich bereits einen Screenshot mache und dem einer PDF hinzufüge um eine möglichst gute Qualität zu haben.

Hab es mal auf 96, 96 geändert, das Ergebnis ist gleich, einige Linien werden einfach nicht richtig gezogen dadurch sind Wörter nicht lesbar, daran kann es nicht liegen.. ist auch Drucker übergreifend so liegt also auch nicht am Drucker.

Drucken tu ich aktuell so :

e.Graphics.DrawImage(Image_From_Screenshot, 0, 0, e.PageBounds.Width, e.PageBounds.Height)
1.040 Beiträge seit 2007
vor 6 Jahren

Hier findest du einen Codeschnipsel für C# zum Speichern eines Screenshots, der wunderbar funktioniert: Capture the Screen into a Bitmap
Evtl. kannst du diesen ja mal an VB anpassen (sollte doch prinzipiell gehen? 🤔 ) und deinen Screenshot speichern. Im zweiten Schritt kümmerst du dich dann ums Drucken. =)

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Es scheint nicht am Screenshot zu liegen sondern am Druck irgendwie verzehrt der Drucker mir das Bild

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Der Screenshot sieht ganz normal und auch gut aus, aber sobald ich das ganze drucken möchte, kommt folgendes verzehrtes Bild raus :

Irgendwas muss bei dein Druckereinstellungen nicht stimmen.

3.003 Beiträge seit 2006
vor 6 Jahren

Dein DrawImage-Aufruf skaliert das Bild, dabei gehen dir einige Informationen verloren. Stattdessen Bild vorher händisch skalieren und eine Überladung von DrawImage benutzen, die nicht skaliert.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Hey LaTino,

danke für deine Antwort, du meinst wahrschein DrawImageUnscaled.

Ich guck mal wie ich das Bild auf eine A4 Seite skaliere und ob das dann besser funktioniert.

Grüße

3.003 Beiträge seit 2006
vor 6 Jahren

danke für deine Antwort, du meinst wahrschein DrawImageUnscaled.

Nein. Ich meine das, was ich schrieb. In der Dokumentation steht, welche Methode skaliert, und welche nicht: Graphics.DrawImage.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Versteh jetzt nicht was an der

DrawImageUnscaled(Image,Int32,Int32)

Zeichnet das angegebene Bild in seiner ursprünglichen physischen Größe an der von einem Koordinatenpaar angegebenen Position.

Funktion dann so verkehrt sein soll?

Grüße

3.003 Beiträge seit 2006
vor 6 Jahren

"verkehrt" ist daran nichts, die Methode sieht halt so aus:

  
public void DrawImageUnscaled(Image image, int x, int y) {  
            DrawImage(image, x, y);  
        }  
  

Ich dachte allerdings, du wolltest dein Problem lösen und nicht Haare spalten. Mein Fehler.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Du meintest doch nutze eine Methode die dein Bild nicht skaliert und skaliere es stattdessen zuvor selber? Das versuche ich aktuell .. Mir ist bewusst das du mir die Lösung nicht via Quelltext zureichst, allerdings sitz ich auch schon einige Tage an dem Problem und schreib in der Regel nur ins Forum, wenn ich wirklich nicht mehr weiterkomme, dementsprechend fehlen mir an solchen Punkten wahrscheinlich schon die Nerven für solche Ratespiele oder seh das offentsichtliche mittlerweile nicht mehr.

Grüße

3.003 Beiträge seit 2006
vor 6 Jahren

Du missverstehst. Ich weiß die Lösung nicht genau, aber ich bin mir relativ sicher, dass es sich um ein Problem beim skalieren handelt, dafür ist das Bild typisch. Und deshalb solltest du, was du ja auch machst, alle Stellen, an denen (vielleicht) skaliert wird, eliminieren, danach Stück für Stück wieder einfügen und während der ganzen Zeit das Ergebnis abgleichen. Stattdessen machst du - so mein Eindruck - lieber einen Nebenschauplatz auf und diskutierst die Frage, ob du nicht DrawImageUnscaled benutzen kannst, obwohl im Quelltext von .NET zu sehen ist, dass beides identisch ist und eine Diskussion darum mehr als sinnlos. Bring das Bild erstmal unskaliert auf's Papier, prüfe die Qualität, dann skaliere so, dass du's unter Kontrolle hast (i.e. ohne Methoden zu nutzen, die implizit skalieren). So wird ein Schuh draus.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

_
_Cashisclay Themenstarter:in
277 Beiträge seit 2014
vor 6 Jahren

Gibt sicherlich viele Wege die zum Ziel führen, aber hier mein Lösungsansatz :

        ' --- interne Variablen Deklaration --- '

        Dim Bitmap As System.Drawing.Bitmap

        Dim BitmapImage As New System.Windows.Media.Imaging.BitmapImage

        Dim MemoryStream As New System.IO.MemoryStream

        Try

            Bitmap = Screenshot.get_Bitmap_From_Screenshot(Me)

            If Bitmap IsNot Nothing Then

                Dim PrintDialog As New System.Windows.Controls.PrintDialog

                PrintDialog.PrintTicket.PageOrientation = Printing.PageOrientation.Landscape

                If PrintDialog.ShowDialog = True Then

                    Dim Image As New Image

                    ' --- Größenangabe --- '

                    Image.Width = PrintDialog.PrintableAreaWidth

                    Image.Height = PrintDialog.PrintableAreaHeight

                    ' --- Image Befüllung --- '

                    Bitmap.Save(MemoryStream, System.Drawing.Imaging.ImageFormat.Bmp)

                    BitmapImage.BeginInit()

                    BitmapImage.StreamSource = New System.IO.MemoryStream(MemoryStream.ToArray)

                    BitmapImage.EndInit()

                    Image.Source = BitmapImage

                    PrintDialog.PrintVisual(Image, "Servicemanagementsystem")

                End If

            End If

        Catch ex As Exception
            Fehlerbehandlung = New Fehlerbehandlung
            Fehlerbehandlung.Fehlermeldung = ex
            Fehlerbehandlung.ShowDialog()
        End Try
    Public Function get_Bitmap_From_Screenshot(ByVal Visual As Visual) As System.Drawing.Image

        ' --- interne Variablen Deklaration --- ' 

        Dim Bitmap As System.Drawing.Bitmap

        Dim DrawingVisual As New DrawingVisual

        Try

            ' --- Größe des Visual --- '

            Dim Rectangle As System.Windows.Rect = VisualTreeHelper.GetDescendantBounds(Visual)

            ' --- Konvertieren vom Visual in ein Bitmap Objekt --- '

            Dim RenderTargetBitmap As New RenderTargetBitmap(Convert.ToInt32(Rectangle.Width), Convert.ToInt32(Rectangle.Height), 96, 96, PixelFormats.Pbgra32)

            Using DrawingContext As DrawingContext = DrawingVisual.RenderOpen

                Dim VisualBrush As New VisualBrush(Visual)

                ' --- Rechteck zeichnen --- '

                DrawingContext.DrawRectangle(VisualBrush, Nothing, New System.Windows.Rect(New Point(), Rectangle.Size))

            End Using

            RenderTargetBitmap.Render(DrawingVisual)

            ' --- Bitmap --- '

            Dim PngBitmapEncoder As New PngBitmapEncoder

            PngBitmapEncoder.Frames.Add(BitmapFrame.Create(RenderTargetBitmap))

            Using MemoryStream = New System.IO.MemoryStream

                PngBitmapEncoder.Save(MemoryStream)

                Bitmap = New System.Drawing.Bitmap(MemoryStream)

            End Using

            Dim Image As System.Drawing.Image = DirectCast(Bitmap.Clone, System.Drawing.Image)

            Bitmap = New System.Drawing.Bitmap(Image.Width + 50, Image.Height + 50)

            Dim Graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(Bitmap)

            Graphics.DrawImage(Image, 25, 25)

            Return Bitmap

        Catch ex As Exception
            Fehlerbehandlung = New Fehlerbehandlung
            Fehlerbehandlung.Fehlermeldung = ex
            Fehlerbehandlung.ShowDialog()
        End Try

        Return Nothing

    End Function