Silverlight:BitmapImage到WriteableBitmap

时间:2011-03-19 01:20:24

标签: silverlight

我可以像这样成功加载以下Bitmap,并在视图的Image控件中显示它。

var bitmapImage = new BitmapImage
                            {
                                UriSource = 
                                    new Uri("../Images/Test.JPG", UriKind.Relative)
                            };

但是,只要我添加此行以从位图创建WriteableBitmap,

    var w = new WriteableBitmap(bitmapImage);

我在上面的行中收到运行时错误:“对象引用未设置为对象的实例。”

似乎BitmapImage创建延迟了,可能是吗?我该如何解决这个问题?

更新

我现在正在尝试这个,但openImage似乎永远不会被击中。 (即使没有试图让它同步,它仍然失败)这里有什么问题?

var image = new BitmapImage();
        image.ImageOpened += (sender, args) => resetEventBitmap.Set();
        image.ImageFailed += (o, eventArgs) =>
                                 {
                                     resetEventBitmap.Set();
                                     throw eventArgs.ErrorException;
                                 };
        image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        image.UriSource = uri;

        resetEventBitmap.WaitOne();

谢谢,

3 个答案:

答案 0 :(得分:6)

参考: http://www.blog.ingenuitynow.net/Silverlight+Creating+A+WriteableBitmap+From+A+Uri+Source.aspx

基本上,位图图像具有依赖属性“CreateOptions”,默认情况下,它设置为“DelayCreation”。这会导致位图延迟渲染,直到需要它为止。因此,这会导致我们的“对象引用未设置为对象的实例”错误。要解决这个问题,我们必须打破writeablebitmap构造函数中的位图创建,更改此选项,然后将其重新放入。在vb.net中,这看起来像:

    Dim tmpUri As New Uri(yourpath.ToString)
    Dim bmp As New BitmapImage
    bmp.CreateOptions = BitmapCreateOptions.None
    bmp.UriSource = tmpUri
    Dim wb As New WriteableBitmap(bmp)

答案 1 :(得分:3)

    BitmapImage _classField;

    void LoadImageFunction()
    {
        _classField = new BitmapImage();
        _classField.ImageOpened += new EventHandler<RoutedEventArgs>(bi_ImageOpened);
        _classField.ImageFailed += new EventHandler<ExceptionRoutedEventArgs>(bi_ImageFailed);
        //sorry.. totally forgot about order :)
        _classField.UriSource = new Uri("../some/uri", UriKind.Relative);
    }

    void bi_ImageFailed(object sender, ExceptionRoutedEventArgs e)
    {
        //something has happend
        throw e.ErrorException;
    }

    void bi_ImageOpened(object sender, RoutedEventArgs e)
    {
        //image is loaded.. now we can work with it..
        var w = new WriteableBitmap(_classField);
    }

答案 2 :(得分:1)

img1 = new BitmapImage(new Uri("/PrjName;component/Images/image01.jpg", UriKind.RelativeOrAbsolute));
        img2 = new BitmapImage(new Uri("/PrjName;component/Images/image02.jpg", UriKind.RelativeOrAbsolute));
        img1.CreateOptions = BitmapCreateOptions.None;
        img2.CreateOptions = BitmapCreateOptions.None;
        img1.ImageOpened += new EventHandler<RoutedEventArgs>(img1_ImageOpened);
        img2.ImageOpened += new EventHandler<RoutedEventArgs>(img2_ImageOpened);


    void img2_ImageOpened(object sender, RoutedEventArgs e)
    {
        load2 = true;
    }

    void img1_ImageOpened(object sender, RoutedEventArgs e)
    {
        load1 = true;
    }

    private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
    {
        while (!load1 && !load2)
        { }
        WriteableBitmap x = new WriteableBitmap(img1);
        WriteableBitmap y = new WriteableBitmap(img2);
    }

这应该有效。它为我做了..!它使它成为一个小小的很复杂,但它是如何运作的!