Изображение не масштабируется с помощью WinJS

Я пытаюсь масштабировать существующий образ до 50% его размера с помощью WinRT. Копирует изображение в локальную папку, но не меняет его размер;

var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
    openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
    openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
    openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]);

    openPicker.pickSingleFileAsync().then(function (file) {
        file.copyAsync(Windows.Storage.ApplicationData.current.localFolder, file.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 = 50;
        encoder.bitmapTransform.scaledHeight = 50;
        return encoder.flushAsync();
    })
    .then(function () {
        fileStream.close();
    })
    .done(function () {
        // use image in the program
    });
});

person vadimmelnyk    schedule 02.11.2013    source источник


Ответы (1)


Вы почти это сделали - один шаг, который вам не хватает, это то, что вам нужно скопировать fileStream (который находится в памяти) в поток (подключенный к файлу). В противном случае вы просто выбрасываете этот закодированный (и измененный размер) поток памяти. По сути, вставьте что-то вроде этого между flushAsync и fileStream.close:

}).then(function () {
    // Overwrite the contents of the file with the updated image stream.
    fileStream.seek(0);
    stream.seek(0);
    stream.size = 0;
    return Windows.Storage.Streams.RandomAccessStream.copyAsync(fileStream, stream);

Также не забудьте вызвать stream.close в дополнение к fileStream.close. (Я рекомендую использовать memStream и fileStream вместо fileStream и stream, чтобы ваш код был четким.)

Полностью работающий пример см. в сценарии 2 примера Simple Imaging в SDK.

person Kraig Brockschmidt - MSFT    schedule 04.11.2013