Как мне накладывать и накладывать изображения в WPF? - PullRequest
1 голос
/ 01 сентября 2009

Я очень новичок в 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. кто-то может указать, является ли это лучшим способом сделать мозаику.

Спасибо !!

1 Ответ

1 голос
/ 02 сентября 2009

Я нашел кое-что в сообщении на форуме 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 способ!

...