5

次の Image オブジェクトがあるとします (これは ListView オブジェクトの DataTemplate にあります)。

  <Image Source="{Binding ImgSource}" ImageOpened="img_ImageOpened" />

高品質のバイキュービック補間画像を取得するにはどうすればよいですか? (画面上では、この画像のサイズはソース PNG よりも小さくなっていますが、デフォルトのサイズ変更は低品質の「最近傍」補間で実行されているように見えます)。

データ バインディングのみに依存したいので (関連付けられたデータ項目の ImgSource が変更されるたびに、Image コンテンツが変更される必要があります)、ImageOpened ハンドラーを設定し、読み込まれたばかりの画像をより高品質のものに変更しようとしました。 .

残念ながら、以下のコードは機能しないようです (空の画像が表示されるだけです)。

    async void LoadImage(Image imgControl, string source)
    {
        try
        {
            StorageFile file = await StorageFile.GetFileFromPathAsync(source);

            IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);
            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);

            InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
            BitmapEncoder enc = await BitmapEncoder.CreateForTranscodingAsync(ras, decoder);

            enc.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Cubic;
            enc.BitmapTransform.ScaledHeight = Convert.ToUInt32(imgControl.ActualHeight);
            enc.BitmapTransform.ScaledWidth = Convert.ToUInt32(imgControl.ActualWidth);

            await enc.FlushAsync();

            Windows.UI.Xaml.Media.Imaging.BitmapImage bImg = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
            bImg.SetSource(ras);
            imgControl.Source = bImg;
        }
        catch (Exception e)
        {
            return;
        }
    }

    void img_ImageOpened(object sender, RoutedEventArgs e)
    {
        Image imgControl = (Image)sender;
        LoadImage(imgControl, <path to PNG file>);
    }
4

2 に答える 2

2

WinRT アプリケーションで同じ画質の問題に直面し、RenderOptions.BitmapScalingMode を使用しようとしましたが、Windows ストアの .NET には存在しません (および System.Windows.Media 名前空間も)。だから私はあなたの最初の解決策を試して、それがうまくいくように修正しました。あなたは成功への小さな一歩でした。追加するだけです

ras.Seek(0);

ストリームを最初から読み取ることができるようにします。

于 2013-03-30T15:41:55.957 に答える
-1

少し遅れていることは承知していますが、他の人の参考になるかもしれません。このようなハンドラーは必要ありません。RenderOptions.BitmapScalingMode添付プロパティの値を設定するだけで済みます。

<Image Source="{Binding ImgSource}" ImageOpened="img_ImageOpened" RenderOptions.BitmapScalingMode="HighQuality" />
于 2013-03-07T18:27:47.823 に答える