Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将图像分块_C#_Silverlight_Image_Image Processing_Writeablebitmap - Fatal编程技术网

C# 将图像分块

C# 将图像分块,c#,silverlight,image,image-processing,writeablebitmap,C#,Silverlight,Image,Image Processing,Writeablebitmap,嘿。 我有一张480 x 800的图片,想把它放在我的tilemap上。我正在尝试将图像分割成一个网格(6 x 10),并将图像的特定部分分配给每个磁贴。从本质上讲,tilemap看起来像一个大图像,因为每个tile都附带了图像的相关部分。最好的方法是什么? 我试着把每个图块都画成一个可写的位图,但所有的图像都是一样的 WriteableBitmap wb = new WriteableBitmap(80,80); Rect src= new Rect(x*Width,y*Height, 80,

嘿。 我有一张480 x 800的图片,想把它放在我的tilemap上。我正在尝试将图像分割成一个网格(6 x 10),并将图像的特定部分分配给每个磁贴。从本质上讲,tilemap看起来像一个大图像,因为每个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);
(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);
                    }
                }

您可以使用一个很好的技巧来实现这一点-每次使用画布裁剪图像,并移动图像,以便每次显示另一块图像时:

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


该代码似乎正确。你能发布整个循环吗?@Olivier Payen-我已经添加了完整的循环。我已经在原始问题中添加了一些代码。我是否应该在循环中的代码隐藏中执行此操作,并修改
SetImage
方法以接受
canvas
参数?您可以按照我的建议执行,但最优雅的方法是使用数据绑定。将上述画布放在itemsControl.DataTemplate中,并将其绑定到包含相关坐标的对象列表中。该列表应在代码隐藏中创建。
        <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>