无法将像素着色器渲染到 RenderTargetBitmap!请帮忙!
我编写了一个非常简单的 WPF 应用程序来测试渲染具有与 RenderTargetBitmap 关联的像素着色器的控件的能力。然后我将位图写入文件(jpeg)。该控件被渲染到位图上,但是像素着色器效果不会应用于该控件。
代码和 XAML 如下:
namespace TestPixelShader
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnSaveSnapshot(object sender, RoutedEventArgs e)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.DefaultExt = "jpg";
if ((bool)dlg.ShowDialog() == true)
{
String fileName = dlg.FileName;
int Height = (int)CanvasControl.ActualHeight;
int Width = (int)CanvasControl.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap(
Width, Height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(CanvasControl);
string Extension = System.IO.Path.GetExtension(fileName).ToLower();
BitmapEncoder encoder;
if (Extension == ".gif")
encoder = new GifBitmapEncoder();
else if (Extension == ".png")
encoder = new PngBitmapEncoder();
else if (Extension == ".jpg")
encoder = new JpegBitmapEncoder();
else
return;
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (Stream stm = File.Create(fileName))
{
encoder.Save(stm);
}
}
}
}
}
XAML:
<Window x:Class="TestPixelShader.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestPixelShader"
Height="400"
Width="300"
Title="Test Pixel Shader">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Canvas Grid.Column="0" x:Name="CanvasControl" Margin="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" >
<Canvas.Effect>
<local:TestPixelShaderEffect />
</Canvas.Effect>
<Canvas.Background>
<ImageBrush ImageSource="/TestPixelShader;component/Images/DSCF0225.JPG" />
</Canvas.Background>
</Canvas>
<Button x:Name="SaveSnapshotButton" Grid.Row="1" Click="OnSaveSnapshot" Height="40"
Content="Take Snapshot" Margin="5"/>
</Grid>
</Window>
I wrote a very simple WPF application to test the ability to render a control that has an associated pixel shader to a RenderTargetBitmap. I then write the bitmap to file (jpeg). The control is rendered onto the bitmap, however the pixel shader effect is not applied to the control.
The code and the XAML is below:
namespace TestPixelShader
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnSaveSnapshot(object sender, RoutedEventArgs e)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.DefaultExt = "jpg";
if ((bool)dlg.ShowDialog() == true)
{
String fileName = dlg.FileName;
int Height = (int)CanvasControl.ActualHeight;
int Width = (int)CanvasControl.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap(
Width, Height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(CanvasControl);
string Extension = System.IO.Path.GetExtension(fileName).ToLower();
BitmapEncoder encoder;
if (Extension == ".gif")
encoder = new GifBitmapEncoder();
else if (Extension == ".png")
encoder = new PngBitmapEncoder();
else if (Extension == ".jpg")
encoder = new JpegBitmapEncoder();
else
return;
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (Stream stm = File.Create(fileName))
{
encoder.Save(stm);
}
}
}
}
}
XAML:
<Window x:Class="TestPixelShader.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestPixelShader"
Height="400"
Width="300"
Title="Test Pixel Shader">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Canvas Grid.Column="0" x:Name="CanvasControl" Margin="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" >
<Canvas.Effect>
<local:TestPixelShaderEffect />
</Canvas.Effect>
<Canvas.Background>
<ImageBrush ImageSource="/TestPixelShader;component/Images/DSCF0225.JPG" />
</Canvas.Background>
</Canvas>
<Button x:Name="SaveSnapshotButton" Grid.Row="1" Click="OnSaveSnapshot" Height="40"
Content="Take Snapshot" Margin="5"/>
</Grid>
</Window>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的目标是哪个 Pixel Shader 版本?
我尝试了你的代码,它为 PS 2.0 着色器正确保存了图像。 RenderTargetBitmap 使用软件渲染器,而 PS 3.0 没有软件回退,因此如果您使用 PS 3.0 着色器,它将被忽略。
What Pixel Shader version are you targeting?
I tried your code and it saved the image correctly for a PS 2.0 shader. RenderTargetBitmap uses the software renderer and PS 3.0 doesn't have a software fallback so if your using a PS 3.0 shader it will be ignored.
用法:
Usage: