Silverlight读取Zip文件中的图片与视频

首先看看Demo的截图:

下面我将一步步展示实现这个Demo的过程,这个需求就是读出Zip文件中的图片与视频。

Demo整体架构:

首先我们准备几张图片和视频,然后将其压缩至resource.zip文件中,做完之后,我们建立一个resource.xml文件记录压缩包内的资源

      <?xml version="1.0" encoding="utf-8" ?>
      <files>
      <file type="video" name="a.wmv"/>
      <file type="image" name="1.jpg"/>
      <file type="image" name="2.jpg"/>
      <file type="image" name="3.jpg"/>
      <file type="image" name="4.jpg"/>
      </files>

这个xml文件就记录了文件的类型和名称,完成之后我们将其压缩至resource.zip中(请注意:这一步对后面读取流会有影响)

现在我们将UI设计好

         <Image x:Name="Image" />
         <MediaElement x:Name="Video" />
         <StackPanel HorizontalAlignment="Left" VerticalAlignment="Bottom" Opacity="0.5" Orientation="Horizontal" Margin="5,0,0,0" Name="stack">
            <Button Content="Prev" x:Name="PrevButton"  Height="30" Margin="0,0,5,0" Width="80" Opacity="1" Cursor="Hand" IsEnabled="False"  />
            <Button  x:Name="NextButton" Height="30" Margin="0,0,5,0" Width="80" Opacity="1" Content="Next" Cursor="Hand" IsEnabled="False"  />
         </StackPanel>

在UI上放置了一个Image和MediaElement控件来显示读取的资源

下面我们开始建立ResourceInfo.cs文件

       public enum ResourceType
      {
        Video,
        Image
      }
      public class ResourceInfo
      {
        public ResourceType Type
        {
            get;  set;
        }
        public string Name
        {
            get; set;
        }
       }

文件的类型以枚举的形式表示,现在我们就在MainPage.xaml.cs中以WebClient完成数据的读取工作

先声明3个类成员变量:

       private StreamResourceInfo zip;
       private List<ResourceInfo> resourceInfo;
       private int index = 0;

现在我们就先获取流,其完整代码:

       public void Load(object sender,RoutedEventArgs e)
        {
            Uri uri = new Uri(HtmlPage.Document.DocumentUri, "resource.zip");
            WebClient webClient = new WebClient();
            webClient.OpenReadCompleted += (obj, args) =>
            {
                if (args.Error != null)
                {
                    return;

                }
                // 这几步将读出的流信息封装到reader中,这样便于后面使用Linq To Xml操作
                zip = new StreamResourceInfo(args.Result, null);
                StreamResourceInfo maininfo = Application.GetResourceStream(zip, new Uri("resource.xml", UriKind.Relative));
                StreamReader reader = new StreamReader(maininfo.Stream);

                XDocument doc = XDocument.Load(reader);
                var file = from c in doc.Descendants("file")
                           select new ResourceInfo
                           {
                               Type = (ResourceType)Enum.Parse(typeof(ResourceType), c.Attribute("type").Value, true),
                               Name = c.Attribute("name").Value
                           };
                resourceInfo = new List<ResourceInfo>();
                resourceInfo.AddRange(file);
                this.PrevButton.IsEnabled = true;
                this.NextButton.IsEnabled = true;
                Display(resourceInfo[0]);
            };
             webClient.OpenReadAsync(uri);
        }
         public void Display(ResourceInfo resource)
        {
            //获取相应的流数据
            StreamResourceInfo media = Application.GetResourceStream(zip,new Uri(resource.Name,UriKind.Relative));
            switch (resource.Type)
            {
                case ResourceType.Image:
                    Image.Visibility = Visibility.Visible;
                    Video.Visibility = Visibility.Collapsed;
                    BitmapImage image = new BitmapImage();
                    image.SetSource(media.Stream);
                    Image.Source = image;
                    break;
                case ResourceType.Video:
                    Image.Visibility = Visibility.Collapsed;
                    Video.Visibility = Visibility.Visible;
                    Video.SetSource(media.Stream);
                    Video.Play();
                    break;
            }
         }

