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

一,图像打开,保存操作

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

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

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

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

Image imageBox=new Image ();

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

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

1.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;

}

}

1.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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值