1

たくさんの画像をダウンロードして、データバインディングを介してリストボックス内に表示しています。すなわち

...
<ListBox.ItemTemplate>
  <DataTemplate>
    <Image Source="{Binding ImageUrl}" Height="90" Width="90" Stretch="UniformToFill" />
  </DataTemplate>
</ListBox.ItemTemplate>
...

画像のサムネイルが欲しいのですが。イメージコントロールを90x90に設定しても、イメージは元のフルサイズでデコードされるため、必要以上に多くのメモリを消費します。

この目的で使用できるPictureDecoderクラスがありますが、その外観からすると、バックグラウンドスレッドでは使用できません。

ThreadPoolとWriteableBitmapを使用する添付の依存関係プロパティを作成してみました。

public static readonly DependencyProperty DecodingSourceProperty = DependencyProperty.RegisterAttached(
DecodingSourcePropertyName,
typeof (Uri),
typeof (Image),
new PropertyMetadata(null, OnDecodingSourcePropertyChanged));

static void OnDecodingSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
    var img = d as Image;
    double height = img.Height;
    double width = img.Width;
    var uri = (Uri)e.NewValue;
    var bmp = new WriteableBitmap((int)width, (int)height);

    ThreadPool.QueueUserWorkItem(callback => {
        var web = new WebClient();
        web.OpenReadCompleted += (sender, evt) => {
            bmp.LoadJpeg(evt.Result);
            evt.Result.Dispose();
            Deployment.Current.Dispatcher.
            BeginInvoke(() = > {
                img.Source = bmp;
            });
        };
        web.OpenReadAsync(uri);
    }
    });
}

<Image helpers:ImageExt.DecodingSource="{Binding ImageUrl}" Height="90" Width="90" Stretch="UniformToFill" />

しかし、それは私が設定したストレッチ特性を尊重していません。

同様の目的を果たすことができるサードパーティのコントロールはありますか?

サーバー上の画像のサイズを変更する必要はありませんが、最も簡単な方法のようです。

4

2 に答える 2

0

ただ使えないのImage.GetThumbnailImage

画像に埋め込みサムネイル画像が含まれている場合、このメソッドは埋め込みサムネイルを取得し、要求されたサイズに拡大縮小します。画像にサムネイル画像が埋め込まれていない場合、このメソッドはメイン画像を拡大縮小してサムネイル画像を作成します。

Image.GetThumbnailImageメソッド

于 2012-09-22T16:49:58.183 に答える
0

Windows Phone 8では、BitmapImageクラスに新しいプロパティ(DecodePixelWidthとDecodePixelHeight)があります。

<Image>
   <BitmapImage UriSource="{Binding Url"}  DecodePixelWidth="200" DecodePixelHeight="200" />
</Image>

画像を指定された解像度にデコードし、メモリ使用量を減らします。(アスペクト比を維持したい場合は、2つではなく1つのプロパティを使用してください)。

于 2012-11-05T08:51:18.113 に答える