WriteableBitmap

WriteableBitmap,第1张

概述Silverlight 3 开始支持 WriteableBitmap。WriteableBitmap 是一个可写入并可更新的 BitmapSource。BitmapSource 是 WPF/Silverlight 图像处理管线的基本构造块,从概念上说表示具有特定大小和分辨率的单个不变的像素集。 他们类的继承层次结构如下: System.Object   System.Windows.Threadi

Silverlight 3 开始支持 WriteableBitmap。WriteableBitmap 是一个可写入并可更新的 BitmapSource。BitmapSource 是 WPF/Silverlight 图像处理管线的基本构造块,从概念上说表示具有特定大小和分辨率的单个不变的像素集。

他们类的继承层次结构如下:
System.Object
  System.windows.Threading.dispatcherObject
    System.windows.DependencyObject
      System.windows.Freezable
        System.windows.Media.Animation.Animatable
          System.windows.Media.ImageSource
            System.windows.Media.Imaging.BitmapSource
              System.windows.Media.Imaging.BitmapFrame
              System.windows.Media.Imaging.BitmAPImage  
              System.windows.Media.Imaging.CachedBitmap
              System.windows.Media.Imaging.colorConvertedBitmap
              System.windows.Media.Imaging.CroppedBitmap
              System.windows.Media.Imaging.FormatConvertedBitmap
              System.windows.Media.Imaging.rendertargetBitmap
              System.windows.Media.Imaging.transformedBitmap
              System.windows.Media.Imaging.WriteableBitmap
              System.windows.Interop.InteropBitmap

需要注意的,上面的结构是WPF中支持的,Silverlight 3仅支持上面红色的那两个,其他的不支持。

MSDN 网站描述这个类的用途如下:

使用 WriteableBitmap 类一帧一帧地更新和呈现位图。这对于拍摄视频播放快照、生成算法内容(如分形图像)和数据可视化(如音乐可视化应用程序)很有用。

WriteableBitmap主要有两种使用方法:

使用WriteableBitmap构造函数呈现位图 使用WriteableBitmap类的Render 方法呈现位图,可以多次调用Render 方法,继而实现图片的合并,游戏的换肤就可以用这种方式。

 

使用类的构造函数呈现位图 

下面我就来演示一个最简单的使用 WriteableBitmap 类的构造函数演示位图的例子,这个例子截文本输入框中的图到右边列表框中。

Xaml 文件:

<UserControl x:Class="Silverlight_WriteableBitmap.MainPage"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:d="http://schemas.microsoft.com/Expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    mc:Ignorable="d"    d:DesignHeight="300" d:DesignWIDth="400">    <StackPanel OrIEntation="Horizontal">        <StackPanel OrIEntation="Vertical" >            <TextBox x:name="tb_Txt" WIDth="200" Height="150" AcceptsReturn="True"  textwrapPing="Wrap" Text="测试测试"/>            <button x:name="btn_printScreen" WIDth="100" Height="39" Content="截屏" margin="50" Click="btn_printScreen_Click" />            StackPanel>        <ListBox x:name="ListBox" WIDth="200" />        StackPanel>      UserControl>

C#代码文件:

using System;using System.Collections.Generic;using System.linq;using System.Net;using System.windows;using System.windows.Controls;using System.windows.documents;using System.windows.input;using System.windows.Media;using System.windows.Media.Animation;using System.windows.Shapes;using System.windows.Media.Imaging;namespace Silverlight_WriteableBitmap{    public partial class MainPage : UserControl    {        public MainPage()        {            InitializeComponent();        }        private voID btn_printScreen_Click(object sender,RoutedEventArgs e)        {            WriteableBitmap bitmap = new WriteableBitmap(tb_Txt,null);            Image img = new Image();            img.Height = 150;            img.WIDth = 150;            img.source = bitmap;            img.Stretch = Stretch.Uniform;            ListBoxItem item = new ListBoxItem();            item.Content = img;            ListBox.Items.Add(item);        }    }}

说明:

上面例子中,我们使用的是 public WriteableBitmap(UIElement element,transform transform) 这个构造函数。element 是要在位图中呈现的元素;transform 是用户在绘制到位图之前最后一步应用到元素的变换。如果您希望位图将元素的变换考虑在内,则这对于您特别有意义。此值可为 null。

这个 WriteableBitmap 构造函数适用于绝大多数的"复制内容"方案。这个构造函数可生成在保留内容基础下,尽量减少空白的 PBGRA32格式(采用32BPP的一种基于sRGB的像素格式)的  WriteableBitmap。它把 element 的各种变化都考虑进去了,这些变化包括:Clip,Effect,Opacity,OpacityMask,Children。当然还有一些变化没有包含,这时候,我们可以对他的父控件进行截屏,就可以扑捉到这些没有包括的变化。另外:WriteableBitmap 不能呈现d出式控件,如 Popup、ComboBox 和 tooltip。

 

使用Render多次呈现位图

另外, 如果您希望多次呈现此位图,则使用 Render 方法。如果您使用 Render 方法,则需要调用 InvalIDate 以便呈现位图。 当向位图中的像素分配颜色时,请使用自左乘的颜色。

多次呈现的一个典型场景就是游戏的换肤,比如这篇博客就探讨到这个问题:Silverlight游戏中的WriteableBitmap技术可行性报告

下面的例子则是演示通过多次Render呈现,实现字体的立体效果。

演示XAML代码

<UserControl x:Class="Silverlight_WriteableBitmap.MainPage"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:d="http://schemas.microsoft.com/Expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    mc:Ignorable="d"    d:DesignHeight="300" d:DesignWIDth="400" Loaded="UserControl_Loaded">    <GrID x:name="LayoutRoot" Background="DarkGray">        <GrID.RowDeFinitions>            <RowDeFinition Height="*"/>            <RowDeFinition Height="*"/>            <RowDeFinition Height="*"/>            GrID.RowDeFinitions>        <@R_301_5559@ @R_301_5559@Brush="Red" @R_301_5559@Thickness="2"                GrID.Row="0">            <Image x:name="Outputimage1"/>            @R_301_5559@> <@R_301_5559@ @R_301_5559@Brush="Blue" @R_301_5559@Thickness="2" GrID.Row="1"> <Image x:name="Outputimage2"/>      @R_301_5559@> <@R_301_5559@ @R_301_5559@Brush="Green" @R_301_5559@Thickness="2" GrID.Row="2"> <Image x:name="Outputimage3"/>       @R_301_5559@>        GrID>         UserControl>

C#代码部分

using System;using System.Collections.Generic;using System.linq;using System.Net;using System.windows;using System.windows.Controls;using System.windows.documents;using System.windows.input;using System.windows.Media;using System.windows.Media.Animation;using System.windows.Shapes;using System.windows.Media.Imaging;namespace Silverlight_WriteableBitmap{    public partial class MainPage : UserControl    {        public MainPage()        {            InitializeComponent();        }        private WriteableBitmap SetupRenderedTextBitmap(string text,double FontSize)        {            // setup the textblock we will render to a bitmap            TextBlock txt1 = new TextBlock();            txt1.Text = text;            txt1.FontSize = FontSize; // set the Font size before using the Actual WIDth / Height            // create our first bitmap we will render to            WriteableBitmap bitmap = new WriteableBitmap((int)txt1.ActualWIDth,(int)txt1.ActualHeight);            txt1.Foreground = new SolIDcolorBrush(colors.Black);            bitmap.Render(txt1,new Translatetransform() { X = -2,Y = -2 });            txt1.Foreground = new SolIDcolorBrush(colors.White);            bitmap.Render(txt1,new Translatetransform());            // invalIDate the bitmap so that it is rendered            bitmap.InvalIDate();            return bitmap;        }        private voID UserControl_Loaded(object sender,RoutedEventArgs e)        {            WriteableBitmap bitmap1 = SetupRenderedTextBitmap("http://blog.joycode.com/ghj/",64.0D);            WriteableBitmap bitmap2 = SetupRenderedTextBitmap("http://blog.joycode.com/ghj/",24.0D);            WriteableBitmap bitmap3 = SetupRenderedTextBitmap("http://blog.joycode.com/ghj/",12.0D);            Outputimage1.source = bitmap1;            Outputimage2.source = bitmap2;            Outputimage3.source = bitmap3;        }    }}

演示效果如下图:

说明:

Render 方法支持不属于可视化树的 UIElement 对象。您需要先为不在可视化树中的 UIElement 对象调用 Measure 和 Arrange,然后再调用 Render。 调用Render 方法之后,必须调用 InvalIDate 以便呈现此位图。 如果元素比位图大,或者如果元素在自己空间的负区域中具有一些点,则会根据情况对它进行剪裁。

 

参考资料:

silverlight3新增功能2:WriteableBitmap
http://www.cnblogs.com/dino623/archive/2009/09/04/silverlight.html

用于 Silverlight 的 .NET Framework 类库 : WriteableBitmap 类
http://msdn.microsoft.com/zh-cn/library/system.windows.media.imaging.writeablebitmap(VS.95).aspx

用于 Silverlight 的 .NET Framework 类库WriteableBitmap 构造函数 (UIElement,transform)
http://msdn.microsoft.com/zh-cn/library/dd638675(VS.95).aspx

Silverlight游戏中的WriteableBitmap技术可行性报告
http://www.cnblogs.com/Jax/archive/2010/02/02/1662287.html

Rendering Text to a WriteableBitmap with Silverlight 3's Bitmap API
http://www.smartypantscoding.com/content/rendering-text-writeablebitmap-silverlight-3s-bitmap-api

总结

以上是内存溢出为你收集整理的WriteableBitmap全部内容,希望文章能够帮你解决WriteableBitmap所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1036616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存