알파 채널을 매우 간단하게 반환하고 리턴합니다.사용자 정의 WPF ShaderEffect 알파 채널의 비정상적인 동작이 있습니다.
sampler2D tex : register(s0);
float4 PS(float2 uv : TEXCOORD) : COLOR
{
float4 color = tex2D(tex, uv);
color.a = 0;
return color;
}
이렇게하면 이미지가 완전히 보이지 않게됩니다. 그러나 그것은 일어나고있는 것처럼 보이지 않습니다. 대신 결과 이미지가 흰색 배경 위에 보이지 않게되지만 검정색 배경 위에는 변경되지 않습니다. 이 셰이더는 어떻게 든 전경과 배경 사이에 "추가"기능을 호출하게합니다.
예를 들어, 다음 코드는 전경 및 배경 이미지를로드하고 위의 셰이더 효과를 전경에 적용한 다음 비트 맵으로 렌더링하고 파일에 비트 맵을 씁니다.
public sealed partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
void Button_Click(object sender, RoutedEventArgs e)
{
const int width = 1024;
const int height = 768;
var sz = new Size(width, height);
var background = new Image { Source = new BitmapImage(new Uri(@"c:\background.jpg")) };
background.Measure(sz);
background.Arrange(new Rect(sz));
var foreground = new Image { Source = new BitmapImage(new Uri(@"c:\foreground.jpg")), Effect = new Alpha() };
foreground.Measure(sz);
foreground.Arrange(new Rect(sz));
var target = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default);
target.Render(background);
target.Render(foreground);
var jpg = new JpegBitmapEncoder();
jpg.Frames.Add(BitmapFrame.Create(target));
using (var fileStream = File.OpenWrite(@"c:\output.jpg"))
{
jpg.Save(fileStream);
}
}
}
// Standard ShaderEffect stuff here, nothing exciting.
public sealed class Alpha : ShaderEffect
{
static readonly PixelShader Shader = new PixelShader{UriSource = new Uri("pack://application:,,,/Alpha.ps", UriKind.RelativeOrAbsolute)};
public static readonly DependencyProperty InputProperty = RegisterPixelShaderSamplerProperty("Input", typeof(Alpha), 0);
public Alpha()
{
PixelShader = Shader;
UpdateShaderValue(InputProperty);
}
public Brush Input
{
get { return (Brush)GetValue(InputProperty); }
set { SetValue(InputProperty, value); }
}
}
이것은 생산하여 Win7에 샘플 사진 두에 적용 할 때 다음
내가 XAML 한 Image
에 효과를 적용 할 때 내가 화면에 표시 같은 동작입니다 , 또 다른 Image
또는 그 뒤에있는 다른 것.
전경과 배경이 뒤바뀐 경우 이미지가 동일하므로 "덧붙여"가 아니라면 이는 적어도 교환 가능합니다. 나는 그것이 "추가"라고 생각한다.
일반적으로 컴퓨터가 옳다. 따라서 사용자 오류라고 가정하지만 왜 알파를 0으로 설정하면 투명 이미지가 제공되지 않습니까? 그렇다면 어떻게 투명 이미지를 얻을 수 있습니까? (분명히 결국 쉐이더와 더 복잡한 무언가를하고 싶습니다. (특히 그린 스크린), 작동시키기 위해서는 먼저이 쉐이더를 사용해야합니다. 그래서 "불투명도 속성 설정"이라고 말하지 마십시오.)