MediaElement


MediaElementを使って動画に対して色々なエフェクトを掛けてみた。
凄く簡単だけど、重たいよー。


以下ソースコード
ソースコード:C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Effects;

namespace MovieEffect
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void RectButton_Click(object sender, RoutedEventArgs e)
        {
            /* 動画の切り抜き(四角形) */
            RectangleGeometry rGeometry = new RectangleGeometry();

            rGeometry.Rect = new Rect(50, 50, 128, 128);
            this.mediaElement1.Clip = rGeometry;
        }

        private void EllipseButton_Click(object sender, RoutedEventArgs e)
        {
            /* 動画の切り抜き(円形) */
            EllipseGeometry eGeometry = new EllipseGeometry();

            eGeometry.RadiusX = 64;
            eGeometry.RadiusY = 64;
            eGeometry.Center = new Point(100, 100);
            this.mediaElement1.Clip = eGeometry;
        }

        private void Origin_Click(object sender, RoutedEventArgs e)
        {
            /* 通常 */
            this.mediaElement1.Clip = null;
            this.mediaElement1.BitmapEffect = null;
        }

        private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            /* 透明度設定 */
            Slider s = new Slider();

            s = (Slider)sender;

            this.mediaElement1.Opacity = (1.0 - s.Value);
        }

        private void mediaElement1_MediaEnded(object sender, RoutedEventArgs e)
        {
            // ループ再生
            this.mediaElement1.Position = new TimeSpan(0);
        }

        private void Blur_Click(object sender, RoutedEventArgs e)
        {
            /* ぼかし */
            BlurBitmapEffect blur = new BlurBitmapEffect();

            blur.Radius = 5.0;
            blur.KernelType = KernelType.Gaussian;

            this.mediaElement1.BitmapEffect = blur;
        }

        private void Shadow_Click(object sender, RoutedEventArgs e)
        {
            /* 影 */
            DropShadowBitmapEffect shadow = new DropShadowBitmapEffect();

            shadow.ShadowDepth = 10;

            this.mediaElement1.BitmapEffect = shadow;
        }

        private void Glow_Click(object sender, RoutedEventArgs e)
        {
            /* グロウ */
            OuterGlowBitmapEffect glow = new OuterGlowBitmapEffect();

            glow.GlowSize = 20;

            this.mediaElement1.BitmapEffect = glow;
        }

        private void Emboss_Click(object sender, RoutedEventArgs e)
        {
            /* Emboss */
            EmbossBitmapEffect emboss = new EmbossBitmapEffect();

            emboss.LightAngle = 100;
            emboss.Relief = 0.9;

            this.mediaElement1.BitmapEffect = emboss;
        }

        private void slider2_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            /* 傾き */
            RotateTransform rotate = new RotateTransform();

            Slider s = new Slider();

            s = (Slider)sender;

            rotate.Angle = s.Value;
            rotate.CenterX = this.mediaElement1.Width / 2;
            rotate.CenterY = this.mediaElement1.Height / 2;

            this.mediaElement1.RenderTransform = rotate;
        }

        private void slider3_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            /* 拡大 */
            ScaleTransform scal = new ScaleTransform();

            Slider s = new Slider();

            s = (Slider)sender;

            scal.CenterX = this.mediaElement1.Width / 2;
            scal.CenterY = this.mediaElement1.Height / 2;

            scal.ScaleX = s.Value;
            scal.ScaleY = s.Value;

            this.mediaElement1.RenderTransform = scal;
        }

        private void mediaElement1_MediaOpened(object sender, RoutedEventArgs e)
        {

        }
    }
}

ソースコード:XAML

<Window x:Class="MovieEffect.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MediaElement Sample" Height="493" Width="300">
    <Grid>
        <Canvas Name="canvas1" Margin="1,0,-1,193">
            <MediaElement MediaEnded="mediaElement1_MediaEnded" Canvas.Left="-1" Canvas.Top="0" Height="264" Name="mediaElement1" Width="278" Source="b.wmv" MediaOpened="mediaElement1_MediaOpened" />
            <Button Canvas.Left="106" Canvas.Top="275" Height="23" Name="RectButton" Width="75" Background="Pink" Click="RectButton_Click">四角形</Button>
            <Button Canvas.Left="191" Canvas.Top="275" Height="23" Name="EllipseButton" Width="75" Background="Pink" Click="EllipseButton_Click">円形</Button>
            <Button Canvas.Left="21" Canvas.Top="275" Height="23" Name="Origin" Width="75" Background="Pink" Click="Origin_Click">通常</Button>
            <Slider Canvas.Left="21" Canvas.Top="327" Height="17" Name="slider1" Width="75" ValueChanged="slider1_ValueChanged" Maximum="1" Minimum="0" />
            <Label Canvas.Left="21" Canvas.Top="302" Height="24" Name="label1" Width="75" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Center" HorizontalContentAlignment="Center">透明度</Label>
            <Button Canvas.Left="106" Canvas.Top="321" Height="23" Name="Blur" Width="75" Background="Pink" Click="Blur_Click">ぼかし</Button>
            <Button Canvas.Left="191" Canvas.Top="321" Height="23" Name="Shadow" Width="75" Background="Pink" Click="Shadow_Click">影</Button>
            <Button Canvas.Left="21" Canvas.Top="367" Height="23" Name="Glow" Width="75" Background="Pink" Click="Glow_Click">Glow</Button>
            <Button Canvas.Left="106" Canvas.Top="367" Height="23" Name="Emboss" Width="75" Background="Pink" Click="Emboss_Click">Emboss</Button>
            <Slider Canvas.Left="191" Canvas.Top="367" Height="17" Name="slider2" Width="75" Maximum="360" ValueChanged="slider2_ValueChanged" />
            <Label Canvas.Left="191" Canvas.Top="345" FontSize="12" Height="24" HorizontalContentAlignment="Center" Name="label2" Width="75">傾き</Label>
            <Slider Canvas.Left="21" Canvas.Top="413" Height="21" Name="slider3" Width="75" ValueChanged="slider3_ValueChanged" Minimum="1" />
            <Label Canvas.Left="21" Canvas.Top="393" FontSize="12" Height="24" HorizontalContentAlignment="Center" Name="label3" Width="75">拡大</Label>
        </Canvas>
    </Grid>
</Window>