2012年9月7日星期五

Windows Phone实用开发技巧(38):图片拼接

Windows Phone实用开发技巧(38):图片拼接

图片拼接是拼图中一种,即将若干图片拼接成一张大图。本文将讲述如何在windows phone中实现图片的拼接。

首先,我们准备一些拼图的原始图片,这些图片的长度、宽度各不一样,并且也不是等比例。

private int width = 480;private int totalHeight = 0;string[] array = new string[] { "1.jpg", "2.jpg", "3.jpg", "4.jpg" };WriteableBitmap[] imagearray;int[] heightarray;

一些常量的定义,array数组存储的是待拼接的图片列表

imagearray存储的是图片对应的WriteableBitamp对象

heightarray存储的是图片按比例缩放后的高度(宽度都为480)

totalHeight表示图片拼接后的总高度

我们在页面中方式一个ScrollViewer,然后将图片都放置在一个Canvas中,设置图片的距离顶部距离,最后将Canvas方式到ScrollViewer中:

private void Join(){    //images container    Canvas canvas = new Canvas();    //init array    imagearray = new WriteableBitmap[array.Length];    heightarray = new int[array.Length];    for (int i = 0; i < array.Length; i++)    {        WriteableBitmap bitmap = FromContent(string.Format("Images/{0}", array[i]));        double wr = width / (double)bitmap.PixelWidth;        int height = (int)(bitmap.PixelHeight * wr);        Image img = new Image() { Source = bitmap, Stretch = Stretch.Fill, Width = width, Height = height };        Canvas.SetLeft(img, 0);        Canvas.SetTop(img, totalHeight);        canvas.Children.Add(img);        totalHeight += height;        imagearray[i] = bitmap;        heightarray[i] = height;    }    canvas.Height = totalHeight;    scrollviewer.Content = canvas;}

其中需要注意的就是将图片按比例缩放,为了防止保存图片时候重新计算一遍高度,我们将高度和图片保存到数据中。

下面来看一下保存的方法,我们需要得到一个ScrollViewer的WriteableBitmap,那么能不能使用直接对UI元素的截屏呢?答案是否定的,因为截屏我们只能得到屏幕大小的图片,不能得到整个长图。

那么我们应该怎么做呢,其实思路跟上面的展示方式一样,我们将图片拼接起来,具体的代码如下:

//遍历,将每张图copy至大图的相应位置WriteableBitmap output = new WriteableBitmap(width, totalHeight);int toTop = 0;for (int i = 0; i < imagearray.Length; i++){    var wb = imagearray[i].Resize(width, heightarray[i], WriteableBitmapExtensions.Interpolation.NearestNeighbor);    Rect dest = new Rect(0, toTop, width, heightarray[i]);    Rect source = new Rect(0, 0, width, heightarray[i]);    output.Blit(dest, wb, source);    toTop += heightarray[i];}SaveImage(output);

遍历图片,将图片copy至一张大图的某些部分

保存方法是将图片保存到相册中,当然我们也可以保存到独立存储空间中:

private void SaveImage(WriteableBitmap bit){    string msg = "";    try    {        byte[] imageBuffer;        using (MemoryStream memoryStream = new MemoryStream())        {            bit.SaveJpeg(memoryStream, bit.PixelWidth, bit.PixelHeight, 0, 100);            imageBuffer = memoryStream.ToArray();        }        using (MediaLibrary library = new MediaLibrary())        {            library.SavePicture(string.Format("{0}.jpg", DateTime.Now.ToFileTime().ToString()), imageBuffer);        }        msg = "保存成功";    }    catch (Exception ex)    {        msg = "保存失败";    }    finally    {        MessageBox.Show(msg);    }}

源代码你可以在这里找到.


TAG: