Всем привет. Нужно сделать одну вещь, а не получается. Есть canvas, на нем кнопка и текст (текст в Rectangle, только не спрашивайте, почему сразу не в TextBlock, а с извртом, ну просто так как то игрался и пришло в голову). Хочу сделать скриншот любого компонента на canvas-е. Знаю, как сделать скриншот canvas-а, а вот некоторой площади на нем - нет :( Как только не извращался, а все равно не удается сделать так, чтобы сохранялась картинка с нужной областью и размером равным этой области. Удается только размер подогнать, но содержимое содержит уменьшенную копию всего канваса с выделенным местом нужной области... Извращаюсь с sourceBrush и даже с drawingContext.PushClip(clipGeometry), но что то никак. Подскажите, пожалуйста, как сделать так, чтобы при выделаении некоторой области на канвасе, делался скрин этой области только и размера, равного размеру области. Вроде легкое, наверняка, но я чувствую, что что-то подзабыл... Код | <Window x:Class="WpfApplication4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <StackPanel> <Button Content="Click" Click="cmd_Click" /> <Canvas Name="canvas"> <Button Canvas.Left="10" Canvas.Top="20" Content="sdfsdfsdf" /> <Rectangle Canvas.Left="50" Canvas.Top="100" Width="50" Height="50"> <Rectangle.Fill> <VisualBrush> <VisualBrush.Visual> <TextBlock Text="AA" Background="Yellow" /> </VisualBrush.Visual> </VisualBrush> </Rectangle.Fill> </Rectangle> </Canvas> </StackPanel> </Window>
|
Код | public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); }
public static byte[] GetScreenShot(UIElement source, Rect size, double scale, int quality) {
double renderHeight = source.RenderSize.Height * scale; double renderWidth = source.RenderSize.Width * scale; RenderTargetBitmap renderTarget = new RenderTargetBitmap((int) size.Width, (int) size.Height, 94, 94, PixelFormats.Pbgra32);
VisualBrush sourceBrush = new VisualBrush(source);
sourceBrush.Stretch = Stretch.Uniform; sourceBrush.Viewbox = new Rect(0.1, 0.5, 1, 1); sourceBrush.ViewboxUnits = BrushMappingMode.RelativeToBoundingBox;
DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen();
RectangleGeometry clipGeometry = new RectangleGeometry(size); using (drawingContext) { // drawingContext.PushClip(clipGeometry); drawingContext.DrawRectangle(sourceBrush, null, new Rect(0, 0, size.Width, size.Height)); } 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; }
private void cmd_Click(object sender, RoutedEventArgs e) { double x = 50; double y = 100;
Rect rect = new Rect(x, y, 50, 50); byte[] screenshot = GetScreenShot(canvas, rect, 1.0, 90);
FileStream fileStream = new FileStream("Capture.jpg", FileMode.Create, FileAccess.Write); BinaryWriter binaryWriter = new BinaryWriter(fileStream); binaryWriter.Write(screenshot); binaryWriter.Close(); } }
|
|