共用方式為


如何編碼新影像 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

以下將說明如何使用 BitmapEncoder 物件將新影像儲存至檔案。如果要對現有影像進行變更,請參閱如何編輯影像

您必須知道的事

技術

先決條件

指示

步驟 1: 使用檔案選擇器來選擇目的地檔案

FileSavePicker 可以讓使用者從系統中選擇新檔案或現有檔案。從選擇器取得檔案之後,您可以用該檔案做為 BitmapEncoder 的目的地。

首先,建立新的檔案選擇器物件、將檔案類型選項設定為允許 JPEG 影像,然後將選擇器顯示給使用者。

// variables to store objects across multiple async operations
var encoder;
var fileType;
var stream;

var picker = new Windows.Storage.Pickers.FileSavePicker();
        
picker.fileTypeChoices.insert("JPEG file", [".jpg"]);
picker.defaultFileExtension = "jpg";
picker.suggestedFileName = "untitled";

picker.pickSaveFileAsync().then(function (file) {

            if (!file) {
                // The user did not select a file.
                return;
            }

            fileType = file. fileType;             

注意  您可以在檔案類型篩選中新增更多副檔名。如需詳細資訊,請參閱 Windows.Storage.Pickers

 

注意  您可以使用 Windows.Graphics.Imaging.BitmapEncoder.getEncoderinfoEnumerator 取得所有支援的編碼器和副檔名清單。

 

步驟 2: 針對新影像建立編碼器物件

有了目的地檔案之後,從檔案取得具有 ReadWrite 存取權限的 IRandomAccessStream,然後用它來具現化 BitmapEncoder。您也必須為使用者選取的檔案類型決定正確的編碼器識別碼。這個範例只允許 JPEG 影像,所以如果您允許多種檔案類型,必須根據檔案的 FileType 參數來切換。

        return file.openAsync(Windows.Storage.FileAccessMode.readWrite);
        }).then(function (_stream) {
        stream = _stream;
              stream.size = 0;

        var encoderId;
        switch (fileType) {
            case ".jpg":
                encoderId = Windows.Graphics.Imaging.BitmapEncoder.jpegEncoderId;
                break;
        }
        return Windows.Graphics.Imaging.BitmapEncoder.createAsync(encoderId, stream);
        }).then(function (encoder) {

注意  內建的編碼器識別碼可以做為 BitmapEncoder 的靜態成員提供。

 

如果使用者選取儲存到已經存在的檔案,您必須將 IRandomAccessStream.size 設為 0,因為 BitmapEncoder 要求輸出資料流必須是空白的。

現在您擁有表示空白 JPEG 影像的 BitmapEncoder

步驟 3: 在編碼器上設定一些資料

既然已經擁有 BitmapEncoder 物件,就可以設定中繼資料和像素資料,以及控制縮圖和轉換,像是旋轉和縮放。

這裡的程式碼會設定一個簡單的像素資料陣列。如需有關設定影像屬性和中繼資料的詳細資訊,請參閱如何寫入影像中繼資料

            // An array representing 2x2 red, opaque pixel data
            var pixels = [255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255];

            encoder.setPixelData(
                Windows.Graphics.Imaging.BitmapPixelFormat.rgba8,
                Windows.Graphics.Imaging.BitmapAlphaMode.straight,
                2, // pixel width
                2, // pixel height
                96, // horizontal DPI
                96, // vertical DPI
                pixels
                );

注意  如果使用 CreateAsync 方法建立 BitmapEncoder,您至少必須使用 SetPixelData 方法提供像素資料,才能建立有效的影像。

 

步驟 4: 將變更儲存到檔案

完成編輯 BitmapEncoder 時,您必須先排清編碼器並關閉基礎資料流,再使用該檔案。如果不這樣做,就不會儲存影像,且資料會遺失。

最後,處理任何錯誤。如果您嘗試執行檔案格式不支援或是無效的編碼動作,除非呼叫 FlushAsync,否則不會出現錯誤。也就是說,如果您嘗試在 BMP (不支援縮圖) 這類格式中,藉由將 IsThumbnailGenerated 設定為 True 的方式儲存縮圖,則 FlushAsync 會失敗。

        return encoder.flushAsync();
        }).then(function () {
            // This means the encoder saved successfully.
        }, function (error) {
            // There was an error encoding, error.message has the error string.
        }).done(null, function () {
            // Close the stream regardless of whether encoding was successful. Otherwise it will continue to be locked for Read/Write access.
            stream && stream.close();
        });
 }

注意  呼叫 FlushAsync 函式時,編碼器會儲存,而且您必須重新建立編碼器才能進行其他作業。如果打算稍後使用編碼器,請等到用完編碼器後再呼叫 FlushAsync

 

相關主題

如何寫入影像中繼資料

如何解碼影像

如何編輯影像