Win8 图片uri保存到本地图片库 -- 及各种流之间的转换

来源:互联网 发布:计算机编程是什么专业 编辑:程序博客网 时间:2024/05/29 19:10

已知网络上图片的uri地址,如何将网络图片保存到本地呢?代码如下:

保存图片到本地
复制代码
private async Task SaveImageFromUrl(string uri, string filename)        {            var rass = RandomAccessStreamReference.CreateFromUri(new Uri(uri));            IRandomAccessStream inputStream = await rass.OpenReadAsync();            Stream input = WindowsRuntimeStreamExtensions.AsStreamForRead(inputStream.GetInputStreamAt(0));            try            {                //获取图片扩展名的Guid                StorageFolder folder = KnownFolders.PicturesLibrary;                StorageFile outputFile = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);                using (IRandomAccessStream outputStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))                {                    Stream output = WindowsRuntimeStreamExtensions.AsStreamForWrite(outputStream.GetOutputStreamAt(0));                    await input.CopyToAsync(output);                    output.Dispose();                    input.Dispose();                }            }            catch (Exception)            {            }        }
复制代码

根据图片uri保存到本地的函数,即以上为图片uri和图片名称的转换,另以下三种转换:

1、FileName转换为Stream,图片可为本地图片,也可为应用程序中图片

图片转换为流
复制代码
private async Task<Stream> ImageNameToStream(string filename)        {            try            {                ////本地图片库                //StorageFolder folder = KnownFolders.PicturesLibrary;//本地图片库                //StorageFile storagefile = await folder.GetFileAsync(filename);                //应用程序Images文件夹图片                Uri _baseUri = new Uri("ms-appx:///");                Uri uri = new Uri(_baseUri, "../Images/" + filename);                StorageFile storagefile = await StorageFile.GetFileFromApplicationUriAsync(uri);                IRandomAccessStream irandom = await storagefile.OpenAsync(FileAccessMode.Read);                Stream outPutstream = irandom.GetInputStreamAt(0).AsStreamForRead();                return outPutstream;            }            catch (Exception ex)            {                return null;            }        }
复制代码

2、Stream转换成文件,图片保存到本地

流转换成本地图片
复制代码
private async Task StreamToFileName(Stream inputstream, string filename)        {            try            {                StorageFolder folder = KnownFolders.PicturesLibrary;                StorageFile outputFile = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);                using (IRandomAccessStream output = await outputFile.OpenAsync(FileAccessMode.ReadWrite))                {                    Stream outputstream = WindowsRuntimeStreamExtensions.AsStreamForWrite(output.GetOutputStreamAt(0));                    await inputstream.CopyToAsync(outputstream);                    outputstream.Dispose();                    inputstream.Dispose();                }            }            catch (Exception ex)            {            }        }
复制代码

3、图片Uri转换成流

网络图片Uri转换成流
复制代码
private async Task<Stream> UriToStream(string uri)        {            var rass = RandomAccessStreamReference.CreateFromUri(new Uri(uri));            IRandomAccessStream inputStream = await rass.OpenReadAsync();            Stream input = WindowsRuntimeStreamExtensions.AsStreamForRead(inputStream.GetInputStreamAt(0));            return input;        }
复制代码

若有其他流与Metro流之间的转换,参考http://www.cnblogs.com/jing870812/archive/2012/04/12/2444870.html

 

// 内容如下:

 

今天在Stream与IrandomAccessStream之间转换时,感觉很纠结,所以干脆先把想到的一些场景都罗列了一下,希望下次再用的时候就不用这么毛手毛脚的了。。。 

Stream 转IRandomAccessStream

?
方法一:
byte[] bytes = StreamToBytes(stream);
InMemoryRandomAccessStream memoryStream =new InMemoryRandomAccessStream();
DataWriter datawriter =new DataWriter(memoryStream.GetOutputStreamAt(0));
datawriter.WriteBytes(bytes);
await datawriter.StoreAsync();
?
方法二:
var randomAccessStream =new InMemoryRandomAccessStream();
var outputStream = randomAccessStream.GetOutputStreamAt(0);
await RandomAccessStream.CopyAsync(stream.AsInputStream(), outputStream);
?
  

IRandomAccessStream 转 Stream

?
Stream stream=WindowsRuntimeStreamExtensions.AsStreamForRead(randomStream.GetInputStreamAt(0));

 

Ibuffer转Stream

?
Stream stream = WindowsRuntimeBufferExtensions.AsStream(buffer);
?
  

Stream转Ibuffer

?
MemoryStream memoryStream =new MemoryStream();           
 if(stream != null)
 {
      byte[] bytes = ReadFully(stream);
      if(bytes != null)
      {
           var binaryWriter =new BinaryWriter(memoryStream);
           binaryWriter.Write(bytes);
       }
  }
 IBuffer buffer=WindowsRuntimeBufferExtensions.GetWindowsRuntimeBuffer(memoryStream,0,(int)memoryStream.Length);

 

Ibuffer转byte[]

?
byte[] bytes=WindowsRuntimeBufferExtensions.ToArray(buffer,0,(int)buffer.Length);

 

Byte[]转Ibuffer

?
WindowsRuntimeBufferExtensions.AsBuffer(bytes,0,bytes.Length);

 

Ibuffer转IrandomAccessStream

?
InMemoryRandomAccessStream inStream =new InMemoryRandomAccessStream();
DataWriter datawriter =new DataWriter(inStream.GetOutputStreamAt(0));
datawriter.WriteBuffer(buffer,0,buffer.Length);
await datawriter.StoreAsync();

 

IrandomAccessStream转Ibuffer

?
Stream stream=WindowsRuntimeStreamExtensions.AsStreamForRead(randomStream.GetInputStreamAt(0));
MemoryStream memoryStream =new MemoryStream();           
if (stream != null)
{
    byte[] bytes = ReadFully(stream);
    if(bytes != null)
    {
        var binaryWriter =new BinaryWriter(memoryStream);
        binaryWriter.Write(bytes);
    }
}
IBuffer buffer=WindowsRuntimeBufferExtensions.GetWindowsRuntimeBuffer(memoryStream,0,(int)memoryStream.Length);

 

IRandomAccessStream转FileInputStream

?
FileInputStream inputStream=randomStream.GetInputStreamAt(0)as FileInputStream;

 

IRandomAccessStream转FileOutputStream

?
FileOutputStream outStream= randomStream.GetOutputStreamAt(0)as FileOutputStream;

 

Stream转byte[]

public static byte[] ConvertStreamTobyte(Stream input) 

byte[] buffer = new byte[16 * 1024]; 

using (MemoryStream ms = new MemoryStream()) 

int read; 

while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 

ms.Write(buffer, 0, read); 

return ms.ToArray(); 

  

Byte转Stream

?
public Stream BytesToStream(byte[] bytes)
        {
            Stream stream =new MemoryStream(bytes);
            returnstream;
        }

 

Stream转MemoryStream

?
public static MemoryStream ConvertStreamToMemoryStream(Stream stream)
        {
            MemoryStream memoryStream =new MemoryStream();
            if(stream != null)
            {
                byte[] buffer = ReadFully(stream);
                if(buffer != null)
                {
                    var binaryWriter =new BinaryWriter(memoryStream);
                    binaryWriter.Write(buffer);
                }
            }
            returnmemoryStream;
        }
?
应该还有些其它的场景,目前就想到这些,绕晕了都,恩恩…