Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
ScreenShot von einer Komponente erstellen
Andreaz
myCSharp.de - Member



Dabei seit:
Beiträge: 53

Themenstarter:

ScreenShot von einer Komponente erstellen

beantworten | zitieren | melden

Hallo,

gibt es in C# eine Möglichkeit, ein Screenshot einer Canvas-Komponente mit seinen Inhalten zu erstellen? Dieses soll auf ein Image- oder ImageBrush-Objekt angewendet werden.
private Nachricht | Beiträge des Benutzers
Lennart
myCSharp.de - Member



Dabei seit:
Beiträge: 416
Herkunft: Bawü

beantworten | zitieren | melden

Googlesuche nach ScreenShot of a component c#
private Nachricht | Beiträge des Benutzers
Levion
myCSharp.de - Member

Avatar #avatar-3432.png


Dabei seit:
Beiträge: 114

beantworten | zitieren | melden

Hm, da hab ich schonmal was gemacht. Das schaut in etwa so aus (ich habs auch ergooglet ;) ).


using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Forms;

[...]

		void button1_Click(object sender, RoutedEventArgs e)
		{
			WriteFile(@"D:\Temp\test01.jpg");
		}
		
		
		private void WriteFile(string path){
			byte[] data = null;
			
			data = GetJpgImage(Clock,1,100); // Clock müsste alles sein können, was UIElement implementiert
			
			FileStream stream = new FileStream(path, FileMode.OpenOrCreate);
			
			foreach (byte digit in data ){
				stream.WriteByte(digit);
			}
			stream.Close();
		}
		
		
		public static byte[] GetJpgImage(UIElement source, double scale, int quality)
		{
		    double actualHeight = source.RenderSize.Height;
		    double actualWidth = source.RenderSize.Width;
		
		    double renderHeight = actualHeight * scale;
		    double renderWidth = actualWidth * scale;
		
		    RenderTargetBitmap renderTarget = new RenderTargetBitmap((int) renderWidth, (int) renderHeight, 96, 96, PixelFormats.Pbgra32);
		    VisualBrush sourceBrush = new VisualBrush(source);
		
		    DrawingVisual drawingVisual = new DrawingVisual();
		    DrawingContext drawingContext = drawingVisual.RenderOpen();
		
		    using (drawingContext)
		    {
		        drawingContext.PushTransform(new ScaleTransform(scale, scale));
		        drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
		    }
		    renderTarget.Render(drawingVisual);
		
		    JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
		    jpgEncoder.QualityLevel = quality;
		    jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
		
		    Byte[] _imageArray;
		
		    using (MemoryStream outputStream = new MemoryStream())
		    {
		        jpgEncoder.Save(outputStream);
		        _imageArray = outputStream.ToArray();
		    }
		
		    return _imageArray;
		}
[...]
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Levion am .
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1.044
Herkunft: Koblenz

beantworten | zitieren | melden

Hallo Andreaz,

mit der Methode PrintDialog.PrintVisual ist es möglich.

zero_x
zero_x | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers