1

我对 WPF 非常陌生,并试图将应用程序从 VB6 移植到 C# 和 XAML。

我现在需要做的是从许多小图像中创建一个大图像,像一系列“瓷砖”一样排列。其中一些较小的将叠加在它们上面。

在 VB6 中,完成平铺和覆盖只需将 PaintPicture 方法与 PictureBox 控件一起使用。

这是我在一步中进行平铺和叠加的尝试(尽管实际上叠加可能事先发生):

ImageDrawing Drawing1 = new ImageDrawing(new BitmapImage(new Uri(@"c:\one.bmp",
                                          UriKind.Absolute)),
                                         new Rect(0, 0, 40, 130));

ImageDrawing Drawing2 = new ImageDrawing(new BitmapImage(new Uri(@"c:\two.bmp",
                                          UriKind.Absolute)),
                                         new Rect(40, 0, 45, 130));

ImageDrawing Drawing3 = new ImageDrawing(new BitmapImage(new Uri(@"c:\overlay.bmp",
                                          UriKind.Absolute)),
                                         new Rect(40, 0, 45, 130));

DrawingGroup myDrawingGroup = new DrawingGroup();
myDrawingGroup.Children.Add(Drawing1);
myDrawingGroup.Children.Add(Drawing2);
myDrawingGroup.Children.Add(Drawing3);

myImage.Source = new DrawingImage(myDrawingGroup);

平铺工作正常,但覆盖是不行的。我想知道如果

  1. 有人可以指出我完成覆盖的方法和
  2. 有人可以指出这是否是进行平铺的最佳方式。

谢谢!!

4

1 回答 1

1

我在 MSDN 论坛上的帖子中发现了一些东西,它也允许我使用 GDI+ 调用来解决覆盖问题:

ImageDrawing Drawing1 = new ImageDrawing(new BitmapImage(new Uri(@"c:\one.bmp",
                                                                 UriKind.Absolute)),
                                                         new Rect(0, 0, 40, 130));

ImageDrawing Drawing2 = new ImageDrawing(new BitmapImage(new Uri(@"c:\two.bmp",
                                                                 UriKind.Absolute)), 
                                                         new Rect(40, 0, 45, 130));

Bitmap bitmap = new Bitmap(@"c:\overlay.bmp");

bitmap.MakeTransparent();

ImageDrawing Drawing3 = new ImageDrawing(Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(),
                                                                               IntPtr.Zero, 
                                                                               Int32Rect.Empty, 
                                                                               BitmapSizeOptions.FromEmptyOptions()),
                                         new Rect(40, 0, 45, 130));

DrawingGroup myDrawingGroup = new DrawingGroup();
myDrawingGroup.Children.Add(Drawing1);
myDrawingGroup.Children.Add(Drawing2);
myDrawingGroup.Children.Add(Drawing3);

myImage.Source = new DrawingImage(myDrawingGroup);

虽然这很有效,但令我惊讶的是,它是一种特别复杂的达到目的的手段。当然还有更直接的全 WPF 方式!

于 2009-09-02T18:21:19.530 回答