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

简介: 原文:Win8 Metro(C#) 数字图像处理--1 图像打开,保存 作为本专栏的第一篇,必不可少的需要介绍一下图像的打开与保存,一便大家后面DEMO的制作。
原文: Win8 Metro(C#) 数字图像处理--1 图像打开,保存

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

  Win8Metro编程中,图像相关的操作基本都是以流的形式进行的,图像对象类型在Metro主要表现为两种形式:BitmapImageWriteableBitmap,图像的显示控件为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;

            }

        }

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

目录
相关文章
|
5月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
80 0
|
5月前
|
存储 数据处理 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C#)
63 0
|
18天前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
5月前
|
存储 数据处理 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换由Mono10转换为Mono8(C#)
70 0
|
4月前
|
并行计算 算法 C#
C# Mandelbrot和Julia分形图像生成程序更新到2010-9-14版 支持多线程计算 多核处理器
此文档是一个关于分形图像生成器的介绍,作者分享了个人开发的M-J算法集成及色彩创新,包括源代码和历史版本。作者欢迎有兴趣的读者留言交流,并提供了邮箱(delacroix_xu@sina.com)以分享资源。文中还展示了程序的发展历程,如增加了真彩色效果、圈选放大、历史记录等功能,并分享了几幅精美的分形图像。此外,还提到了程序的新特性,如导入ini文件批量输出图像和更新一批图片的功能。文档末尾附有多张程序生成的高分辨率分形图像示例。
|
4月前
|
存储 编解码 算法
C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
该文介绍了一个使用C#.NET Visual Studio 2008开发的程序,包含错误修复的Julia、Mandelbrot和优化过的Newton三种算法,生成色彩丰富的分形图像。作者改进了原始算法的效率,将内层循环的画点操作移至外部,提升性能。程序提供五种图形模式,支持放大缩小及颜色更新,并允许用户自定义画布大小以调整精度。还具备保存为高质JPG的功能。附有四张示例图片展示生成的分形效果。
|
5月前
|
存储 机器人 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换为Bitmap图像功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机图像转换为Bitmap图像功能(C#)
63 1
|
5月前
|
存储 新制造 C#
Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示(C#)
Baumer工业相机堡盟工业相机如何使用OpenCV实现相机图像的显示(C#)
58 1
|
5月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
155 0
|
5月前
|
传感器 存储 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C#)
53 0