WP8.1开发中关于媒体(图片)文件的生成操作,属性如何设置(内容/嵌入资源等);

(转载)WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题

链接:http://www.cnblogs.com/qinxg/archive/2012/07/17/2594503.html

在开发过程中遇到了图片加载器与视频播放器无法正常读取媒体资源的问题。

在代码中 图片路径是正确的,图片无法正常读出。而视频部分采取相同的代码,却可以正常读出。

读取图片代码如下:

读取视频代码如下:

(转载)WindowsPhone问题笔记-- 正确选择build action 解决媒体资源无法读取问题

其中2个的地址相似都为:/Assets/XXXX/XXX.XXX

读取图片错误信息如下:

后对比视频文件与图片文件时发现问题。

原来图片和视频的生成操作(build action)设置有差别。

视频的为:内容(content)                                             图片的为:Rescoure

查阅MSDN后发现,两种生成操作最后获取资源有很大的差异,并且对性能有很大影响。

首先介绍build action


Action


说明


None


资源既不会被集成到程序集内,也不会打包到xap包中。不过我们可以通过设置CopyToOutputDirectory选项让其自动拷贝到xap包所在目录。 这种情况下, 访问这个图片的相对Uri需要以"/"开始。

适用场景:在大多数情况下,我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大,会影响silverlight应用的加载,而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用。 类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的,都可以用绝对Uri进行引用。


Compile


不适合用于资源文件。类文件要用"Compile"生成操作, 就是指项目里.cs或.vb文件。


Content


资源会被打包在Xap包里面。这种情况下, 访问这个图片的相对Uri需要以"/"开始。在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件, 如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用。


Embedded Resource


这种方式会把文件嵌入到程序集中,Silverlight无法通过Uri引用在xaml和C#里对这个文件进行使用,微软不建议在Silverlight采用这种方式在程序集里嵌入资源。如果有这种需求可以用Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的Stream引用。


ApplicationDefinition


Silverlight程序的入口xaml文件(默认就是App.xaml)应该设置为这个"应用定义"。其他文件都不适合用这个。


Page


不适合用于资源文件。所有的用户控件,页面和子窗体(Usercontrol/Page/Childwindow)的xaml文件应该采用的生成操作。 如果改为别的方式那么会导致后台对应的代码文件无法链接到这个xaml文件。 采用"Page" build action时xaml里的错误会导致工程无法正确生成。


CodeAnalysisDictionary


代码分析使用,Silverlight中可以忽略


Resource


资源会被打包在程序集内部。 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。 可以用相对于当前的XAML文件的相对Uri访问,<Image Source="sl.png" />或是<Image Source="./sl.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.png” />访问到。最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/sl.png"/>,这种方式还可以引用到xap中的其他程序集中的图片。这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。


SplashScreen


"SplashScreen"是这个选项是WPF的启动画面使用的。Silverlight启动加载画面是用的其他方式实现的,所以在Silverlight里不要用这个方式。


EntityDeploy


这个是EntityFramework采用的生成方式,在Silverlight里是没用。

需要关注的是,对于媒体资源通常使用ContentResource两种不同的方式。

 

采取Content时,资源会被打包在Xap包里面。这种情况下, 访问这个图片的相对Uri需要以"/"开始。在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件, 如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用。

获取媒体资源方式:直接采用/文件夹/文件即可获取到资源文件。

采用Resource时,资源会被打包在程序集内部。 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。 可以用相对于当前的XAML文件的相对Uri访问,<Image Source="sl.png" />或是<Image Source="./sl.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.png” />访问到。最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/sl.png"/>,这种方式还可以引用到xap中的其他程序集中的图片。这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。

 

获取媒体资源方式:/{assemblyShortName};component/sl.png 的方式来获取,其中assemblyShortName为程序集名称。

本次问题中,针对图片文件使用了 Resource,而视频文件使用了Content。所以出现了上图问题。

在MSDN中说明,出于性能考虑,媒体资源需要设置为 内容(Content),说明如下:

对 Windows Phone 上的媒体处理进行优化以使用文件和网络流,而不是使用内存中的流。这意味着应用程序中包括的任何媒体文件(例如声音效果)应该将其生成操作设置为内容而不是资源。当媒体文件作为内容编译时,它会作为松散文件与应用程序文件 (.XAP) 一起存储,而不是存储在应用程序文件中。当媒体文件作为资源编译时,通常通过检索文件流来访问,这可能会降低性能。此外,当播放编译为内容的媒体文件时,会直接进行播放。当媒体文件作为资源编译时,播放之前需要将内容复制到 Windows Phone 上的文件,这会降低性能。

