在C#中将位图放入画布

3

可能是重复问题:
如何在WPF中将位图渲染到画布中?

我想要的很简单。我想在C#中将一个BitmapImage放入Canvas中。我的应用程序基于WPF。我搜索了这个问题并找到了类似的问题,但我没有找到我要找的。

简而言之,我有以下代码:

BitmapImage img = new BitmapImage(new Uri("c:\\xyz.jpg"));

我希望将此内容放入画布中,意义并不重要,可以是矩形或其他任何形状。


@mbeckish 那个不相关,我认为。仅添加一个位图图像不应该那么复杂,那个人建议扩展画布类。我正在寻找一种更简单的解决方案,因为我正在处理已经编写好的代码,我不想做出巨大的改变。 - rooter
@rooter,对于那个问题还有另一个答案,它将位图设置为画布的背景。 - Adriano Repetti
@rooter - 请提供更多具体细节,这样我们就不必猜测您会或不会接受什么了。 - mbeckish
@Adriano,那个也不行,因为我想把它放在特定的区域,但不作为背景图片。 - rooter
添加另一个画布,在之前的画布中放置它,并使用位图作为背景。 - oberfreak
1个回答

1
一个BitmapImage对象不能被放置在Canvas内,因为它不是一个控件。你可以从Canvas派生出自己的类,并重写OnRender()方法来绘制你的位图。基本上像这样:
class CanvasWithBitmap : Canvas
{
    public CanvasWithBitmap()
    {
        _image = new BitmapImage(new Uri(@"c:\xyz.jpg"));
    }

    protected override void OnRender(DrawingContext dc)
    {
        dc.DrawImage(_image,
            new Rect(0, 0, _image.PixelWidth, _image.PixelHeight));
    }

    private BitmapImage _image;
}

当然,您可能需要通过属性公开Canvas内部的文件路径和坐标。如果您不想声明自己的类来绘制位图,则无法直接使用BitmapImage类。显示图像的控件是Image,让我们试一下:
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(@"c:\xyz.jpg");
bitmap.EndInit();

Image image = new Image();
image.Source = bitmap;

现在您可以将 Image 控件放置在 Canvas 内的任何位置。

似乎派生是唯一的解决方案。谢谢。 - rooter
1
@rooter 不是的。如果你有很多相同的图像控件,可以考虑派生以节省一点内存,但你仍然可以使用图像控件。 - Adriano Repetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接