Наследование: System.Windows.Controls.Image
        public void DrawPicture(int picture, byte[] Image, int y, int x)
        {
            Dispatcher.Invoke(new Action(delegate
            {
                // If the image would go beyond the actual bounds of the display, don't bother drawing it.
                if (x > this.ActualWidth || y > this.ActualHeight) return;

                byte[] buffer = Image;

                if (os_._blorbFile.AdaptivePalatte != null && os_._blorbFile.AdaptivePalatte.Count > 0)
                {

                    try
                    {
                        // Had to use the adaptive palatte for some Infocom games
                        var ms = new System.IO.MemoryStream(Image);
                        FrotzNetDLL.Frotz.Other.PNG p = new FrotzNetDLL.Frotz.Other.PNG(ms);


                        if (os_._blorbFile.AdaptivePalatte.Contains(picture))
                        {
                            if (_palatteChunk == null) throw new ArgumentException("No last palette");
                            p.Chunks["PLTE"] = _palatteChunk;
                        }
                        else
                        {
                            _palatteChunk = p.Chunks["PLTE"];
                        }

                        ms = new System.IO.MemoryStream();
                        p.Save(ms);

                        buffer = ms.ToArray();
                    }
                    catch (ArgumentException)
                    {
                        // TODO It's bad form to not at least define the exception better
                    }
                }


                FrotzImage img = new FrotzImage();
                BitmapImage bi = new BitmapImage();
                bi.BeginInit();
                bi.StreamSource = new System.IO.MemoryStream(buffer);

                bi.EndInit();
                img.Source = bi;

                RenderOptions.SetBitmapScalingMode(img, BitmapScalingMode.NearestNeighbor);

                int newX = x;
                int newY = y;

                if (newY > short.MaxValue) newY -= ushort.MaxValue;
                if (newX > short.MaxValue) newX -= ushort.MaxValue;

                img.SetValue(Canvas.TopProperty, (double)newY);
                img.SetValue(Canvas.LeftProperty, (double)newX);

                img.SetValue(Canvas.HeightProperty, (double)(bi.Height * scale));
                img.SetValue(Canvas.WidthProperty, (double)(bi.Width * scale));

                if (picture == 1)
                {
                    if (img.Source.Width > mainCanvas.ActualWidth || img.Source.Height > mainCanvas.ActualHeight)
                    {
                        // Picture one is generallythe title page, Resize the img to be the same size as the canvas, 
                        // and it will show correctly in the bounds
                        img.SetValue(Canvas.WidthProperty, mainCanvas.ActualWidth);
                        img.SetValue(Canvas.HeightProperty, mainCanvas.ActualHeight);
                    }
                }

                mainCanvas.Children.Add(img);

                // removeCoveredImages(img);
            }));
        }
        public void DrawPicture(int picture, byte[] Image, int y, int x)
        {
            Dispatcher.Invoke(new Action(delegate
            {
                // If the image would go beyond the actual bounds of the display, don't bother drawing it.
                if (x > this.ActualWidth || y > this.ActualHeight)
                {
                    return;
                }

                byte[] buffer = Image;

                if (os_._blorbFile.AdaptivePalatte != null && os_._blorbFile.AdaptivePalatte.Count > 0)
                {
                    try
                    {
                        // Had to use the adaptive palatte for some Infocom games
                        var ms = new System.IO.MemoryStream(Image);
                        FrotzNetDLL.Frotz.Other.PNG p = new FrotzNetDLL.Frotz.Other.PNG(ms);


                        if (os_._blorbFile.AdaptivePalatte.Contains(picture))
                        {
                            if (_palatteChunk == null)
                            {
                                throw new ArgumentException("No last palette");
                            }
                            p.Chunks["PLTE"] = _palatteChunk;
                        }
                        else
                        {
                            _palatteChunk = p.Chunks["PLTE"];
                        }

                        ms = new System.IO.MemoryStream();
                        p.Save(ms);

                        buffer = ms.ToArray();
                    }
                    catch (ArgumentException)
                    {
                        // TODO It's bad form to not at least define the exception better
                    }
                }


                FrotzImage img = new FrotzImage();
                BitmapImage bi = new BitmapImage();
                bi.BeginInit();
                bi.StreamSource = new System.IO.MemoryStream(buffer);

                bi.EndInit();
                img.Source = bi;

                RenderOptions.SetBitmapScalingMode(img, BitmapScalingMode.NearestNeighbor);

                int newX = x;
                int newY = y;

                if (newY > short.MaxValue)
                {
                    newY -= ushort.MaxValue;
                }
                if (newX > short.MaxValue)
                {
                    newX -= ushort.MaxValue;
                }

                img.SetValue(Canvas.TopProperty, (double)newY);
                img.SetValue(Canvas.LeftProperty, (double)newX);

                img.SetValue(Canvas.HeightProperty, (double)(bi.Height * scale));
                img.SetValue(Canvas.WidthProperty, (double)(bi.Width * scale));

                if (picture == 1)
                {
                    if (img.Source.Width > mainCanvas.ActualWidth || img.Source.Height > mainCanvas.ActualHeight)
                    {
                        // Picture one is generallythe title page, Resize the img to be the same size as the canvas,
                        // and it will show correctly in the bounds
                        img.SetValue(Canvas.WidthProperty, mainCanvas.ActualWidth);
                        img.SetValue(Canvas.HeightProperty, mainCanvas.ActualHeight);
                    }
                }

                mainCanvas.Children.Add(img);

                // removeCoveredImages(img);
            }));
        }