事实上加载这段代码后,我们已经可以将xml文件中标注的第一个资源a.wmv在页面进行成功的播放了

我们继续界面上的Button实现的循环显示上一条,下一条资源功能

         private void StopVideo()
        {
            if (resourceInfo[index].Type == ResourceType.Video)
            {
                Video.Stop();
            }
        }
        private void PrevButton_Click(object sender, RoutedEventArgs e)
        {
            StopVideo();
            if (--index < 0)
            {
                index = resourceInfo.Count - 1;
            }
            Display(resourceInfo[index]);
        }
        private void NextButton_Click(object sender, RoutedEventArgs e)
        {
            StopVideo();
            if (++index >=resourceInfo.Count)
            {
                index = 0;
            }
            Display(resourceInfo[index]);
        }

如此我们就完成了这个Demo

Silverlight读取Zip文件中的图片与视频

时间: 2024-10-15 18:00:04

Silverlight读取Zip文件中的图片与视频的相关文章

在ASP.NET中实现图片、视频文件上传方式

一.图片 1.在前端用<asp:FileUpload ID="UpImgName" runat="server"/>控件 2.在后台.cs中写上 protected void btnSubmit_Click(object sender,EventArgs e) { string strImgPath=string.Empty; string strDateTime=dateTime.Now.Tostring("yyyyMMddhhmmss&qu

向github的README文件中添加图片

1,向README文件中添加图片,用于展示程序效果或辅助说明! 两步: 首先,向github 上传所需的图片: 然后,打开README文件,写入图片的格式为: ![image](https://github.com/secondLieutenantCoder/TableAndCollection/blob/master/resut.png?raw=true) ![image](图片的URL) 图片写入成功!

Asp.Net 读取xml文件中Key的值,并且过滤掉注释内容代码

/// <summary> /// 读取配置文件keys /// </summary> /// <returns></returns> public string _GetKeys() { string filename = Server.MapPath("/") + @"web.config"; XmlDocument xmldoc = new XmlDocument(); XmlReaderSettings set

黑马程序员——IO——读取一个文件中的文字输出到控制台上

读取一个文件中的文字输出到控制台上 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; //读取一个文件中的文字 ,输出到控制台上 //读取的是字符文字,因此可以使用字符流来操作 public class FileReaderDemos { public static void main(String[] args) { // TODO Auto-generate

读取Excel文件中的单元格的内容和颜色

读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.Office.Interop.Excel;或者using Microsoft.Excel; string file = @"E:\test.xls"; //测试文件 Excel.Application excel = null; Excel.Workbook wkb = null; try {

java 中读取本地文件中字符

java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路读取甲方的信息:new FileInputStream(file) 目前这个信息已经读进来内存当中了.接下来需要解读成乙方可以理解的东西 既然你使用了FileInputStream().那么对应的需要使用InputStreamReader()这个方法进行解读刚才装进来内存当中的数据 解读完成后要输出

Flex读取txt文件中的内容报错

Flex读取txt文件中的内容 1.具体错误如下 2.错误原因 读取文件不存在 var file:File = new File(File.applicationDirectory.nativePath+"/phone.txt"); 3.解决办法 将文件导入进去 Flex读取txt文件中的内容报错

Flex读取txt文件中的内容(一)

Flex读取txt文件中的内容 phone.txt: 13000003847 13000003848 13000003849 13000003850 13000003851 13000003852 13000003853 13000003854 13000003855 13000003856 13000003857 13000003858 13000003859 13000003860 13000003861 13000003862 13000003863 13000003864 1300000

Flex读取txt文件中的内容(二)

Flex读取txt文件中的内容 自动生成的文件 LoadTxt-app.xml: <?xml version="1.0" encoding="utf-8" standalone="no"?> <application xmlns="http://ns.adobe.com/air/application/1.5.3"> <!-- Adobe AIR Application Descriptor Fi