【问题标题】:Break image into tiles将图像分解为图块
【发布时间】:2011-05-19 00:46:48
【问题描述】:

嘿。 我有一个 480 x 800 的图像,想把它放在我的瓷砖地图上。我正在尝试将图像拆分为网格(6 x 10)并将每个图块分配给图像的特定部分。本质上,tilemap 看起来像一个大图像,因为每个 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 是 tile 的高度和宽度,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 类是一个简单的 80x80 画布,带有一个名为 img 的图像控件。上面的SetImage方法是这样的:

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

【问题讨论】:

  • 该代码似乎正确。你能发布整个循环吗?
  • @Olivier Payen - 我已经添加了完整的循环。

标签: c# silverlight image image-processing writeablebitmap


【解决方案1】:

您可以使用一个不错的技巧来做到这一点 - 每次使用画布裁剪图像,然后移动图像,以便每次显示另一块时:

        <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>

【讨论】:

  • 我在原始问题中添加了更多代码。我应该在循环后面的代码中执行此操作并修改SetImage 方法以接受canvas 参数吗?
  • 你可以像你建议的那样做,但最优雅的是用数据绑定来做。将上述画布放在 itemsControl.DataTemplate 中,并将其绑定为包含相关坐标的对象列表。该列表应该在后面的代码中创建。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2016-01-18
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多