1

ユーザーのデスクトップから複数の画像ファイルを開き、それらの画像を縮小サイズに変換してUIに表示する際に問題があります(すべての変換が完了した後)。問題の正確な原因はわかりませんが、「OpenFileDialog」ボックス コントロールの「開く」ボタンを押してから、それらのファイルを読み取るまでに 5 秒の制限があるようです。 (秒)。サイズが 9 ~ 11 MB の 6 つのファイルを使用しましたが、別のケースでは 1 ~ 2 MB のファイルを 50 個使用しましたが、いずれの場合もプロセスは 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実行されると、有効な pixelWidth と height を取得できます。がbitmapImage.SetSource(stream)実行されると、このイベントが呼び出されます。

于 2014-03-06T04:54:32.433 に答える