C# 查看图像文件而不锁定它。(复制到内存?)

C# 查看图像文件而不锁定它。(复制到内存?),c#,wpf,windows-7-x64,file-access,C#,Wpf,Windows 7 X64,File Access,我希望能够在不锁定文件的情况下打开/查看图像(.jpg)。基本上我有一个程序,让用户选择一个图片,将覆盖图片。但问题是,我显示的图像正在被覆盖。那么,如何在不锁定图像的情况下加载图像呢 这是我现在必须设置图像的代码 Image1.Source = new BitmapImage( new Uri( myFilePath ) ) ); myFilePath等于类似“C:\Users*\My Pictures\Sample.jpg”的字符串。我想这就是您要查找的属性。将图像读入MemoryStr

我希望能够在不锁定文件的情况下打开/查看图像(.jpg)。基本上我有一个程序,让用户选择一个图片,将覆盖图片。但问题是,我显示的图像正在被覆盖。那么,如何在不锁定图像的情况下加载图像呢

这是我现在必须设置图像的代码

Image1.Source = new BitmapImage( new Uri( myFilePath ) ) ); 
myFilePath等于类似“C:\Users*\My Pictures\Sample.jpg”的字符串。

我想这就是您要查找的属性。将图像读入MemoryStream,然后将MemoryStream设置为BitmapImage的StreamSource的值:

var memStream = new MemoryStream(File.ReadAllBytes(myFilePath));
Image1.Source = new BitmapImage() { StreamSource = memStream };
编辑:我已尝试此代码,您似乎需要调用BitmapImage.BeginInit和BitmapImage.EndInit来设置源代码:

var memStream = new MemoryStream(File.ReadAllBytes(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"));
var img = new BitmapImage();
img.BeginInit();
img.StreamSource = memStream;
img.EndInit();
myImage.Source = img;

myBitmap.CacheOption=BitmapCacheOption.OnLoad
是您要查找的行。它“在加载时将整个图像缓存到内存中。对图像数据的所有请求都将从内存存储中填充。”

大概是这样的:

BitmapImage bmi = new BitmapImage();
bmi.BeginInit();
bmi.UriSource = new Uri(myFilePath);
bmi.CacheOption = BitmapCacheOption.OnLoad;
bmi.EndInit();
Image1.Source = bmi;

打开文件时,当其他程序需要该文件时,还可以选择该文件的共享来定义其beaviour:

(摘自msdn:)

File.Open方法(字符串、文件模式、文件访问、**FileShare**

参数
路径
类型:System.String
要打开的文件

模式
类型:System.IO.FileMode
一个FileMode值,用于指定在文件不存在时是否创建文件,并确定是保留还是覆盖现有文件的内容

访问
类型:System.IO.FileAccess
FileAccess值,指定可对文件执行的操作

*共享
*类型:System.IO.FileShare*

FileShare值,指定其他线程对该文件的访问类型

这不会导致内存泄漏吗?如果要更改映像源,除非始终在MemoryStream上保留一个句柄,否则无法处置()MemoryStream。如果内存流不再是根对象,它将像任何其他托管对象一样被垃圾收集。如果将另一个对象(可能是另一个内存流)分配给
位图图像
流源
,则会发生这种情况。它编译并运行,但没有将文件加载到我的WPF映像中。我检查了代码,确定需要调用BeginInit和EndInit来设置StreamSource。请参阅上面的编辑。刚刚找到这个答案,我想我会竖起大拇指,因为当图像文件被读入应用程序时,我遇到了一些问题,它们被锁定了。上述代码实际上已经消除了该问题。请确保将“PresentationCore”添加到项目的引用中,否则将无法找到System.Windows.Media命名空间。添加参考后,使用System.Windows.Media.Imaging添加;到项目的顶端。;)