稳扎稳打Silverlight(38) – 3.0过滤镜的BlurEffect, DropShadowEffect, 自定义滤镜, 3D效果的PlaneProjection, 位图API之WriteableBitmap

[索引页]
[源码下载]

     
 之前以利用NSTimer时,遇到一个题目,NSTimer启动了,但是单会起一样软定时,之后就是不起作用。问了同事,他说用加以在RunLoop中,我从不考虑太多,就放任他说的,在他层加了一个Runloop,定时器确实打作用了。近期做另外一个任务,发现RunLoop在多线程中之所以底比多,所以大概查了生有关资料。

稳扎稳打Silverlight(38) – 3.0过滤镜的BlurEffect, DropShadowEffect,
自定义滤镜, 3D效果的PlaneProjection, 位图API之WriteableBitmap

     
runLoop是线程中之巡回,并针对性吸纳的事件进行拍卖,它打区区只不同之风波源中接收信息。Input
sources(CFRunLoopSource)投递异步消息,通常来自另一个thread或者其它一个应用程序。Timer
sources(CFRunLoopTimer)当在计划之年华或重复的流年距离内送并消息。两种植事件源都使用应用程序指定的处理方式对达的事件进行拍卖。下图展示了run
loop和见仁见智的波起源结构:

作者:webabcd

Run Loop的应用场所:

介绍
Silverlight 3.0 图形系统的连带新增功能

 1. 施用port或是自定义之input source来和其它线程进行通信                
                         2. 于线程(非主线程)中利用timer              
                                                             3. 使
performSelector…系列(如performSelectorOnThread, …)                    
     4. 采取线程执行周期性工作

  • BlurEffect – 模糊滤镜 
  • DropShadowEffect – 阴影滤镜
  • 起定义滤镜 
  • PlaneProjection – 将平面的 UIElement 映射到 3D
  • WriteableBitmap – 位图 API(Bitmap API)

run loop不待创造,在线程中仅仅需要调用[NSRunLoop
currentRunLoop]即便足以得到假设我们想如果候某个异步方法的回调。比如connection。如果我们的线程中从不启动run
loop,是勿会见发生作用的(因为线程已经运行了,正常退出了)。              
                   使用runLoop阻塞线程的科学写法                        
                               @implementation ViewController          
                                                                   {    
                                                                       
                                                         BOOL end;      
                                                                       
                           }

在线DEMO
http://www.cnblogs.com/webabcd/archive/2009/08/04/1538238.html

示例
1、模糊滤镜(BlurEffect)的示范
BlurEffect.xaml

– (void)viewDidLoad                                                    
                                            {                          
                                                                       
                                   [super viewDidLoad];              
                                                                       
         NSLog(@”start new thread …”);                                  
                                               [NSThread
detachNewThreadSelector:@selector(runOnNewThread)                      
   toTarget:self withObject:nil];                                      
                                             while (!end) {            
                                                                       
                       NSLog(@”runloop…”);                              
                                                               
 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:
        [NSDate distantFuture]];                                    
                                                      NSLog(@”runloop
end.”);                                                                
                          }                                            
                                                                       
          NSLog(@”ok.”);                                                
                                                  }

图片 1<navigation:Page x:Class=”Silverlight30.Graphic.BlurEffect” 
图片 2           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 3           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 4           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
图片 5           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
图片 6           mc:Ignorable=”d”
图片 7           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 8           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 9           Title=”BlurEffect Page”>
图片 10    <Grid x:Name=”LayoutRoot”>
图片 11        <StackPanel>
图片 12        
图片 13            <!–
图片 14                滤镜效果的 Blur
图片 15                BlurEffect – 模糊效果
图片 16                    BlurEffect.Radius – 模糊半径。越老进一步模糊,默认值为 5
图片 17            –>
图片 18        
图片 19            <Image Source=”/Resource/Logo.jpg”>
图片 20                <Image.Effect>
图片 21                    <BlurEffect x:Name=”blurEffect” Radius=”5″ />
图片 22                </Image.Effect>
图片 23            </Image>
图片 24            
图片 25            <Slider Width=”500″ Minimum=”0″ Maximum=”10″ Value=”{Binding Radius, Mode=TwoWay, ElementName=blurEffect}” />
图片 26            
图片 27        </StackPanel>
图片 28    </Grid>
图片 29</navigation:Page>
图片 30

-(void)runOnNewThread                                                  
                                       {                                
                                                                       
                            NSLog(@”run for new thread …”);            
                                                               
sleep(1);                                                              
                                                    [self
performSelectorOnMainThread:@selector(setEnd) withObject:nil            
          waitUntilDone:NO];                                          
                                                      NSLog(@”end.”);  
                                                                       
                      }

2、阴影滤镜(DropShadowEffect)的演示
DropShadowEffect.xaml

