У меня возникают проблемы с открытием нескольких файлов изображений с рабочего стола пользователя, а затем преобразованием этих изображений в уменьшенный размер, который затем отображается в пользовательском интерфейсе (после завершения преобразования). Я не могу точно определить, в чем проблема, но я заметил, что между нажатием кнопки «Открыть» в поле «OpenFileDialog» и тем, сколько времени у меня есть, чтобы прочитать эти файлы, существует ограничение в 5 секунд. (с). Я использовал 6 файлов размером 9-11 МБ, а в другом случае я использовал 50 файлов размером 1-2 МБ, и во всех случаях процесс будет считываться до истечения 5 секунд. Он никогда не дает сбоев на одном и том же изображении, поэтому изображение не вызывает проблемы, что еще больше заставит меня поверить, что это не проблема с количеством файлов. Если я протестирую этот процесс только с несколькими файлами небольшого размера, это произойдет менее чем за 1 секунду, и не будет сбоя, и я увижу все изображения в пользовательском интерфейсе. Вот почему я предполагаю, что это проблема времени. Я знаю, что в 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;
}
Любая помощь или предложения приветствуются.
Спасибо,
Дин