打开图像文件到可写位图中

4

这里有一个问题。 我想要从本地驱动器打开一个文件,然后把它转换成WritableBitmap以便编辑。 但是问题在于,我无法从Uri或类似的东西创建WritableBitmap。我知道如何将文件打开为BitmapImage,但是我无法弄清楚如何将文件打开为WritableBitmap。 是否有一种方法可以直接将文件打开为WritableBitmap?如果没有,是否有一种方法可以将BitmapImage转换为WritableBitmap? 谢谢大家。


似乎我们可以直接将位图传递给WritableBitmap的构造函数。当我第一次尝试时,我的VS给了我错误,但现在它似乎可以工作了。这不是一个好问题,对不起大家。 - gkaykck
它会工作,但如果超过某些兆像素,它将被调整大小。 - Léon Pelletier
3个回答

6

您可以将图像文件加载到BitmapImage中,并将其用作WriteableBitmap的源:

BitmapImage bitmap = new BitmapImage(new Uri("YourImage.jpg", UriKind.Relative));
WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);

1
实际上,在Silverlight中,它给了我一个异常。所以这不是一个解决方案。 - Peter Lee
1
BitmapImage bi = new BitmapImage(new Uri("header.png", UriKind.Relative)); WriteableBitmap wb = new WriteableBitmap(bi);第二行代码出现了异常:System.NullReferenceException was unhandled by user code: Object reference not set to an instance of an object. - Peter Lee
@Peter,你在调用BitmapImage构造函数后有检查过bi不是null吗?如果是的话,WriteableBitmap构造函数失败就很合理。 - Frédéric Hamidi
是的,我已经检查过了。请看我的回答。你介意在你的机器上测试我的代码吗? - Peter Lee
@LéonPelletier 我将创建选项设置为None,但出现错误(Silverlight 5)。在创建的位图图像源中,PixelHeight和PixelWidth为零。 - shalin
显示剩余3条评论

1

我不是专家,也没有立即访问智能感知等工具的权限,但是我会尽力...

var fileBytes = File.ReadAllBytes(fileName);
var stream = new MemoryStream(fileBytes);
var bitmap = new BitmapImage(stream);
var writeableBitmap = new WritableBitmap(bitmap);

即使不是完美的例子,这也足以指引您朝着正确的方向前进。希望如此。


你不能直接将位图传递到可写位图。 - gkaykck
在Silverlight中,除非使用OpenFileDialog,否则不允许使用File.ReadAllBytes(fileName)。 - Peter Lee

0
在Silverlight 5中,您可以使用以下方法从本地磁盘打开文件并将其转换为BitmapImage,并将其制作成WriteableBitmap:
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.Multiselect = false;


        dlg.ShowDialog();
        byte[] byteArray = new byte[] { };
        if (dlg.File == null) return;
        BitmapImage bi = new BitmapImage();
        bi.CreateOptions = BitmapCreateOptions.None;
       // bi.UriSource = new Uri(@"C:\Users\saw\Desktop\image.jpg", UriKind.RelativeOrAbsolute);
        bi.SetSource(dlg.File.OpenRead());
        WriteableBitmap eb=new WriteableBitmap(bi);

在尝试创建WriteableBitmap时,设置新的Uri给了我一个错误(对象引用未设置为对象的实例)


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