Laden...

ScreenShot von einer Komponente erstellen

Erstellt von Andreaz vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.171 Views
A
Andreaz Themenstarter:in
53 Beiträge seit 2011
vor 12 Jahren
ScreenShot von einer Komponente erstellen

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.

L
416 Beiträge seit 2008
vor 12 Jahren
114 Beiträge seit 2009
vor 12 Jahren

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;
		}
[...]

1.044 Beiträge seit 2008
vor 12 Jahren

Hallo Andreaz,

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

zero_x