原文:Win8 Metro(C#) 数字图像处理--1 图像打开,保存

作为本专栏的第一篇,必不可少的需要介绍一下图像的打开与保存,一便大家后面DEMO的制作。

  Win8Metro编程中,图像相关的操作基本都是以流的形式进行的,图像对象类型在Metro主要表现为两种形式:BitmapImage和WriteableBitmap,图像的显示控件为Image。

  我们可以用如下方式打开和显示一幅图像对象。

BitmapImage srcImage=newBitmapImage (new Uri(“UriPath”), UriKind.Relative)

  其中UriPath为图像的Uri地址,UriKind表示路径的选择,Urikind.Relative表示是相对路径,也可以选择绝对路径Urikind.Absolute,或者Urikind.
RelativeOrAbsolute。

Image imageBox=newImage ();

imageBox.Source=srcImage;//将图像显示在imageBox控件中

  还有一种方法则是使用WriteableBitmap对象,这也是我这里要详细介绍的方法。

1.图像打开

        privatestaticBitmapImage srcImage =newBitmapImage();

        privatestaticWriteableBitmap
wbsrcImage;

       //open image fuctiondefinition

        privateasyncvoid
OpenImage()

        {

            FileOpenPicker imagePicker =newFileOpenPicker

            {

               
ViewMode = PickerViewMode.Thumbnail,

               SuggestedStartLocation =PickerLocationId.PicturesLibrary,

               
FileTypeFilter = { ".jpg",".jpeg",".png",".bmp"
}

            };

            Guid decoderId;

            StorageFile imageFile =await
imagePicker.PickSingleFileAsync();

            if (imageFile !=null)

            {

               
srcImage = newBitmapImage();

               
using (IRandomAccessStream stream =await
imageFile.OpenAsync(FileAccessMode.Read))

               
{

                   srcImage.SetSource(stream);

                   
switch (imageFile.FileType.ToLower())

                   
{

                       case".jpg":

                       case".jpeg":

                           decoderId = Windows.Graphics.Imaging.BitmapDecoder.JpegDecoderId;

                           break;

                       case".bmp":

                           decoderId = Windows.Graphics.Imaging.BitmapDecoder.BmpDecoderId;

                           break;

                       case".png":

                           decoderId = Windows.Graphics.Imaging.BitmapDecoder.PngDecoderId;

                           break;

                       default:

                  
         return;

                   
}

                   Windows.Graphics.Imaging.BitmapDecoder decoder =await
Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(decoderId, stream);

                   
int width = (int)decoder.PixelWidth;

             
      int height = (int)decoder.PixelHeight;

                   Windows.Graphics.Imaging.PixelDataProvider dataprovider =await
decoder.GetPixelDataAsync();

                   
byte[] pixels =dataprovider.DetachPixelData();

                   
wbsrcImage = newWriteableBitmap(width, height);

                   
Stream pixelStream =wbsrcImage.PixelBuffer.AsStream();

                   
//rgba in original  

                   
//to display ,convert tobgra  

                   
for (int i = 0; i < pixels.Length; i += 4)

                   
{

                       byte temp = pixels[i];

                       pixels[i] =pixels[i + 2];

                       pixels[i +2] = temp;

                   
}

                   pixelStream.Write(pixels, 0, pixels.Length);

                   pixelStream.Dispose();

                   stream.Dispose();

               
}

               
ImageOne.Source =wbsrcImage;

               
ImageOne.Width =wbsrcImage.PixelWidth;

               
ImageOne.Height =wbsrcImage.PixelHeight;

            }

        }

2.图像保存

//save image fuction definition

        privateasyncvoid
SaveImage(WriteableBitmap src)

        {

            FileSavePicker save =newFileSavePicker();

           save.SuggestedStartLocation =PickerLocationId.PicturesLibrary;

           save.DefaultFileExtension =".jpg";

            save.SuggestedFileName ="newimage";

           save.FileTypeChoices.Add(".bmp",newList<string>()
{ ".bmp" });

           save.FileTypeChoices.Add(".png",newList<string>()
{ ".png" });

           save.FileTypeChoices.Add(".jpg",newList<string>()
{ ".jpg",".jpeg" });

            StorageFile savedItem =await
save.PickSaveFileAsync();

            try

            {

               
Guid encoderId;

               
switch (savedItem.FileType.ToLower())

               
{

                   
case".jpg":

                       encoderId =BitmapEncoder.JpegEncoderId;

                       break;

                   
case".bmp":

                       encoderId =BitmapEncoder.BmpEncoderId;

                       break;

                   
case".png":

                   
default:

                       encoderId =BitmapEncoder.PngEncoderId;

                       break;

               
}

               
IRandomAccessStream fileStream =await savedItem.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

               
BitmapEncoder encoder =awaitBitmapEncoder.CreateAsync(encoderId,
fileStream);

               
Stream pixelStream =src.PixelBuffer.AsStream();

                byte[] pixels =newbyte[pixelStream.Length];

               pixelStream.Read(pixels, 0, pixels.Length);

              
//pixal format shouldconvert to rgba8

               
for (int i = 0; i < pixels.Length; i += 4)

               
{

                    byte temp = pixels[i];

                   
pixels[i] =pixels[i + 2];

                   
pixels[i + 2] =temp;

               
}

               encoder.SetPixelData(

               
BitmapPixelFormat.Rgba8,

               
BitmapAlphaMode.Straight,

               
(uint)src.PixelWidth,

               
(uint)src.PixelHeight,

               
96, // Horizontal DPI

               
96, // Vertical DPI

               
pixels

               
);

               
await encoder.FlushAsync();

            }

            catch (Exception
e)

            {

               
throw e;

            }

        }

最后,分享一个专业的图像处理网站(微像素),里面有很多源代码下载:

Win8 Metro(C#) 数字图像处理--1 图像打开,保存的更多相关文章

  1. Win8 Metro(C#)数字图像处理--4图像颜色空间描述

    原文:Win8 Metro(C#)数字图像处理--4图像颜色空间描述  图像颜色空间是图像颜色集合的数学表示,本小节将针对几种常见颜色空间做个简单介绍. /// <summary> / ...

  2. Win8 Metro(C#)数字图像处理--3.2图像方差计算

    原文:Win8 Metro(C#)数字图像处理--3.2图像方差计算 /// <summary> /// /// </summary>Variance computing. / ...

  3. Win8 Metro(C#)数字图像处理--3.3图像直方图计算

    原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...

  4. Win8 Metro(C#)数字图像处理--3.4图像信息熵计算

    原文:Win8 Metro(C#)数字图像处理--3.4图像信息熵计算 [函数代码] /// <summary> /// Entropy of one image. /// </su ...

  5. Win8 Metro(C#)数字图像处理--3.5图像形心计算

    原文:Win8 Metro(C#)数字图像处理--3.5图像形心计算 /// <summary> /// Get the center of the object in an image. ...

  6. Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效

    原文:Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效 /// <summary> /// Image merge process. /// </summar ...

  7. Win8 Metro(C#)数字图像处理--3.1图像均值计算

    原文:Win8 Metro(C#)数字图像处理--3.1图像均值计算 /// <summary> /// Mean value computing. /// </summary> ...

  8. Win8 Metro(C#)数字图像处理--2.74图像凸包计算

    原文:Win8 Metro(C#)数字图像处理--2.74图像凸包计算 /// <summary> /// Convex Hull compute. /// </summary> ...

  9. Win8 Metro(C#)数字图像处理--2.68图像最小值滤波器

    原文:Win8 Metro(C#)数字图像处理--2.68图像最小值滤波器 /// <summary> /// Min value filter. /// </summary> ...

随机推荐

  1. PhpStorm常用快捷键(不多够用)

    PhpStorm常用快捷键(不多够用) 一.总结 一句话总结: 1.前进 解答:Ctrl+shift+ z 2.跳转到指定行数 解答:Ctrl+G 3.块注释 解答:ctrl + shift + / ...

  2. 【codeforces 750E】New Year and Old Subsequence

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. js进阶 9-5 js如何确认form的提交和重置按钮

    js进阶 9-5 js如何确认form的提交和重置按钮 一.总结 一句话总结: 1.这个并不好做:onsubmit 里面的代码必须返回false才能取消onsubmit方法的执行,所以,有return ...

  4. QQ欢乐豆斗地主心得体会(四):合谋赢豆

    刚刚又在玩QQ欢乐斗地主,只可惜,这次不够欢乐. 本金,300万豆,运气比较好,赢到将近400万.突然,形势急转直下,一直输,一直到180多万豆.本来这一局,有硬炸在手,但是没有癞子,基本被吊打的节奏 ...

  5. 【烽火传递】dp + 单调队列优化

    题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火台发出信 ...

  6. CentOS 配置epel源

    先查询下有没有epel rpm -qa|grep epel 没有的话到官网https://fedoraproject.org/wiki/EPEL下载rpm包 然后 rpm -ivh 安装 安装完毕后到 ...

  7. matlab 图像的保存

    gcf:获取当前显示图像的句柄: 默认 plot 的 position 是 [232 246 560 420] 0. save >> A = randn(3, 4); >> B ...

  8. WPF 等距布局

    原文:WPF 等距布局 本文告诉大家如何使用 WPF 的自定义布局做等距布局. 实际做的效果很简单,因为在开发我容易就用到了等距的控件.等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于 ...

  9. 《Head First 设计模式》学习笔记——命令模式

    在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务" ...

  10. laravel routes除了默认路由,其他的都无效 解决方案

    按照教程.该php升级到5.5,所有是开放的扩展,默认路由进入,证明代码错误,平时不开rewrite铅 假设你其它路由,localhost/文件夹/public/index.php/home能够进去. ...