• 各种流的转换


    关于流的转换,估计每个程序员都会频繁遇到。并且因为 Nokia Imaging SDK 支持 Windows Phone、

    Windows 8 开发,所以支持流的格式有很多,为了备用,今后会在本文中补充各种流的格式转换。

    1、System.IO.Stream 类型转换为 Windows.Storage.Streams.IBuffer:

      void StreamToIBuffer(Stream stream, IBuffer ibuffer)
      {
          using (MemoryStream memory = new MemoryStream())
          {
              memory.Position = 0;
              stream.Position = 0; // 注意流的位置设置 0
              stream.CopyTo(memory);
    
              // 通过 MemoryStream 的此方法,把 Stream 对象转换为 IBuffer
              ibuffer = memory.GetWindowsRuntimeBuffer();
          }
      }

    MemoryStream.GetWindowsRuntimeBuffer() 是 MemoryStream 类的扩展方法,需要添加 System.Runtime.InteropServices.WindowsRuntime

    命名空间。

     2、Windows.Storage.Streams.IBuffer 转换成 System.IO.Stream

      void IBufferToStream(Windows.Storage.Streams.IBuffer ibuffer, Stream stream)
      {
          //stream = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.AsStream(ibuffer);
          
          //或者 
          stream = ibuffer.AsStream();
      }

    IBuffer.AsStream() 是 IBuffer 的扩展方法,需要添加 System.Runtime.InteropServices.WindowsRuntime 命名空间。

    3、System.IO.Stream 转换成 System.Byte :

     void StreamToBytes(Stream stream, byte[] bytes)
     {
         // stream.Position = 0; 流的位置设置为 0
    
         using (MemoryStream ms = new MemoryStream())
         {
             byte[] buffer = new byte[8 * 1024];
             int read = 0;
             while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
             {
                 ms.Write(buffer, 0, read);
             }
    
             bytes = ms.ToArray();
         }
     }

    或者

     public byte[] StreamToBytes(Stream stream)
     {
         // 设置当前流的位置为流的开始
         stream.Seek(0, SeekOrigin.Begin);
    
         byte[] bytes = new byte[stream.Length];
         stream.Read(bytes, 0, bytes.Length);
    
         return bytes;
     }

    4、 System.Byte 转换成  System.IO.Stream

     void BytesToStream(Stream stream, byte[] bytes)
     {
          stream = new MemoryStream(bytes);
     }

     5、IBuffer 转换成、 byte [] :

    static byte[] BufferToBytes(IBuffer buf)
    {
        using (var dataReader = DataReader.FromBuffer(buf))
        {
            var bytes = new byte[buf.Capacity];
            dataReader.ReadBytes(bytes);
    
            return bytes;
        }
    }


    6、 byte [] 转换成 IBuffer

     static IBuffer BytesToBuffer(byte[] bytes)
     {
         using (var dataWriter = new DataWriter())
         {
             dataWriter.WriteBytes(bytes);
    
             return dataWriter.DetachBuffer();
         }
     }

     7、Windows 运行时的流和 .NET 中的流互转,使用 System.IO 命名空间中的扩展方法:

     // 将 Windows 运行时的 随机访问流 转换为 .NET 中的流
     public Stream RandomStream_to_Stream(InMemoryRandomAccessStream randomStream)
     {
         Stream stream = randomStream.AsStream();
    
         return stream;
     }
    
     // 将 .NET 中的流,转换为 Windows 运行时 RandomAccessStream
     public InMemoryRandomAccessStream Stream_to_RandomStream(Stream stream)
     {
         IRandomAccessStream randomStream = stream.AsRandomAccessStream();
    
         return randomStream as InMemoryRandomAccessStream;
     }

     8、使用 Windows.Security.Cryptography.CryptographicBuffer 类进行 byte[] 与 IBuffer 的互转:

    9、在 WebView中,通过 byte[] 的方式显示 Gif图片:

     var imgLoginCode = new WebView();
     this.imgLoginCode.ScriptNotify += ImgLoginCode_ScriptNotify;
    
    IBuffer buffer = await codeBll.Open(null, null, current_qc005); // 获取 Gif图片
    
     if (buffer != null)
     {
                   // 在 WebView 中加载 gif 图片参考:https://code.msdn.microsoft.com/windowsapps/Loading-Image-into-WebView-a3f68921
                    var stream = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.AsStream(buffer);
                    using (var dataReader = new DataReader(stream.AsInputStream()))
                    {
                        var num = await dataReader.LoadAsync((uint)stream.Length);
                        var bytesStr = new byte[num];
    
                        //stream.ReadAsync(bytesStr, 0, num);
    
                        dataReader.ReadBytes(bytesStr);
                        string a = "data:image/jpeg;base64," + Convert.ToBase64String(bytesStr);
    
                        //<meta name='viewport' content='width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no'/>/>
                        string ImgCode = "<html><header><meta name='viewport' content='width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no'/><style type='text/css'>body {overflow:hidden;margin:0px;padding:0px;border:0px}</style>" +
                            "<script>function getVcode(){ window.external.notify('refresh_vcode')}</script>" +
                            "</heder><body onclick='getVcode()'><img title='验证码看不清' alt='重试' src='" + a + "' style='100%;height:100%'/></body></html>";
    
                        //imgLoginCode.Visibility = Visibility.Visible;
                        imgLoginCode.NavigateToString(ImgCode);
                    }
    }
    
        private void ImgLoginCode_ScriptNotify(object sender, NotifyEventArgs e)
            {
                // 当单击 WebView 中的 gif 时,重新请求验证码
                if (e?.Value != null && e.Value.ToString() == "refresh_vcode")
                    Load_VCode();
            }

    根据 Gif 的 uri 请求图片数据:

     class LoginCodeBLL
        {
            public async Task<IBuffer> Open(string width, string height, string qc005)
            {
                try
                {
                    using (HttpClient client = new HttpClient())
                    {
                        string uri = ...; //gif uri
    
                        IBuffer buffer = await client.GetBufferAsync(new Uri(uri));
    
                        return buffer;
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
    
                    return null;
                }
            }
            /*
            public async Task<string> DownloadImg(string width, string height, string qc005)
            {
                string folderName = "albums_images";
    
                string fileName = "VCode.gif";
    
                StorageFolder tileFolder = null;
                var rootFolder = ApplicationData.Current.TemporaryFolder;
    
                string uri = string.Format("http://passport.iqiyi.com/apis/register/vcode.action?static=1&agenttype={0}&QC005={1}", Utility.AgentType, qc005);
    
                try
                {
                    // Windows.Storage.ApplicationData.Current.LocalFolder 或者 TemporaryFolder 中
                    tileFolder = await rootFolder.GetFolderAsync(folderName);
                }
                catch (FileNotFoundException ex)
                {   // 文件夹不存在
                    Debug.WriteLine(ex.Message);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
    
                // 如果本地存储中没有该文件夹,则创建
                if (tileFolder == null)
                {
                    tileFolder = await rootFolder.CreateFolderAsync(folderName);
                }
    
                StorageFile imgFile = null;
    
                // 如果本地存储中没有该图片,则从网络下载
                try
                {
                    using (var client = new System.Net.Http.HttpClient())
                    {
                        byte[] buffer = await client.GetByteArrayAsync(uri);
    
                        imgFile = await tileFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
    
                        await FileIO.WriteBytesAsync(imgFile, buffer);
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
    
                return imgFile.Path;
            }*/
        }

    推荐帖子

  • 相关阅读:
    计算机网络——TCP如何做到可靠数据传输
    计算机网络——TCP的流水线传输(超详细)
    计算机网络——TCP的拥塞控制(超详细)
    计算机网络——TCP的三次握手与四次挥手(超详细)
    计算机网络——多路复用与多路分解
    转:资源 | 我爱自然语言处理
    bootsect及setup
    python默认编码设置
    实例分析C程序运行时的内存结构
    matlab常用目录操作
  • 原文地址:https://www.cnblogs.com/hebeiDGL/p/3428743.html
Copyright © 2020-2023  润新知