0

画像ファイルをローカル ストレージにコピーしてサイズを変更しようとしています (ライブ タイルに表示するため)。これは私の最初の Windows ストア アプリであり、すべてです。これまでのところ、これは私が持っているものです:

var fileStream = null;
currentPhoto.copyAsync(Windows.Storage.ApplicationData.current.localFolder, currentPhoto.name)
    .then(function (file) {
        return file.openAsync(Windows.Storage.FileAccessMode.readWrite);
    })
    .then(function (stream) {
        return Windows.Graphics.Imaging.BitmapDecoder.createAsync(stream);
    })
    .then(function (decoder) {
        fileStream = new Windows.Storage.Streams.InMemoryRandomAccessStream();
        return Windows.Graphics.Imaging.BitmapEncoder.createForTranscodingAsync(fileStream, decoder);
    })
    .then(function (encoder) {
        encoder.bitmapTransform.scaledWidth = 100;
        encoder.bitmapTransform.scaledHeight = 100;
        return encoder.flushAsync();
    })
    .then(function () {
        fileStream.close();
    })
    .done(function () {
        // do tile update
    });

この部分が動作するようになったら、適切なアスペクト比を計算します。今のところ、テストには 100x100 で問題ありません。デバッグ中に、エンコーダーが JPG ファイルであることを適切に検出していることに気付きました。ただし、ローカル ストレージに保存されたファイルを読み取る呼び出しを関数チェーンに挿入すると、サイズが変更されていないことがわかります。したがって、当然、ライブ タイルの更新では、大きすぎるため無視されます。

画像のサイズを変更しようとして手順を間違えましたか? それとも、これを達成するためのより簡単な方法がありますか?

4

1 に答える 1

2

上記のコードは、期待どおりに画像のサイズを変更する必要があります。ただし、ローカル ストレージ内の画像のサイズを変更していません。元の画像をローカル ストレージにコピーし、そこから開いて、メモリ内ストリームで画像のサイズを変更するだけです。もちろん、コードを変更しないと表示できません。

コードを少し変更するだけで、サイズ変更された画像をローカル ストレージに保存できます。

var decoder = null;
var fileStream = null;
filePicker.pickSingleFileAsync()
    .then(function(file) {
        return file.openAsync(Windows.Storage.FileAccessMode.readWrite);
    })
    .then(function(stream) {
        return Windows.Graphics.Imaging.BitmapDecoder.createAsync(stream);
    })
    .then(function(dec) {
        decoder = dec;
        return Windows.Storage.ApplicationData.current.localFolder.createFileAsync("out.jpg");
    })
    .then(function(file) {
        return file.openAsync(Windows.Storage.FileAccessMode.readWrite);
    })
    .then(function (stream) {
        fileStream = stream;
        return Windows.Graphics.Imaging.BitmapEncoder.createForTranscodingAsync(stream, decoder);
    })
    .then(function(encoder) {
        encoder.bitmapTransform.scaledWidth = 100;
        encoder.bitmapTransform.scaledHeight = 100;
        return encoder.flushAsync();
    })
    .then(function() {
        fileStream.close();
    });

試してみるとout.jpg、ローカル ストレージに作成されたリサイズが表示されます。

于 2012-12-27T18:48:07.397 に答える