2011-05-19 81 views
8

嘿。 我有一个480×800的图像,并希望将其放置在我的地图上。我试图将图像分割成网格(6 x 10),并为每个图块分配图像的特定部分。本质上,由于每个图块都附加了图像的相关部分,所以该图块看起来像一个大图像。这样做的最好方法是什么? 我已经尝试了解每个tile并将其绘制到WriteableBitmap,但所有图像都是相同的。将图像分解为图块

WriteableBitmap wb = new WriteableBitmap(80,80); 
Rect src= new Rect(x*Width,y*Height, 80, 80); 
Rect dest= new Rect(0, 0, 80, 80); 
wb.Blit(dest, mainWb, src); 
tile.SetImage(wb); 

(x和y)是刚通过tilemap的迭代时所使用的索引,80是瓦片的高度和宽度和mainWb是大图像欲分割。谢谢你的帮助。

编辑:完全循环代码:

var mainImage = Application.GetResourceStream(new Uri("MainImage.jpg", UriKind.Relative)).Stream; 
        WriteableBitmap mainWb = new WriteableBitmap(480, 800);   

        mainWb.SetSource(mainImage); 
        for (int x = 0; x < 6; x++) 
        { 
         for (int y = 0; y < 12; y++) 
         { 
          Tile tile = new Tile(); 

          WriteableBitmap wb = new WriteableBitmap(80,80); 


Rect src = new Rect(x*Width,y*Height, 80, 80); 

         Rect dest = new Rect(0, 0, 80, 80); 

         wb.Blit(dest, mainWb, src); 
         tile.SetImage(wb);  

         Canvas.SetLeft(tile, x * WIDTH); 
         Canvas.SetTop(tile, y * HEIGHT); 


         LayoutRoot.Children.Add(tile); 
         ls.Add(tile); 
        } 
       } 

Tile类是与图像控制简单的80×80画布称为img。上述SetImage方法是这样的:

public void SetImage(WriteableBitmap wb) 
     {     
      img.Source = wb;      
     } 
+0

该代码似乎是正确的。你能发布整个循环吗? – 2011-05-19 12:19:03

+0

@ Olivier Payen - 我已经添加了完整的循环。 – Skoder 2011-05-19 14:36:19

回答

4

,你可以用一个漂亮的把戏做到这一点 - 用帆布每次只需裁剪图像,以及移动图像所以每次另一片显示:

 <Canvas Width="80" Height="80"> 
      <Canvas.Clip> 
       <RectangleGeometry Rect="0,0,80,80" /> 
      </Canvas.Clip> 
      <Image Source="your_image.png" 
    Canvas.Left="0" Canvas.Top="0" /> 
      <!-- or -80, -160, -240 etc.. --> 
     </Canvas> 
+0

我在原始问题中增加了一些代码。我应该在循环中的代码中执行此操作,并修改“SetImage”方法以接受“canvas”参数吗? – Skoder 2011-05-19 14:46:59

+0

你可以做我喜欢你的建议,但最优雅的是做数据绑定。将上述画布放在一个itemsControl.DataTemplate中,并将它绑定到一个包含相关坐标的对象列表。该列表应在代码后面创建。 – 2011-05-19 14:50:53