在WPF中平铺图像

时间:2017-06-18 08:42:58

标签: wpf image

我正在开发一款游戏引擎,现在我试图让我的一些图像平铺而不是拉伸。

  1. 出于某种原因,图像被拉伸而不是平铺。这是我的代码:

            string filename = "mario_right.png";
            BitmapImage bim = new BitmapImage(new Uri(@"pack://application:,,,/Assets/img/" + filename));
    
            ImageBrush imgBrush = new ImageBrush();
            imgBrush.TileMode = TileMode.Tile; //this is what makes the image tiled.
                                               //You can change the imgBrush to some other modes as well.
            imgBrush.ImageSource = bim;
            player.rect.Fill = imgBrush;       //player is a Body (my own class), which inherits from the Rectangle class.
    
  2. 实际的.png文件是50 * 50像素。当我设置播放器的正确高度和宽度(50 * 50)时,填充图像看起来很好。 当我将高度更改为250像素时,我希望将五张马里奥图像叠加在一起,但由于某些原因,这并没有发生 - .png只会被拉伸。

    (拉伸播放器的.png仅用于测试;代码实际上是用于类似超级马里奥游戏的石块。)

    1. 在测试时,我还尝试在.xaml文件中插入一个矩形,然后用img填充它。出于某种原因,我仍然无法让Tile工作!我试过Stretch的四个变种,但无济于事:

      <Grid x:Name="LayoutRoot" Background="White">
          <Rectangle x:Name="rect" Width="50" Height="250">
              <Rectangle.Fill>
                  <ImageBrush ImageSource="Assets/img/mario_right.png" TileMode="Tile" Stretch="None"/>
              </Rectangle.Fill>
          </Rectangle> 
      
    2. (Uniform,None等给出不同的结果,但它们都没有平铺图像。)

      3。 最后,我尝试使用网格背景做同样的事情。再次,图像只显示一个,拉伸而不是50 * 50像素,它填满了整个窗口。

      我开始认为问题与MainWindow.xaml文件的设置有关,但如果是这样,我如何缩放窗口(即最大化)并相应地渲染图像?

      谢谢!

      皮特

1 个答案:

答案 0 :(得分:1)

要平铺图像,您必须定义要平铺的大小(以像素为单位)。您需要的属性是ViewportUnitsViewport(看一看here

所以你的代码应该是

ImageBrush imgBrush = new ImageBrush();
imgBrush.TileMode = TileMode.Tile;
imgBrush.ImageSource = bim;
imgBrush.ViewportUnits = BrushMappingMode.Absolute;
imgBrush.Viewport = new Rect(0, 0, 50, 50);

我希望它可以帮到你。