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 回答