使用RenderTargetBitmap将WPF代码中canvas中的内容生成图片。生成是可以成功,但是我发现图形生成的时候是从window开始生成而不是该canvas。只有当window和canvas完全重合才不会有黑边。
<Window x:Class="ImageClipDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" HorizontalAlignment="Center"
>
<Canvas x:Name="designCanvas" Background="White" Width="500" Height="300">
<Border Width="142" BorderBrush="#FF000000" BorderThickness="1,1,1,1" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" Margin="8,11.159,0,0" VerticalAlignment="Top" Height="150">
<Image Source="1.jpg" Stretch="Fill" Width="142" Height="150"/>
</Border>
<Ellipse x:Name="imgOper" Stroke="#FF000000" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Top" Height="150" HorizontalAlignment="Right" Width="150" Canvas.Left="211" Canvas.Top="84"
>
<Ellipse.Fill>
<ImageBrush ImageSource="1.JPG" Viewport="-0.16,-0.16,1.18,1.28" x:Name="imgBrush"/>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Window>
private void PrintPicture(string fileName)
{
this.Dispatcher.BeginInvoke(new Action(() =>
{
int Height = (int)this.designCanvas.ActualHeight;
int Width = (int)this.designCanvas.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap(Width, Height, 96, 96,PixelFormats.Pbgra32);
designCanvas.Margin = new Thickness(0,0,0,0);
bmp.Render(designCanvas);
string file = @"C:\Users\Jason Fang\Desktop\WaterMark\test.png";
BitmapEncoder encoder;
encoder = new JpegBitmapEncoder();
BitmapFrame bf = BitmapFrame.Create(bmp);
;
encoder.Frames.Add(bf);
using (Stream stm = File.Create(file))
{
encoder.Save(stm);
}
//File.Delete(fileName);
}), System.Windows.Threading.DispatcherPriority.Render);
Image bi = new Image();
}
demo界面为:
生成后的图片为:
明显可以看出,RenderTargetBitmap在生成图片的不是从canvas开始读取的,而是从最外层的window开始的。有什么办法可以解决这个问题呢?