zoukankan      html  css  js  c++  java
  • 启动器和选择器学习(2)选择器之照相机(CameraCaptureTask)与照片(PhotoChooserTask)

    CameraCaptureTask允许应用程序从照相机中检索照片,而PhotoChooserTask可用于选择存储在设备中的图片。

    1、CameraCaptureTask

    使用照相机拍摄只需创建一个CameraCaptureTask的新实例并调用Show方法。当照相机关闭时,如果已经拍摄了照片,则返回一个PhotoResult实例,其中包含该图片的引用(一个易于读取的流)以及一个在设备中的完整文件名字:

     1         private CameraCaptureTask nCamera = new CameraCaptureTask();
     2 
     3         public RingLoadingPage()
     4         {
     5             InitializeComponent();
     6             nCamera.Completed += new EventHandler<PhotoResult>(Camera_Completed);
     7         }
     8 
     9         private void LoadingStoryboard_Completed(object sender, EventArgs e)
    10         {
    11              nCamera.Show();
    12         }
    13 
    14         void Camera_Completed(object sender, PhotoResult e)
    15         {
    16             if (e.TaskResult == TaskResult.OK)
    17             {
    18                 if (e.ChosenPhoto != null && e.OriginalFileName.Length > 0)
    19                 {
    20                     BitmapImage bitMap = new BitmapImage();
    21                     bitMap.SetSource(e.ChosenPhoto);
    22 
    23                     ImageBrush imageBrush = new ImageBrush();
    24                     imageBrush.ImageSource = bitMap;
    25 
    26                     ContentPanel.Background = imageBrush;
    27                 }
    28             }
    29         }

    如上代码显示,在Camera_Completed方法中的PhotoResult有两个可以访问的属性。下面代码中的OriginalFileName属性用于创建一个BitmapImage实例,然后把该实例作为ImageBrush的ImageSource属性,最后设置给grid的Background作为Grid的背景。

     1         void Camera_Completed(object sender, PhotoResult e)
     2         {
     3             if (e.TaskResult == TaskResult.OK)
     4             {
     5                 if (e.OriginalFileName.Length > 0)
     6                 {
     7                     BitmapImage bitMap = new BitmapImage(new Uri(e.OriginalFileName));
     8 
     9                     ImageBrush imageBrush = new ImageBrush();
    10                     imageBrush.ImageSource = bitMap;
    11 
    12                     ContentPanel.Background = imageBrush;
    13                 }
    14             }
    15         }

    也可以通过读取ChosenPhoto属性得到所提供的流来访问指定文件的图片内容,在这里处理图像的内容时十分有用。下面的代码示例使用所选图像的内容创建一个WriteableBitmap实例,从而演示了该属性的使用方法:

     1         void Camera_Completed(object sender, PhotoResult e)
     2         {
     3             //Grid_Background(sender, e);
     4 
     5             if (e.TaskResult == TaskResult.OK)
     6             {
     7                 if (e.ChosenPhoto != null)
     8                 {
     9                     BitmapImage bitMapS = new BitmapImage();
    10                     bitMapS.SetSource(e.ChosenPhoto);
    11                     this.ImageSource.Source = bitMapS;
    12 
    13                     BitmapImage bitMapD = new BitmapImage();
    14                     bitMapD.SetSource(e.ChosenPhoto);
    15                     WriteableBitmap writeBitmap = new WriteableBitmap(bitMapD);
    16                     GenerateMirrorImage(writeBitmap);
    17                 }
    18             }
    19         }
    20 
    21         private void GenerateMirrorImage(WriteableBitmap nWriteableBitmap)
    22         {
    23             nWriteableBitmap.Invalidate();
    24 
    25             int pixelPosition = 0;//起始位置
    26             int reversePosition = nWriteableBitmap.PixelWidth * nWriteableBitmap.PixelHeight;//结束位置
    27             int pixlValue;
    28             //取高度的中心线为准,上下对换。
    29             for (int i = 0; i < nWriteableBitmap.PixelHeight / 2; i++)
    30             {   //取最后一行的第一个元素的下标
    31                 reversePosition -= nWriteableBitmap.PixelWidth;
    32                 for (int j = 0; j < nWriteableBitmap.PixelWidth; j++)
    33                 {
    34                     pixlValue = nWriteableBitmap.Pixels[reversePosition];
    35                     nWriteableBitmap.Pixels[reversePosition] = nWriteableBitmap.Pixels[pixelPosition];
    36                     nWriteableBitmap.Pixels[pixelPosition] = pixlValue;
    37 
    38                     pixelPosition++;
    39                     reversePosition++;
    40                 }
    41                 //取倒数第二行的第一个元素的下标
    42                 reversePosition -= nWriteableBitmap.PixelWidth;
    43             }
    44             this.ImageDes.Source = nWriteableBitmap;
    45         }

    标准的BitmapImage实例是只读的。一旦被加载后是无法更改图片的内容。而WriteableBitmap允许获取并替换单个像素的颜色。上面的代码实现了图像的水平翻转。

    其实还可以对WriteableBitmap执行更多的操作,其中涉及最多的就是围绕像素的操作。WriteableBitmapEx是一个开源的库,提供了用于绘制图形、直线、曲线以及更多内容的扩展。可在CodePlex(http://writeablebitmapex.codeplex.com/)中找到它。

    2、PhotoChooserTask

    与CameraCaptureTask类似,PhotoChooserTask也会在Completed事件中返回一个包含图像引用的PhotoResult对象。PhotoChooserTask会显示一个Picture Picker(图片选取器)让用户在图片库中进行选择。

     1         private PhotoChooserTask nPhoto = new PhotoChooserTask();
     2 
     3         public RingLoadingPage()
     4         {
     5             InitializeComponent();
     6             //nCamera.Completed += new EventHandler<PhotoResult>(Camera_Completed);
     7             nPhoto.Completed += new EventHandler<PhotoResult>(nPhoto_Completed);
     8         }
     9 
    10         void nPhoto_Completed(object sender, PhotoResult e)
    11         {
    12             if (e.TaskResult == TaskResult.OK)
    13             {
    14                 if (e.ChosenPhoto != null)
    15                 {
    16                     BitmapImage bitMapS = new BitmapImage();
    17                     bitMapS.SetSource(e.ChosenPhoto);
    18                     this.ImageChooser.Source = bitMapS;
    19                 }
    20             }
    21         }
    22 
    23         private void Chooser_Click(object sender, EventArgs e)
    24         {
    25             this.nPhoto.PixelHeight = 100;
    26             this.nPhoto.PixelWidth = 100;
    27             this.nPhoto.ShowCamera = true;
    28             this.nPhoto.Show();
    29         }

    上面的代码不仅显示了Picture Picker(图片选取器),同时对返回的图像进行100*100的尺寸剪裁,此外还想用户提供照相机拍摄照片的选择。最后在一个150*150的Image中按原图大小展示。

    本文案例代码:https://files.cnblogs.com/qq278360339/PhoneApp.zip

  • 相关阅读:
    记忆点
    数组的操作
    console.log()中的运算与打印事件
    ie9上传后下载json
    mysql使用on duplicate key update批量更新数据
    vue 弹出菜单
    mysql备份脚本
    uniapp+nodejs微信支付小程序版
    mycat初体验
    vscode格式化html标签属性不换行(vetur插件)
  • 原文地址:https://www.cnblogs.com/qq278360339/p/2531037.html
Copyright © 2011-2022 走看看