Windows Phone實用開發技巧(36):儲存WebBrowser中的圖片

來源:互聯網
上載者:User

有時候,我們需要在Windows Phone應用中使用WebBrowser控制項來顯示網頁內容,在之前的博文《Windows Phone 中WebBrowser開啟新視窗》中講了如何在WebBrowser中開啟新的視窗,今天來講一下如何讓使用者儲存網頁中的圖片。

其實思路跟上一篇文章一樣,不同的是我們將圖片從WebBrowser中拿出來了,具體的思路如下:

1. 將WebBrowser的Source設定為一個帶有圖片的url,並且將IsScriptEnabled設為True註冊其ScriptNotify事件

2. 在WebBrowser的LoadCompleted中注入綁定的JavaScript代碼,目的是將使我們點擊IMG標籤時能夠執行我們預定義的函數

3. 在ScriptNotify中截獲WebBrowser中的事件,如果是圖片點擊,則Popup中顯示該圖片

4. 使用XNA庫方法儲存圖片

 

ok,首先我們在頁面中放置一個WebBrowser

<phone:WebBrowser x:Name="webBrowser" LoadCompleted="webBrowser_LoadCompleted" IsScriptEnabled="True" ScriptNotify="webBrowser_ScriptNotify" />

然後在頁面建構函式中設定它的Source為帶有圖片的地址

private Popup popUp;// Constructorpublic MainPage(){    InitializeComponent();    webBrowser.Source = new Uri("http://images.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimage&istype=2&fm=index&pv=&z=0&word=404&s=0", UriKind.Absolute);    popUp = new Popup();}

Popup為後續儲存圖片時使用的彈出面板

在WebBrowser的LoadCompleted中注入綁定的JavaScript代碼

private void webBrowser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e){    try    {        webBrowser.InvokeScript("eval",            @"    window.onLinkPressed = function() {        var elem = event.srcElement;        if ( elem != null ) {            window.external.notify(elem.getAttribute('link'));        }        return false;    }    window.BindLinks = function() {        var elems = document.getElementsByTagName('img');        for (var i = 0; i < elems.length; i++) {            var elem = elems[i];            var link = elem.getAttribute('src');            elem.setAttribute('link', link);            if(link.indexOf('.gif')>0){                elem.parentNode.removeChild(elem);            }else{                elem.attachEvent('onmousedown', onLinkPressed);            }        }    }");        webBrowser.InvokeScript("BindLinks");    }    catch (Exception)    {        throw;    }    MessageBox.Show("頁面載入完成");}

註冊了兩個函數,一個是用於綁定連結,一個用於處理使用者點選連結。並且移除尾碼為gif的圖片。下面看看我們如何在ScriptNotify中處理圖片點擊事件:

private void webBrowser_ScriptNotify(object sender, NotifyEventArgs e){    string input = e.Value.ToString();    if (Regex.IsMatch(input, @"http://[^\[^>]*?(gif|jpg|png|jpeg|bmp|bmp)"))    {        ImageSource source = new BitmapImage(new Uri(input, UriKind.Absolute));        popUp.Height = 800;        popUp.Width = 480;        Grid grd = new Grid        {            Height = 800,            Width = 480,            Background = App.Current.Resources["PhoneBackgroundBrush"] as SolidColorBrush,            Opacity = 0.9,        };        Image img = new Image { Source = source };        grd.Children.Add(img);        Button btnSave = new Button        {            Content = "儲存圖片",            Height = 80,            Width = 200,            Margin = new Thickness(48),            VerticalAlignment = System.Windows.VerticalAlignment.Bottom        };        btnSave.Click += (e1, e2) =>        {            SaveImage(DateTime.Now.ToFileTime().ToString(), img.Source as BitmapImage);        };        grd.Children.Add(btnSave);        popUp.Child = grd;        popUp.IsOpen = true;    }}

使用Regex判斷當前跳轉的url是不是一個合法的圖片,如果是截獲下來並建立一個彈出層,顯示圖片,

儲存方法很簡單:

private void SaveImage(string fileName, BitmapImage source){    MemoryStream ms = new MemoryStream();    try    {        MediaLibrary library = new MediaLibrary();        WriteableBitmap bitmap = new WriteableBitmap(source);        Extensions.SaveJpeg(bitmap, ms, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100);        ms.Seek(0, SeekOrigin.Begin);        ms.Seek(0, SeekOrigin.Current);        library.SavePicture(fileName, ms);        ms.Close();        MessageBox.Show("儲存圖片成功");    }    catch    {        MessageBox.Show("儲存圖片失敗");    }    finally    {        ms.Close();    }}

 

原始碼新浪微盤下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.