参考地址:http://msdn.microsoft.com/zh-cn/library/ff967560(v=VS.92).aspx

http://www.cnblogs.com/listenfly/archive/2011/11/03/2235059.html

时间: 2024-10-06 00:24:32

WP8.1开发中关于媒体(图片)文件的生成操作,属性如何设置(内容/嵌入资源等);的相关文章

java开发中截取上传文件的文件名和后缀名

java开发中截取上传文件的文件名和后缀名 /** * Return the extension portion of the file's name . * * @see #getExtension */ public static String getExtension(File f) { return (f != null) ? getExtension(f.getName()) : ""; } public static String getExtension(String f

Android 开发中下载的图片 图库中看不到

Android 开发中下载的图片,但是代开图库的时候,不能马上看到图片.是因为android 内部有一个 扫描机制, 你下载之后图片已经存在了,但是没有被扫描到.所以你马上打开图库 看不到 下载的图片: 需啊哟加入下面的 代码 下载完成的hanlder 中处理: 直接调用就可以 MediaScannerConnection.scanFile( ShowBigImage.this, new String[] {url}, null, null);

ios开发中如何选择图片的加载方式

第一种方法:imageNamed:   (经常会重复使用的图标 用这个,图片不大的) 为什么有两种方法完成同样的事情呢?imageNamed的优点在于可以缓存已经加载的图片. 这种方法会首先在系统缓存中根据指定的名字寻找图片,如果找到了就返回.如果没有在缓存中找到图片,该方法会从指定的文件中加载图片数据,并将其缓存起来,然后再把结果返回.对于同一个图像,系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的.例如:你需要在 一个TableView里重复加载同样一个图标,那么用ima

如何在PDF文档内容中插入/添加图片文件

现在很多人都会使用PDF格式文件,但是却很少会有人知道怎么编辑这种文件,我们所见的PDF格式文档是一种及其特殊的文件,这种文不论是修改还是编辑都非常的困难,因此,如果我们需要在PDF文件中插入图片的话该怎么做呢?今天小编就来为大家详细的介绍下如何使用专业软件在PDF文件中插入图片! 需要使用的软件是迅捷PDF编辑器,是一款专业的PDF编辑软件,下载很简单,只要在浏览器上搜索到迅捷PDF编辑器是官方网站,点击软件下载后选择下路径就可以了.安装运行也极为简单,还要按照提示点击下一步就可以了,在官网下

Android 开发中使用到二维码生成和解析

二维码生成 二维码解析 在项目的开发中, 使用二维码作为数据传递 交换 已经是常态了! 在这我也讲讲自己在项目开发中使用到的二维码. 生成二维码的开发流程 1 应用google 给我们提供的zxing.jar (建议官网下载) 2 使用zxing.jar 的MultiFormatWriter 类 生成一张二维码图片 核心代码块 /** * 方法说明:生成无图片二维码 */ @SuppressWarnings("unused") private Bitmap createTwoCode(

[转]windows下VS2010中lib与dll文件的生成与使用

原文地址:https://my.oschina.net/SysuHuyh5LoveHqq/blog/644622 近期在windows下开发了某个程序,需要将其生成静态文件(lib)以及动态库文件(dll),其中参考了不少帖子,有的讲得也不是很清楚明白,先将本人实践过的记录一下,供后期自己查询,也供各位大牛点评. 一.lib文件的生成与使用 1.lib的生成 相对来说,静态库文件还是比较容易生成和使用的,在代码上,貌似也不需要更改什么,举例说明: 头文件函数声明形式如下: extern bool

c++中.dll与.lib文件的生成与使用的详解

两种库: ? 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.? 包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library.共有两种链接方式: ? 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息.? 静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库

Vs2012在Linux开发中的应用(5):项目属性的定义

VS的项目属性表实际上是由一系列的XML文件定义的,都存放在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\2052目录下,我们完全可以仿照它们的定义添加自己的属性页. 首先在项目文件中导入自定义的目标: <Import Condition="$(Platform)=='hi3516'" Project=" EmbedLinux.targets" /> 这里的EmbedLinux.target

(转)Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)

这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor  和 /Editor 是一样的,无论多少个叫Editor的文件夹都可以.Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用.一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL. 比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行