与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成

简介: 原文:与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成[索引页][源码下载] 与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序.
原文: 与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成

[索引页]
[源码下载]


与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成



作者:webabcd


介绍
与众不同 windows phone 7.5 (sdk 7.1) 之媒体

  • 通过 WriteableBitmap 编辑图片,以及保存图片到相册
  • 与图片的上下文菜单“应用程序...”关联
  • 与图片的上下文菜单“共享...”关联
  • 与 Windows Phone 的图片中心集成



示例
1、演示如何通过 WriteableBitmap 编辑图片,以及保存图片到相册
WriteableBitmapDemo.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.Media.WriteableBitmapDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <StackPanel Orientation="Vertical">
            
            <Image x:Name="img" />

            <Button x:Name="btnSaveToCameraRollAlbum" Content="保存到图片 hub 的“本机拍照”" Click="btnSaveToCameraRollAlbum_Click" />

            <Button x:Name="btnSaveToPictureAlbum" Content="保存到图片 hub 的“相册”" Click="btnSaveToPictureAlbum_Click" />
            
        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

WriteableBitmapDemo.xaml.cs

/*
 * 本例演示编解码 jpeg 格式图片,通过 WriteableBitmap 修改图片,以及如何保存图片到图片中心的“本机拍照”和“相册”
 * 
 * Picture - 媒体库中的图片对象
 * MediaLibrary - 媒体库,用于访问设备中的图片、音乐、播放列表等
 *     SavePicture(String, Byte[]), SavePicture(String, Stream) - 保存图片到图片中心的“相册”,第一个参数是保存到媒体库的图片名称,第二个参数是需要被保存的图片数据
 *     SavePictureToCameraRoll(String, Byte[]), SavePictureToCameraRoll(String, Stream) - 保存图片到图片中心的“本机拍照”,第一个参数是保存到媒体库的图片名称,第二个参数是需要被保存的图片数据
 * 注:关于 MediaLibrary 和 Picture 以及其他与媒体库(图片、音乐、播放列表等)相关的介绍详见 Microsoft.Xna.Framework.Media 命名空间下的类:http://msdn.microsoft.com/en-us/library/dd254868(v=xnagamestudio.40)
 * 
 * PictureDecoder.DecodeJpeg(Stream source) - 解码 jpeg 格式文件到 WriteableBitmap 对象(经测试 png 格式也可以)
 * 
 * WriteableBitmap - 位图 API,详见:http://www.cnblogs.com/webabcd/archive/2009/08/27/1554804.html 中的关于 WriteableBitmap 的介绍
 *     SaveJpeg() - 新增的扩展方法,用于将 WriteableBitmap 对象保存为 jpeg 格式文件
 *     LoadJpeg() - 新增的扩展方法,用于将 jpeg 格式图片加载到 WriteableBitmap 对象
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

using System.Windows.Resources;
using System.Windows.Media.Imaging;
using Microsoft.Phone;
using Microsoft.Xna.Framework.Media;
using System.IO.IsolatedStorage;
using System.IO;

namespace Demo.Media
{
    public partial class WriteableBitmapDemo : PhoneApplicationPage
    {
        private WriteableBitmap _wb;

        public WriteableBitmapDemo()
        {
            InitializeComponent();

            ShowImage();
        }

        private void ShowImage()
        {
            Uri imageUri = new Uri("Assets/TileBackgroundBlue.png", UriKind.Relative);
            StreamResourceInfo sri = Application.GetResourceStream(imageUri);
            
            // 将图片流解码为 WriteableBitmap 对象,经测试不只是 jpeg 格式可以,png 格式也可以
            _wb = PictureDecoder.DecodeJpeg(sri.Stream);

            // 将图片的第 10 行的像素点都改为红色
            for (int i = _wb.PixelWidth * 9; i < _wb.PixelWidth * 10; i++)
            {
                unchecked
                {
                    // 每个像素的颜色的描述规范为 ARGB
                    _wb.Pixels[i] = (int)0xFFFF0000;
                }
            }

            // 重新绘制整个 WriteableBitmap 对象
            _wb.Invalidate();

            // 显示修改后的图片
            img.Source = _wb;
        }

        // 将图片保存到图片 hub 的“本机拍照”
        private void btnSaveToCameraRollAlbum_Click(object sender, RoutedEventArgs e)
        {
            // 在独立存储中创建一个临时文件
            string fileName = "myImage.jpg";
            var myStore = IsolatedStorageFile.GetUserStoreForApplication();
            if (myStore.FileExists(fileName))
                myStore.DeleteFile(fileName);
            IsolatedStorageFileStream myFileStream = myStore.CreateFile(fileName);

            // 将图片保存到独立存储的临时文件
            _wb.SaveJpeg(myFileStream, _wb.PixelWidth, _wb.PixelHeight, 0, 85);
            myFileStream.Close();

            // 打开独立存储中的图片
            myFileStream = myStore.OpenFile(fileName, FileMode.Open, FileAccess.Read);

            // 将图片保存到“本机拍照”
            MediaLibrary library = new MediaLibrary();
            Picture pic = library.SavePictureToCameraRoll("SavedPicture.jpg", myFileStream);
        }

        // 将图片保存到图片 hub 的“相册”
        private void btnSaveToPictureAlbum_Click(object sender, RoutedEventArgs e)
        {
            // 在独立存储中创建一个临时文件
            string fileName = "myImage.jpg";
            var myStore = IsolatedStorageFile.GetUserStoreForApplication();
            if (myStore.FileExists(fileName))
                myStore.DeleteFile(fileName);
            IsolatedStorageFileStream myFileStream = myStore.CreateFile(fileName);

            // 将图片保存到独立存储的临时文件
            _wb.SaveJpeg(myFileStream, _wb.PixelWidth, _wb.PixelHeight, 0, 85);
            myFileStream.Close();

            // 打开独立存储中的图片
            myFileStream = myStore.OpenFile(fileName, FileMode.Open, FileAccess.Read);

            // 将图片保存到“相册”
            MediaLibrary library = new MediaLibrary();
            Picture pic = library.SavePicture("SavedPicture.jpg", myFileStream);
        }
    }
}


2、演示如何与图片的上下文菜单“应用程序...”关联
IntegrateWithThePictureViewer.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.Media.IntegrateWithThePictureViewer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <TextBlock TextWrapping="Wrap">
            <Run>在“图片中心”中查看某图片,然后点击 AppBar 的“应用程序...”按钮,则会发现本 app 也在选项列表中,也就是说可以使用本 app 打开指定的图片</Run>
            <LineBreak />
            <Run>具体实现方法请参见 manifest 和 MainPage.xaml.cs</Run>
        </TextBlock>
    </Grid>
 
</phone:PhoneApplicationPage>

WMAppManifest.xml

<Extensions>
    <!--
        与图片的上下文菜单“应用程序...”关联,即在“图片中心”中查看某图片,然后点击 AppBar 的“应用程序...”按钮,则会发现本 app 也在选项列表中,也就是说可以使用本 app 打开指定的图片
    -->
    <Extension ExtensionName="Photos_Extra_Viewer" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
</Extensions>

MainPage.xaml.cs

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // 当使用本 app 打开指定的图片时,会传递过来一个 token 参数
    // 开发时要注意,如果同时使用了 PhotoChooserTask ,要避免冲突
    if (NavigationContext.QueryString.ContainsKey("token"))
    {
        MediaLibrary library = new MediaLibrary();
        // 根据 token 获取到指定的图片
        Picture picture = library.GetPictureFromToken(NavigationContext.QueryString["token"]);

        // 将 Picture 对象转换成 BitmapImage 对象
        BitmapImage bitmap = new BitmapImage();
        bitmap.CreateOptions = BitmapCreateOptions.None;
        bitmap.SetSource(picture.GetImage());

        // 将 BitmapImage 对象转换成 WriteableBitmap 并显示
        WriteableBitmap picLibraryImage = new WriteableBitmap(bitmap);
        img.Source = picLibraryImage;
    }
}


3、演示如何与图片的上下文菜单“共享...”关联
IntegrateWithThePictureShare.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.Media.IntegrateWithThePictureShare"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <TextBlock TextWrapping="Wrap">
            <Run>在“图片中心”中查看某图片,然后点击 AppBar 的“共享...”按钮,则会发现本 app 也在选项列表中,也就是说可以使用本 app 共享指定的图片</Run>
            <LineBreak />
            <Run>具体实现方法请参见 manifest 和 MainPage.xaml.cs</Run>
        </TextBlock>
    </Grid>

</phone:PhoneApplicationPage>

WMAppManifest.xml

<Extensions>
    <!--
        与图片的上下文菜单“共享...”关联,即在“图片中心”中查看某图片,然后点击 AppBar 的“共享...”按钮,则会发现本 app 也在选项列表中,也就是说可以使用本 app 共享指定的图片
    -->
    <Extension ExtensionName="Photos_Extra_Share" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
</Extensions>

MainPage.xaml.cs

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // 当使用本 app 共享指定的图片时,会传递过来一个 FileId 参数
    if (NavigationContext.QueryString.ContainsKey("FileId"))
    {
        MediaLibrary library = new MediaLibrary();
        // 根据 FileId 获取到指定的图片
        Picture picture = library.GetPictureFromToken(NavigationContext.QueryString["FileId"]);

        // 将 Picture 对象转换成 BitmapImage 对象
        BitmapImage bitmap = new BitmapImage();
        bitmap.CreateOptions = BitmapCreateOptions.None;
        bitmap.SetSource(picture.GetImage());

        // 将 BitmapImage 对象转换成 WriteableBitmap 并显示
        WriteableBitmap picLibraryImage = new WriteableBitmap(bitmap);
        img.Source = picLibraryImage;
    }
}


4、演示如何与 Windows Phone 的图片中心集成
IntegrateWithThePictureHub.xaml

<phone:PhoneApplicationPage 
    x:Class="Demo.Media.IntegrateWithThePictureHub"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <TextBlock TextWrapping="Wrap">
            <Run>本 app 会出现在“图片中心”中的“应用程序”下</Run>
            <LineBreak />
            <Run>具体实现方法请参见 manifest</Run>
        </TextBlock>
    </Grid>

</phone:PhoneApplicationPage>

WMAppManifest.xml

<Extensions>
    <!--
        与 Windows Phone 的图片中心集成,即将本 app 添加到“图片中心”中的“应用程序”下
    -->
    <Extension ExtensionName="Photos_Extra_Hub" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" />
</Extensions>



OK
[源码下载]

目录
相关文章
|
1月前
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
91 13
|
1月前
|
人工智能 JSON 安全
DeepSeek Engineer:集成 DeepSeek API 的开源 AI 编程助手,支持文件读取、编辑并生成结构化响应
DeepSeek Engineer 是一款开源AI编程助手,通过命令行界面处理用户对话并生成结构化JSON,支持文件操作和代码生成。
764 6
DeepSeek Engineer:集成 DeepSeek API 的开源 AI 编程助手,支持文件读取、编辑并生成结构化响应
|
4月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
111 1
|
4月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
124 9
|
6月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
487 0
|
6月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
103 0
|
6月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
557 1
|
6月前
|
Linux 数据安全/隐私保护 Windows
Linux共享Windows目录
Linux共享Windows目录
|
6月前
|
编解码 开发工具 C#
Windows电脑如何启动RTSP服务实现本地摄像头数据共享
本文介绍如何利用大牛直播SDK中的轻量级RTSP服务,在Windows平台上轻松采集摄像头数据并生成本地RTSP流。通过SDK提供的SmartPublisherDemo工具,用户能简便地选择摄像头、配置分辨率与帧率,并启动RTSP服务。此外,还支持音频采集、多端口服务以及动态水印等功能。生成的RTSP URL可用于其他终端拉流播放,无需额外部署服务器。该服务适配多种应用场景,如安防监控、电子教室等,并兼容Windows 7及以上版本。对于希望集成此功能的开发者,SDK提供了C++及C#接口,并支持多种编译模式。
244 0
|
7月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
172 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt

热门文章

最新文章