我有一个方法可以使用FileStream
属性打开BitmapImage
并创建StreamSource
。
不知何故,在一台机器中,尝试打开一个大图像(6000x4000px)会导致该方法返回1x1px图像。
首先,我认为图像是从本地网络上的共享文件夹加载的,但它存储在同一台计算机的下载文件夹中。
我看到Windows的图像被“阻止/锁定”,因为它是从未经验证的源下载的,因此我打开了属性并将其解锁。尝试再次加载图像会导致同样的问题。
图片已完全下载。
有问题的机器:
我的机器(按预期工作):
public static BitmapSource SourceFrom(this string fileSource, int? size = null)
{
using (var stream = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
{
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
if (size.HasValue)
{
//It's not possible to get the size of image while opening, so get from another place.
var refSize = fileSource.ScaledSize(); //Gets the size of the image.
if (refSize.Height > refSize.Width)
bitmapImage.DecodePixelHeight = size.Value;
else
bitmapImage.DecodePixelWidth = size.Value;
}
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
bitmapImage.Freeze(); //Just in case you want to load the image in another thread.
return bitmapImage;
}
}
var image = "C:\Image.jpg".SourceFrom(); //Without any other parameter.
Exception
?using (var stream = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
{
using (var memory = new MemoryStream())
{
stream.CopyTo(memory);
memory.Position = 0;
//...
在设置memory
对象时,只需替换此部分代码并使用stream
变量而不是StreamSource
。
答案 0 :(得分:1)
似乎当图像文件非常大时,或者由于某些其他原因导致源流无法立即读取时,您必须将源流复制到中间MemoryStream,并指定到BitmapImage的StreamSource
属性:
using (var fileStream = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
using (var memoryStream = new MemoryStream())
{
fileStream.CopyTo(memoryStream);
memoryStream.Position = 0;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad
bitmapImage.StreamSource = memoryStream;
bitmapImage.EndInit();
bitmapImage.Freeze();
return bitmapImage;
}
答案 1 :(得分:0)
我遇到了同样的问题,CacheOption不在代码中的正确位置!!只需在endInit()之前添加它;
server.post(`${routeURI}/abc`, validateParams({
ProductName: Joi.string().required(),
}), routeFunction);
像这样->
source.CacheOption = BitmapCacheOption.OnLoad;