我从用户桌面打开多个图像文件,然后将这些图像转换为按比例缩小的尺寸,然后显示在 UI 上(在完成所有转换之后)时遇到问题。我找不到确切的问题,但我观察到的是,点击“OpenFileDialog”框控件上的“打开”按钮与我必须阅读这些文件的时间之间似乎有 5 秒的限制(s)。我使用了 6 个大小为 9-11MB 的文件,在另一种情况下,我使用了 50 个 1-2MB 的文件,并且在所有情况下,该过程都会读取到 5 秒到期。它也永远不会在同一图像上失败,因此图像不会导致问题,这将进一步让我相信它不是文件计数问题。如果我只用几个小文件测试这个过程,它会在 1 秒内发生并且没有失败,我在 UI 上看到所有图像。这就是为什么我猜测它是一个时间问题。我知道 silverlight 在用户与控件(按钮)交互时和显示“OpenFileDialog”框之前可以经过多少时间之间存在安全异常,但这个时间限制似乎不同,但我找不到任何文档。
这是我正在使用的代码。这似乎是一个很常见的食谱,到处都在使用,但为了完整性而发布。错误发生在线
var bitmap = new WriteableBitmap(bitmapImage);
它失败的原因是因为 bitmapImage pixelWidth/Height == 0。这是完整的代码。
private const int MaxPixelSize = 500;
public byte[] Convert(FileInfo fileInfo, FileTypes fileType, DateTime startTime)
{
byte[] result = null;
using (var stream = fileInfo.OpenRead())
{
DateTime EndTime = DateTime.Now;
if (fileType == FileTypes.JPG || fileType == FileTypes.BMP || fileType == FileTypes.PNG)
{
var bitmapImage = new BitmapImage();
bitmapImage.SetSource(stream);
double scaleX = 1;
double scaleY = 1;
if (bitmapImage.PixelWidth > MaxPixelSize)
{
scaleX = MaxPixelSize / (double)bitmapImage.PixelWidth;
}
if (bitmapImage.PixelHeight > MaxPixelSize)
{
scaleY = MaxPixelSize / (double)bitmapImage.PixelHeight;
}
var scale = Math.Min(scaleX, scaleY);
var bitmap = new WriteableBitmap(bitmapImage);
var resizedBitmap = bitmap.Resize((int)((double)bitmapImage.PixelWidth * scale), (int)((double)bitmapImage.PixelHeight * scale), WriteableBitmapExtensions.Interpolation.Bilinear);
using (var scaleStream = new MemoryStream())
{
var encoder = new JpegEncoder();
var image = resizedBitmap.ToImage();
encoder.Encode(image, scaleStream);
result = scaleStream.GetBuffer();
}
}
else
{
result = new byte[stream.Length];
stream.Read(result, 0, (int)stream.Length);
}
}
return result;
}
欢迎任何帮助或建议。
谢谢,
院长