-(void)setEnd  {                                                        
                                                      end=YES;          
                                                                       
                        }

图片 31<navigation:Page x:Class=”Silverlight30.Graphic.DropShadowEffect” 
图片 32           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 33           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 34           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
图片 35           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
图片 36           mc:Ignorable=”d”
图片 37           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 38           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 39           Title=”DropShadowEffect Page”>
图片 40    <Grid x:Name=”LayoutRoot”>
图片 41        <StackPanel>
图片 42        
图片 43            <!–
图片 44                滤镜效果的 DropShadow
图片 45                DropShadowEffect – 阴影效果
图片 46                    DropShadowEffect.BlurRadius – 阴影的歪曲半径。默认值为 5
图片 47                    DropShadowEffect.Color – 阴影的水彩。默认值为 FF000000
图片 48                    DropShadowEffect.Direction – 阴影相对于 UIElement 的大势。以光源从右边为左照射为 0 度,度数为逆时针正增长,默认值 315 度(即阴影在 UIElement 的右边下角)
图片 49                    DropShadowEffect.Opacity – 阴影的免透明度。默认值为 1
图片 50                    DropShadowEffect.ShadowDepth – 阴影的纵深(即阴影和 UIElement 间的偏离量)。默认值为 5,有效值为 0 – 300 之间
图片 51            –>
图片 52        
图片 53            <Image Source=”/Resource/Logo.jpg”>
图片 54                <Image.Effect>
图片 55                    <DropShadowEffect x:Name=”dropShadowEffect” 
图片 56                                      BlurRadius=”5″ 
图片 57                                      Color=”Blue” 
图片 58                                      Direction=”315″ 
图片 59                                      Opacity=”1″ 
图片 60                                      ShadowDepth=”5″ />
图片 61                </Image.Effect>
图片 62            </Image>
图片 63            
图片 64            <Slider Width=”500″ Minimum=”0″ Maximum=”10″ Value=”{Binding BlurRadius, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 65            <Slider Width=”500″ Minimum=”0″ Maximum=”360″ Value=”{Binding Direction, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 66            <Slider Width=”500″ Minimum=”0″ Maximum=”1″ Value=”{Binding Opacity, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 67            <Slider Width=”500″ Minimum=”0″ Maximum=”100″ Value=”{Binding ShadowDepth, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 68            
图片 69        </StackPanel>
图片 70    </Grid>
图片 71</navigation:Page>
图片 72

每次运行 Run loop,你线程的 Run loop
对会活动处理之前未处理的音,并通知相关的观察者。具体的一一如下:

3、自定义滤镜的贯彻。滤镜库地址http://www.codeplex.com/wpffx
以下为条纹漩涡滤镜为条例演示
BandedSwirlEffect.xaml

  1. 通告观察者 Run loop 已经启动。

  2. 通观察者任何即将要开之定时器。

  3. 通报观察者任何即将开行的非基于端口的来源。

  4. 起步任何准备好的非基于端口的根源。

  5. 倘根据端口的来准备好并处在等候状态,立即启动;并登步骤 9。

  6. 通告观察者线程进入休眠。

  7. 以线程置于休眠直到任一下面之风波时有发生:

图片 73<navigation:Page x:Class=”Silverlight30.Graphic.BandedSwirlEffect” 
图片 74           xmlns:effects=”clr-namespace:ShaderEffectLibrary”
图片 75           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 76           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 77           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
图片 78           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
图片 79           mc:Ignorable=”d”
图片 80           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 81           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 82           Title=”SwirlEffect Page”>
图片 83    <Grid x:Name=”LayoutRoot”>
图片 84        <StackPanel>
图片 85        
图片 86            <!–
图片 87                Silverlight 3.0 只发生点儿个放置滤镜:BlurEffect 和 DropShadowEffect
图片 88                其他还多滤镜可以于 http://www.codeplex.com/wpffx 下充斥。滤镜的算法本质上来说都是依据像从的渲染器
图片 89                .fx 为滤镜源文件,编译后呢 .ps 文件,.cs 文件可以调用 .ps 文件,从而在 Silverlight 中显现具体的滤镜效果
图片 90                以下为一个条纹漩涡滤镜为例演示 http://www.codeplex.com/wpffx 上的滤镜库的动
图片 91            –>
图片 92        
图片 93            <Image Source=”/Resource/Logo.jpg”>
图片 94                <Image.Effect>
图片 95                    <effects:BandedSwirlEffect SwirlStrength=”10″ />
图片 96                </Image.Effect>
图片 97            </Image>
图片 98            
图片 99        </StackPanel>        
图片 100    </Grid>
图片 101</navigation:Page>
图片 102

   某平等事变到基于端口的源;

4、3D效果的示范
Projection.xaml

   定时器启动;

图片 103<navigation:Page x:Class=”Silverlight30.Graphic.Projection” 
图片 104           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 105           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 106           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
图片 107           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
图片 108           mc:Ignorable=”d”
图片 109           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 110           Title=”Projection Page”>
图片 111    <Grid x:Name=”LayoutRoot”>
图片 112        <StackPanel>
图片 113        
图片 114            <!–
图片 115                Projection – 映射
图片 116                PlaneProjection – 将平面的 UIElement 映射到 3D
图片 117                    RotationX, RotationY, RotationZ – 绕 X轴, Y轴, Z轴 旋转的角度
图片 118                    CenterOfRotationX, CenterOfRotationY, CenterOfRotationZ – X轴, Y轴, Z轴 旋转中心点的对立位置(CenterOfRotationX, CenterOfRotationY 默认值为 0.5 , CenterOfRotationZ 默认值为 0)
图片 119                    GlobalOffsetX, GlobalOffsetY, GlobalOffsetZ – 沿 X轴, Y轴, Z轴 的偏移量,此 3 只方向与屏幕的 3 独样子平
图片 120                    LocalOffsetX, LocalOffsetY, LocalOffsetZ – 沿 X轴, Y轴, Z轴 的偏移量,此 3 独趋势及 相关UIElement 当前的 3 个方向一致
图片 121            –>
图片 122        
图片 123            <MediaElement x:Name=”mediaElement” Source=”/Resource/Demo.mp4″ AutoPlay=”True” MediaEnded=”mediaElement_MediaEnded” Width=”320″ Height=”240″>
图片 124                <MediaElement.Projection>
图片 125                    <PlaneProjection x:Name=”projection” />
图片 126                </MediaElement.Projection>
图片 127            </MediaElement>
图片 128                        
图片 129            <Slider Minimum=”0″ Maximum=”360″ Value=”{Binding RotationX, Mode=TwoWay, ElementName=projection}” ToolTipService.ToolTip=”RotationX” />
图片 130            <Slider Minimum=”0″ Maximum=”360″ Value=”{Binding RotationY, Mode=TwoWay, ElementName=projection}” ToolTipService.ToolTip=”RotationY” />
图片 131            <Slider Minimum=”0″ Maximum=”360″ Value=”{Binding RotationZ, Mode=TwoWay, ElementName=projection}” ToolTipService.ToolTip=”RotationZ” />
图片 132            
图片 133        </StackPanel>
图片 134    </Grid>
图片 135</navigation:Page>
图片 136

   Run loop 设置的流年就过;

5、应用位图 API(Bitmap API)实现常用功能的言传身教
WriteableBitmapDemo.xaml

   Run loop 被显式唤醒。

图片 137<navigation:Page x:Class=”Silverlight30.Graphic.WriteableBitmapDemo” 
图片 138           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 139           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 140           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
图片 141           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
图片 142           mc:Ignorable=”d”
图片 143           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 144           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 145           Title=”WriteableBitmapDemo Page”>
图片 146    <Grid x:Name=”LayoutRoot”>
图片 147        <StackPanel HorizontalAlignment=”Left”>
图片 148        
图片 149            <Image x:Name=”img” />
图片 150            
图片 151            <Image x:Name=”img2″ />
图片 152            
图片 153            <TextBlock x:Name=”lbl” />
图片 154            <Image x:Name=”img3″ Source=”/Resource/Logo.jpg” MouseMove=”img3_MouseMove”/>
图片 155            
图片 156            <StackPanel Orientation=”Horizontal”>
图片 157                <MediaElement x:Name=”mediaElement” Source=”/Resource/Demo.mp4″ MediaEnded=”mediaElement_MediaEnded” />
图片 158                <Button Content=”截屏” Click=”Button_Click” Width=”40″ Height=”30″ VerticalAlignment=”Center” />
图片 159                <Image x:Name=”img4″ />
图片 160            </StackPanel>
图片 161     
图片 162        </StackPanel>
图片 163    </Grid>
图片 164</navigation:Page>
图片 165

  1. 通告观察者线程将吃提醒。

  2. 处理不处理的波

WriteableBitmapDemo.xaml.cs

    如果用户定义之定时器启动,处理定时器事件并再开 Run loop。进入步骤 2。

图片 166图片 167/**//*
图片 168 * WriteableBitmap – 位图 API(Bitmap API)
图片 169 * WriteableBitmap.Pixels – 一个整型数组,用于描述有像从的水彩(ARGB)
图片 170 * WriteableBitmap.Render() – 将指定的 UIElement 以位图的方表现出来
图片 171 * WriteableBitmap.Invalidate() – 绘图
图片 172 * WriteableBitmap.PixelWidth – 宽度。单位:像素
图片 173 * WriteableBitmap.PixelHeight – 高度。单位:像素
图片 174 */
图片 175
图片 176using System;
图片 177using System.Collections.Generic;
图片 178using System.Linq;
图片 179using System.Net;
图片 180using System.Windows;
图片 181using System.Windows.Controls;
图片 182using System.Windows.Documents;
图片 183using System.Windows.Input;
图片 184using System.Windows.Media;
图片 185using System.Windows.Media.Animation;
图片 186using System.Windows.Shapes;
图片 187using System.Windows.Navigation;
图片 188
图片 189using System.Windows.Media.Imaging;
图片 190
图片 191namespace Silverlight30.Graphic
图片 192图片 193图片 194{
图片 195    public partial class WriteableBitmapDemo : Page
图片 196图片 197    图片 198{
图片 199        public WriteableBitmapDemo()
图片 200图片 201        图片 202{
图片 203            InitializeComponent();
图片 204
图片 205            this.Loaded += new RoutedEventHandler(WriteableBitmapDemo_Loaded);
图片 206            this.Loaded += new RoutedEventHandler(WriteableBitmapDemo_Loaded2);
图片 207        }
图片 208
图片 209图片 210        /**//// <summary>
图片 211        /// 以起定义像素点颜色之计变位图
图片 212        /// </summary>
图片 213        void WriteableBitmapDemo_Loaded(object sender, RoutedEventArgs e)
图片 214图片 215        图片 216{
图片 217            // 初始化一个宽 40 高 20 的 WriteableBitmap 对象
图片 218            WriteableBitmap bitmap = new WriteableBitmap(40, 30);
图片 219            
图片 220            for (int i = 0; i < 40 * 30; i++)
图片 221图片 222            图片 223{
图片 224                unchecked
图片 225图片 226                图片 227{
图片 228                    // 每个像素的水彩之讲述规范为 ARGB
图片 229                    bitmap.Pixels[i] = (int)0xFFFF0000;
图片 230                }
图片 231            }
图片 232
图片 233            bitmap.Invalidate();
图片 234
图片 235            img.Source = bitmap;
图片 236        }
图片 237
图片 238图片 239        /**//// <summary>
图片 240        /// 将指定的 UIElement 以位图的办法做呈现
图片 241        /// </summary>
图片 242        void WriteableBitmapDemo_Loaded2(object sender, RoutedEventArgs e)
图片 243图片 244        图片 245{
图片 246            WriteableBitmap bitmap = new WriteableBitmap(320, 240);
图片 247
图片 248            var txt = new TextBlock();
图片 249            txt.Text = “webabcd”;
图片 250
图片 251            // 将点名的 TextBlock 以位图的法门展现出来
图片 252图片 253            bitmap.Render(txt, new ScaleTransform() 图片 254{ ScaleX = 320 / txt.ActualWidth, ScaleY = 240 / txt.ActualHeight });
图片 255            bitmap.Invalidate();
图片 256
图片 257            img2.Source = bitmap;
图片 258        }
图片 259
图片 260图片 261        /**//// <summary>
图片 262        /// 获取指定图片的某像素点的颜色
图片 263        /// </summary>
图片 264        private void img3_MouseMove(object sender, MouseEventArgs e)
图片 265图片 266        图片 267{
图片 268            WriteableBitmap bitmap = new WriteableBitmap(img3, null);
图片 269
图片 270            int color = bitmap.Pixels[(int)e.GetPosition(img3).Y * (int)img3.ActualWidth + (int)e.GetPosition(img3).X];
图片 271
图片 272            // 将整型转换为字节数组
图片 273            byte[] bytes = BitConverter.GetBytes(color);
图片 274
图片 275            // 将字节数组转换为颜色(bytes[3] – A, bytes[2] – R, bytes[1] – G, bytes[0] – B)
图片 276            lbl.Text = Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]).ToString();
图片 277        }
图片 278
图片 279图片 280        /**//// <summary>
图片 281        /// 用 WriteableBitmap 实现对视频文件的截屏功能
图片 282        /// </summary>
图片 283        private void Button_Click(object sender, RoutedEventArgs e)
图片 284图片 285        图片 286{
图片 287            // 将点名的 UIElement 转换为 WriteableBitmap 对象
图片 288            WriteableBitmap bitmap = new WriteableBitmap(mediaElement, null);
图片 289
图片 290            img4.Source = bitmap;
图片 291        }
图片 292
图片 293        private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
图片 294图片 295        图片 296{
图片 297            mediaElement.Stop();
图片 298            mediaElement.Play();
图片 299        }
图片 300    }
图片 301}
图片 302

    如果输入源启动,传递相应的音。

OK
[源码下载]

    如果 Run loop 被显式唤醒而且时间还从来不过,重开 Run loop,进入步骤 2。

  1. 照会观察者 Run loop 结束。