zoukankan      html  css  js  c++  java
  • windows phone 图片缓存

    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System.Text;
    using System.IO.IsolatedStorage;
    using System.IO;
    
    namespace Cache
    {
        public class ImageCache : DependencyObject
        {
            public static readonly DependencyProperty SourceProperty = DependencyProperty.RegisterAttached(
              "Source",
              typeof(String),
              typeof(ImageCache),
              new PropertyMetadata(String.Empty, OnSourceChanged)
              );
            public static void SetSource(DependencyObject source, String value)
            {
                source.SetValue(SourceProperty, value);
            }
            public static String GetSource(DependencyObject source)
            {
                return (String)source.GetValue(SourceProperty);
            }
    
            private static void OnSourceChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
            {
                String value = args.NewValue as String;
                if (String.IsNullOrEmpty(value) == true)
                {
                    return;
                }
                Image image = target as Image;
                if (image != null)
                {
                    image.Source = new BitmapWithCacheSource(value);
                    return;
                }
                BitmapImage bitmapImage = target as BitmapImage;
                if (bitmapImage != null)
                {
                    new BitmapWithCacheSource(value, bitmapImage);
                    return;
                }
            }
        }
        public sealed class BitmapWithCacheSource : BitmapSource
        {
            private static readonly Encoding UTF8Encoding = Encoding.UTF8;
            public const string IMAGECACHEDIRECTORY = "ImagesCache/";
            private IsolatedStorageFile _iso = IsolatedStorageFile.GetUserStoreForApplication();
    
            private readonly String _imageWebUrl;
            private readonly String _imageCacheFileName;
    
            static BitmapWithCacheSource()
            {
                String imageCacheDriectory = IMAGECACHEDIRECTORY.TrimEnd('/');
                IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();
                if (iso.DirectoryExists(imageCacheDriectory) == false)
                {
                    iso.CreateDirectory(imageCacheDriectory);
                }
            }
    
            private String ToInternalKey(String value)
            {
                if (String.IsNullOrEmpty(value))
                {
                    return String.Empty;
                }
                String exName = value.Substring(value.LastIndexOf('.'));
                byte[] bytes = UTF8Encoding.GetBytes(value);
                return Convert.ToBase64String(bytes) + exName;
            }
    
            public BitmapWithCacheSource(String imageWebUrl) : this(imageWebUrl, null) { }
    
            public BitmapWithCacheSource(String imageWebUrl, BitmapImage bitmapImage)
            {
                this._imageWebUrl = imageWebUrl;
                this._imageCacheFileName = IMAGECACHEDIRECTORY + ToInternalKey(this._imageWebUrl);
                this.SetImageStreamSource(bitmapImage);
            }
    
            private void SetImageStreamSource(BitmapImage bitmapImage)
            {
                BitmapSource bitmapSource = this;
                if (bitmapImage != null)
                {
                    bitmapSource = bitmapImage;
                }
                if (_iso.FileExists(this._imageCacheFileName) == true)
                {
                    SetImageCacheStreamSource(bitmapSource);
                    return;
                }
                if (bitmapImage == null)
                {
                    SetImageWebStreamSource();
                    return;
                }
                bitmapImage.UriSource = new Uri(this._imageWebUrl, UriKind.Absolute);
                bitmapImage.ImageOpened += bitmapImage_ImageOpened;
            }
    
            private void bitmapImage_ImageOpened(object sender, RoutedEventArgs e)
            {
                BitmapImage bitmapImage = (BitmapImage)sender;
                bitmapImage.ImageOpened -= bitmapImage_ImageOpened;
                WriteableBitmap writeableBitmap = new WriteableBitmap(bitmapImage);
                using (var fileStream = this._iso.OpenFile(this._imageCacheFileName, FileMode.Create, FileAccess.Write))
                {
                    writeableBitmap.SaveJpeg(fileStream, bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);
                }
            }
    
            private void SetImageCacheStreamSource(BitmapSource source)
            {
                using (var imageStream = this._iso.OpenFile(this._imageCacheFileName, FileMode.Open, FileAccess.Read))
                {
                    source.SetSource(imageStream);
                }
            }
    
            private void SetImageWebStreamSource()
            {
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(this._imageWebUrl);
                httpWebRequest.AllowReadStreamBuffering = true;
                httpWebRequest.BeginGetResponse(ResponseCallBack, httpWebRequest);
            }
    
            private void ResponseCallBack(IAsyncResult asyncResult)
            {
                var httpWebRequest = asyncResult.AsyncState as HttpWebRequest;
                try
                {
                    var response = httpWebRequest.EndGetResponse(asyncResult);
                    var stream = response.GetResponseStream();
                    using (var fileStream = this._iso.OpenFile(this._imageCacheFileName, FileMode.Create, FileAccess.Write))
                    {
                        stream.CopyTo(fileStream);
                        base.Dispatcher.BeginInvoke(() =>
                        {
                            stream.Seek(0, SeekOrigin.Begin);
                            base.SetSource(stream);
                            stream.Dispose();
                        });
                    }
                }
                catch
                {
    
                }
            }
    
        }
    }
    

      调用方法

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
                this.imagesStackPanel.DataContext = "url";
            }

    private void Button_Click(object sender, RoutedEventArgs e) { BitmapImage bitmapImage = new BitmapImage(); bitmapImage.DownloadProgress += bitmapImage_DownloadProgress; //使用方式2 Cache.ImageCache.SetSource(bitmapImage,"url"); this.bitmapImageImage.Source = bitmapImage; } void bitmapImage_DownloadProgress(object sender, DownloadProgressEventArgs e) { this.imageDownloadProgress.Value = e.Progress; }

      前台:

    <StackPanel x:Name="imagesStackPanel"
                    xmlns:cache="clr-namespace:Cache"
                    Margin="20">
            <!--使用方式1-->
            <Image cache:ImageCache.Source="{Binding}"
                   MaxHeight="300" />
    
            <Button Content="使用BitmapImage"
                    Click="Button_Click" />
            <ProgressBar x:Name="imageDownloadProgress"
                         VerticalAlignment="Top" />
            <Image x:Name="bitmapImageImage"
                   MaxHeight="300" />
        </StackPanel>

     转自:

    http://www.cnblogs.com/l_nh/archive/2013/01/25/2876325.html

  • 相关阅读:
    Vertica系列:性能优化
    java的几个奇怪语法
    SpringBoot系列: Redis 共享Session
    SpringBoot系列: Redis基础
    java运维: 一次线上问题排查所引发的思考
    Vertica系列:从一些细节看Vertica为什么是一个优秀的数据仓库平台
    SpringBoot系列: logging
    SpringBoot系列: 集成MyBatis
    SpringBoot系列: 使用MyBatis maven插件自动生成java代码
    SpringBoot系列: SpringBoot 启动慢的问题
  • 原文地址:https://www.cnblogs.com/Karson001/p/3032905.html
Copyright © 2011-2022 走看看