Win8 Metro(C#) 数字图像处理--1 图像打开,保存
原文: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 图像打开,保存的更多相关文章
- Win8 Metro(C#)数字图像处理--4图像颜色空间描述
原文:Win8 Metro(C#)数字图像处理--4图像颜色空间描述 图像颜色空间是图像颜色集合的数学表示,本小节将针对几种常见颜色空间做个简单介绍. /// <summary> / ...
- Win8 Metro(C#)数字图像处理--3.2图像方差计算
原文:Win8 Metro(C#)数字图像处理--3.2图像方差计算 /// <summary> /// /// </summary>Variance computing. / ...
- Win8 Metro(C#)数字图像处理--3.3图像直方图计算
原文:Win8 Metro(C#)数字图像处理--3.3图像直方图计算 /// <summary> /// Get the array of histrgram. /// </sum ...
- Win8 Metro(C#)数字图像处理--3.4图像信息熵计算
原文:Win8 Metro(C#)数字图像处理--3.4图像信息熵计算 [函数代码] /// <summary> /// Entropy of one image. /// </su ...
- Win8 Metro(C#)数字图像处理--3.5图像形心计算
原文:Win8 Metro(C#)数字图像处理--3.5图像形心计算 /// <summary> /// Get the center of the object in an image. ...
- Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效
原文:Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效 /// <summary> /// Image merge process. /// </summar ...
- Win8 Metro(C#)数字图像处理--3.1图像均值计算
原文:Win8 Metro(C#)数字图像处理--3.1图像均值计算 /// <summary> /// Mean value computing. /// </summary> ...
- Win8 Metro(C#)数字图像处理--2.74图像凸包计算
原文:Win8 Metro(C#)数字图像处理--2.74图像凸包计算 /// <summary> /// Convex Hull compute. /// </summary> ...
- Win8 Metro(C#)数字图像处理--2.68图像最小值滤波器
原文:Win8 Metro(C#)数字图像处理--2.68图像最小值滤波器 /// <summary> /// Min value filter. /// </summary> ...
随机推荐
- mysql的四种启动方式
查看该版本的相应参数: mysqld --verbose --help 1.mysqld ./mysqld --defaults-file=/etc/my.cnf --user=mysql ...
- AE属性表操作
转自chanyinhelv原文AE属性表操作 实现的操作包括:1.打开属性表:2.编辑属性表:3.增加属性列:4.数据排序:5.字段计算…… 嗯,实现的功能目前就这些吧,后续还会继续跟进,还望大家多多 ...
- head first c 笔记<3> 之做一件事并把它做好
1.标准输入.输出与重定向 scanf()和printf()分别为标准输入输出.默认的会从键盘得到数据,在显示器输出数据,是fscanf()和fprintf()函数的特例. 我们也能够用重定向来改变默 ...
- BZOJ1415 聪聪与可可 - 期望dp
传送门 题目大意: 一张无向图上有一只猫和一只老鼠,猫先走,鼠后走.猫每次会向与其相邻的并且距离老鼠最近的点移动(若距离相等去编号较小的),如果移动一步后还没吃到老鼠,还可以再移动一步(算在一个时间内 ...
- 最新版Butterknife plugin支持butterknife7.0.1和兼容butterknife 6.1.0及下面
JakeWharton 的butterknife帮我们有效的攻克了findViewById及各种view的监听事件泛滥的问题,极大的简化了代码,假设使用了android Studio开发的配上avas ...
- 【codeforces 791C】Bear and Different Names
[题目链接]:http://codeforces.com/contest/791/problem/C [题意] 给你n-k+1个限制 要求 a[i]..a[i]+k-1里面有相同的元素,或全都不同; ...
- 分位数和分位线(Quantiles and Percentiles)
分位数有种积分(累积)的含义在. 分位数(即将数据由低至高排列,小于该数的数据占总体的比例达到时最终落到的数): 10%:3000元 20%:5200元 50%:20000元 80%:41500元 9 ...
- Hibernate综合问题
n + 1问题 query.iterate()信息返回迭代查询将开始发表声明:录ID语句 Hibernate: select student0_.id ascol_0_0_from t_student ...
- WPF 判断调用方法堆栈
原文:WPF 判断调用方法堆栈 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee.io 访问博客 ...
- 部署NetCore项目(本文介绍用用IIS部署)
首先要下载安装Core Runtim: 然后在IIS中的模块中就可以看到如下内容: 这时环境就搭好了: 下面按照正常的发布流程走就行了,关键看下面(一定要选择无托管代码)