【发布时间】:2013-08-26 18:10:57
【问题描述】:
我在从用户桌面打开多个图像文件,然后将这些图像转换为按比例缩小的大小,然后显示在 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;
}
欢迎任何帮助或建议。
谢谢,
院长
【问题讨论】:
-
找到一个类似的线程:stackoverflow.com/questions/15406315/…
-
我看到了那个,那个解决方案对我不起作用。首先,当代码在 5 秒窗口内处理时,我能够获得 pixelWidth 和 Height,所以我认为我不需要使用该方法。其次,我尝试了该方法,但它甚至没有命中 ImageOpened 事件。不确定设置位图的 URI 或源之间是否有区别。我只能访问源,因为我使用的是来自用户计算机的文件,而不是可以在程序集中进行路径的东西。
标签: c# silverlight-5.0 multifile-uploader