原文: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. Google Guava官方教程

    原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,*武祖 * 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] . ...

  2. [Ramda] Convert a Promise.all Result to an Object with Ramda's zip and zipObj

    In this lesson, we'll use Promise.all to get an array that contains the resolved values from multipl ...

  3. Ambari——大数据平台的搭建利器(一)

    Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目,并且是**项目.目前最新的发布版本是 2.0.1,未来不久将发布 2.1 版本 ...

  4. System.nanoTime()和System.currentTimeMillis()性能问题

    ​ 之前给模块做性能优化的时候,需要将性能调到毫秒级,使用了System.nanoTime()和System.currentTimeMillis()对代码分片计时分析耗时操作,后发现在串行情况下性能达 ...

  5. KVC设置系统自带属性,不管是不是私有的属性

    KVC   可以设置系统自带属性,不管是不是私有的属性:    1,   2,  

  6. 数码测色计获取UIColor的RGB

    1.打开电脑数码测色计 2.鼠标移动到需要的颜色上 3.获取相应RGB值: [UIColor colorWithRed:204.f/255.f green:0.f/255.f blue:212.f/2 ...

  7. 使用ant编译项目技能

    ant编译时指定jdk的版本号 系统的jdk版本号是1.6,而项目使用的jdk版本号是1.5.所以在编译时须要指定jdk的版本号为1.5,能够使用以下的方法为javac 任务指定fork和execut ...

  8. 一起学Python:字典介绍

    字典介绍 想一想: 如果有列表 nameList = ['xiaoZhang', 'xiaoWang', 'xiaoLi']; 需要对"xiaoWang"这个名字写错了,通过代码修 ...

  9. 【b603】作业调度方案

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的 ...

  10. sql操作xml小总结

    一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...