使用带有WinJS Metro应用程序的BitmapEncoder后关闭流

时间:2012-04-19 23:03:09

标签: windows-8 microsoft-metro winjs

在用JS编写的Windows 8 Metro应用程序中,我打开一个文件,获取流,使用'promise - .then'模式将一些图像数据写入其中。它工作正常 - 文件成功保存到文件系统,除非使用BitmapEncoder将流刷新到文件后,流仍然打开。即;在我杀死应用程序之前我无法访问该文件,但'stream'变量超出了我引用的范围,因此我无法关闭()它。是否有类似于可以使用的C#using语句?

...then(function (file) {
                return file.openAsync(Windows.Storage.FileAccessMode.readWrite);
            })
.then(function (stream) {
                //Create imageencoder object
                return Imaging.BitmapEncoder.createAsync(Imaging.BitmapEncoder.pngEncoderId, stream);
            })
.then(function (encoder) {
                //Set the pixel data in the encoder ('canvasImage.data' is an existing image stream)
                encoder.setPixelData(Imaging.BitmapPixelFormat.rgba8, Imaging.BitmapAlphaMode.straight, canvasImage.width, canvasImage.height, 96, 96, canvasImage.data);
                //Go do the encoding
                return encoder.flushAsync();
                //file saved successfully, 
                //but stream is still open and the stream variable is out of scope.
            };

1 个答案:

答案 0 :(得分:1)

来自Microsoft的simple imaging sample可能有所帮助。复制如下。

看起来,在您的情况下,您需要在then调用链之前声明流,确保您没有将您的参数命名与您接受流的函数名称冲突(请注意该部分他们在哪里_stream = stream),并添加then调用以关闭流。

function scenario2GetImageRotationAsync(file) { 
    var accessMode = Windows.Storage.FileAccessMode.read; 

    // Keep data in-scope across multiple asynchronous methods 
    var stream; 
    var exifRotation;
    return file.openAsync(accessMode).then(function (_stream) { 
        stream = _stream; 
        return Imaging.BitmapDecoder.createAsync(stream); 
    }).then(function (decoder) { 
        // irrelevant stuff to this question
    }).then(function () { 
        if (stream) { 
            stream.close(); 
        } 
        return exifRotation; 
    }); 
}