2

click.eg画像が次の場合、ボタンの画像のソースを変更する必要があるアプリを作成しています。

sample1.png、sample2.png、sample3.png ...

ボタンクリックでこのコードを書きました:

int count=1;
imagename.Source=new BitmapImage(new uri("/sample"+count+".png",uriKind.Relative));

しかし、問題は、デバイスでアプリを実行すると、ボタンがクリックされるたびに画像ソースをロードするのに時間がかかることですが、エミュレータでは適切に変更されます.デバイスでのロード時間を短縮する方法はありますか?

4

3 に答える 3

3

デバイスの読み込み時間を短縮する方法はありますか?

私の知る限り:いいえ。パフォーマンスが不十分な場合は、キャッシングを試してください。基本的に、毎回新しい BitmapImage を作成する代わりに、古いものを再利用します。

まず、ビットマップをプリロードします。プロパティを設定することを忘れないでくださいCreateOptions。そうしないと、実際の Image コントロールに割り当てるまで画像が読み込まれません。

var bitmaps = new List<BitmapImage>(count);

for (int i = 0; i < count; i++)
{
    var bitmap = new BitmapImage(new uri("/sample" + i + ".png",uriKind.Relative));
    bitmap.CreateOptions = BitmapCreateOptions.None;
    bitmaps.Add(bitmap);
}

次に、必要に応じてそれらを再利用します。

imagename.Source = bitmaps[1];

アプリのメモリ使用量が増えることに注意してください。大きな画像では使用しないでください。パフォーマンスは、多くの場合、CPU 時間とメモリ使用量の妥協点です。

于 2013-09-17T13:06:34.203 に答える
1

KooKiz が言ったように、画像をプリフェッチすることはできますが、画像を強制的に読み込むには、SetSourceAsync を使用する必要があると思います。例を次に示します。

 StorageFile file= await StorageFile.GetFileFromApplicationUriAsync(new Uri("appx-data:////sample" + i + ".png"));
        using (var stream = await file.OpenReadAsync())
        {
            bitmap.SetSourceAsync(stream);
        }

また、できることは、最初に画像のサムネイル バージョンをプリロードし (file.GetThumbnailAsyncたとえば、使用して)、次にフル イメージを後者でプリロードすることです。

最後に、読み込んでいる画像が実際に読み込んでいる表面の解像度よりも大きい場合、Bitmap オブジェクトに設定できる別のパラメーターは DecodePixelHeight と DecodePixelWidth です。

于 2013-09-17T13:23:29.573 に答える
0
int count=1;

BitmapImage bmp=new BitmapImage();

StorageFile sFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"Assets\Images\img" + count + ".png");

        var fileStream = await sFile.OpenReadAsync();

           await bmp.SetSourceAsync(fileStream);
于 2014-01-18T19:42:02.153 に答える