使用RenderTargetBitmap将控件生成图片默认从window读取

womabiwomabi 2014-04-25 03:05:07
使用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开始的。有什么办法可以解决这个问题呢?
...全文
446 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Option1999 2014-05-11
  • 打赏
  • 举报
回复 1
其实更好的解决方案是: 在Canvas 外面加上一层Border
Option1999 2014-05-10
  • 打赏
  • 举报
回复
我想到一个方案。 designCanvas.Measure(designCanvas.RenderSize); designCanvas.Arrange(new Rect(designCanvas.RenderSize)); 但是会移动Canvas,然后就不知道如何移动回来了。
Option1999 2014-05-10
  • 打赏
  • 举报
回复
同问此问题。
吾乃水镜 2014-05-07
  • 打赏
  • 举报
回复
我也遇到和你同样的问题,帮顶!

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