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
Hallo _Cashisclay,
Ich hab den Titel mal angepasst... [Hinweis] Wie poste ich richtig?
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Das mag damit zusammen hängen, dass die URL in deiner Browserleiste mycsharp anzeigt, nicht myvb 😉
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)
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 😉
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
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)
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. =)
Es scheint nicht am Screenshot zu liegen sondern am Druck irgendwie verzehrt der Drucker mir das Bild
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.
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)
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
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)
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
"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)
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
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)
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