WindowsPhone中在大图中截取小图(图片分割)

最近发现手机QQ上面的个人资料里面有一个照片展示功能,当好友查看自己名片时,会一次展示八张图片用于展示自己。

可是这八张图片都是小图展示,我想为什么不能把八张图片合成一张大图来显示呢,这样是不是更个性化一些呢?

于是,我想做一个小应用,用来选取图片并切割成八份,保存。由用户在QQ软件中将图片按序上传,不就能达到拼接的效果了吗!

 

下面讲讲图片分割的原理

方法是使用WriteableBitmap截图后, 再通过变换大图的RenderTransform

将小图的起始点移动到大图起始点,最后再用与小图面积相同的小容器装载大图

最后用WriteableBitmap截取小容器返回为小图片资源....   很绕,不过很好用。

软件效果图:

 

选择适当图片并按比例截取

保存的照片效果

 1  private void btnSavePhotos_Click(object sender, RoutedEventArgs e)
 2         {
 3             
 4             WriteableBitmap w1 = new WriteableBitmap(image, null);//截取大图先
 5             //开始循环切图
 6             for (int i = 7; i >=0; i--)
 7             {
 8                 //传递参数到裁剪方法中(大图的位图,小图的起点x和y,长和宽)
 9                 CutImage(w1, (i % 4) * 120, Math.Floor(i / 4) * 120, 120, 120,i);
10             }
11         }
12 
13         private void CutImage(WriteableBitmap wb, double x, double y, double width, double height,int imageId)
14         {
15             // 裁剪方法
16             Image img1 = new Image();
17             img1.Stretch = Stretch.None;
18             //移动大图的起点到小图起点
19             img1.RenderTransform = new TranslateTransform { X = -1 * x, Y = -1 * y };
20             img1.Source = wb;
21             Canvas C = new Canvas();
22             C.Width = width;
23             C.Height = height;
24             C.Children.Add(img1);
25             WriteableBitmap bitmap = new WriteableBitmap(C, null);
26             using (MemoryStream stream = new MemoryStream())
27             {
28                 Extensions.SaveJpeg(bitmap, stream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100);
29                 using (MediaLibrary library = new MediaLibrary())
30                 {
31                     library.SavePicture("/" + "QQImageWall"  + "-"+ imageId, stream.ToArray());
32                 }
33             }
34         }


等待商城的审核!

posted @ 2013-05-26 14:04  孟令严  阅读(258)  评论(0编辑  收藏  举报