在SL中位图可指向一个图像,图像其实又可能是位图或者矢量图,SL中主要使用Image元素来显示位图。
SL模式下只支持JPEG和PGn两种格式
这个文章主要介绍从各种资源中获取位图,显示位图
1.使用Image控件读取本地图片
在项目中新建一个文件夹Images,然后添加一个png图片到这个文件夹中,添加后点击右键查看属性“生成操作”=“资源resource”。注意这个地方
<Image Source="Images/test.png" Width="100" Height="100"></Image>
这样就可以显示这个test.png图片,默认情况下image控件会使用伸展属性(Stretch)来扩充这个图片到最大。
Stretch有4个不同的值,不用不同的填充方式来显示图片
2.使用image读取网络图片
直接把图片的网络地址赋值给source就可以
<Image Source="http://XXXXXX.jpg" Width="100" Height="100"></Image>
Image控件有ImageOpened和ImageFailed两个事件,可以来判断是否加载成功。
Image的属性Source不是字符串类型,而是ImageSource类。
ImageSource是一个抽象类,派生有BitmapSource ,这个继而派生BitMapImage
cs代码给Image控件赋值如下
Uri uri = new Uril("图片地址路径,或者网络路径");
BitmapImage bmp= new BitMapImage(uri);
img.Source = bmp;
或者
Uri uri = new Uril("图片地址路径,或者网络路径");
StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
BitmapImage bmp = new BitmapImage();
bmp.SetSource(resourceInfo.Stream);
img.Source = bmp;
//如果图片文件是资源属性,在cs代码使用下面的语法
Uri uri = new Uri("/PhoneApp1;component/Images/test.png", UriKind.RelativeOrAbsolute);
3。图片资源文件的属性
添加一个图片文件到vs项目中的时候,查看属性中的“生成操作”默认是“Resource资源”。
如果使用这个方式,图片文件会当作资源被打包到项目的dll文件或者exe文件中
如果把“生成操作”修改成“Content内容”,这个时候图片文件和所在的文件夹,会被复制到生成的目录中(默认debug文件夹中),可以独立的查看
一般情况下图片数量比较少,而且又小,可以当做资源文件随程序一起分发。
如果图片数量比较大,又比较大,可以考虑当做内容属性,独立的存储。如果都打包的程序中,会使程序启动比较慢
4.裁剪图片,模糊化图片
裁剪图片,通过指定图片的某个几何区域,只显示图片这个区域内的内容
图片有个Clip属性可以完成这个工作
<Image Source="Images/test.png" >
<Image.Clip>
<EllipseGeometry RadiusX="100" RadiusY="200" Center="180,180"></EllipseGeometry>
</Image.Clip>
模糊化图片只的对图片部分位置模糊化,形成特定的效果OpacityMask
<Image.OpacityMask>
<RadialGradientBrush GradientOrigin="0.5,0.5"
Center="0.5,0.5"
RadiusX="0.5"
RadiusY="0.5">
<!-- These Gradient Stop colors are only changing the
alpha values so the image fades out toward the edges. -->
<GradientStop Color="#ffffffff" Offset="0.5" />
<GradientStop Color="#00ffffff" Offset="0.8" />
</RadialGradientBrush>
</Image.OpacityMask>
从相机获取图片
在window.Phone.Task下有几个选择器(Chooser)和启动器(Launcher),选择器可以返回数据,启动器不返回数据。
CameraCaptureTask是一个选择器,定义了Completed方法和show方法。completed方法执行的时候表示相机程序被调用了,返回的PhoneResult方法包含了一个照片的Stream对象。
show方法用来显示相机程序
CameraCaptureTask camer = new CameraCaptureTask(); // 构造函数 public MainPage() { InitializeComponent(); camer.Completed += new EventHandler<PhotoResult>(camer_Completed); } void camer_Completed(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { BitmapImage bmp = new BitmapImage(); bmp.SetSource(e.ChosenPhoto); Img1.Source = bmp; } }