1

我从用户桌面打开多个图像文件,然后将这些图像转换为按比例缩小的尺寸,然后显示在 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;
    }

欢迎任何帮助或建议。

谢谢,

院长

4

1 回答 1

0

如果bitmapImage.ImageOpened事件被执行,您可以获得有效的像素宽度和高度。当bitmapImage.SetSource(stream)被执行时,将调用此事件。

于 2014-03-06T04:54:32.433 回答