Загрузка изображений Silverlight не имеет pixelWidth или pixelHeigth

У меня возникают проблемы с открытием нескольких файлов изображений с рабочего стола пользователя, а затем преобразованием этих изображений в уменьшенный размер, который затем отображается в пользовательском интерфейсе (после завершения преобразования). Я не могу точно определить, в чем проблема, но я заметил, что между нажатием кнопки «Открыть» в поле «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;
    }

Любая помощь или предложения приветствуются.

Спасибо,

Дин


person Dean Rich    schedule 26.08.2013    source источник
comment
Нашел похожий поток: stackoverflow. ком/вопросы/15406315/   -  person Jeroen van Langen    schedule 26.08.2013
comment
Я видел это, и это решение не сработало для меня. Во-первых, я могу получить ширину и высоту в пикселях, поскольку код работает во время обработки в течение этого 5-секундного окна, поэтому я не думаю, что мне нужно использовать этот метод. Во-вторых, я попробовал этот метод, и он даже не попал в событие ImageOpened. Не уверен, есть ли разница между установкой URI растрового изображения или источника. У меня есть доступ только к исходному коду, поскольку я использую файлы с пользовательского компьютера, а не то, что можно найти в сборке.   -  person Dean Rich    schedule 26.08.2013


Ответы (1)


если событие bitmapImage.ImageOpened выполнено, вы можете получить допустимую ширину и высоту в пикселях. при выполнении bitmapImage.SetSource(stream) будет вызвано это событие.

person hello    schedule 06.03.2014