共用方式為


如何取得特定格式的像素資料 (HTML)

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

以下將說明如何使用 BitmapDecoder 物件取得影像的像素資料。 像素是包裝成位元組陣列,而且要求資料時,您可以指定格式。

您可以指定 BitmapDecoder 產生之像素資料的下列屬性:

  1. 像素格式 (BitmapPixelFormat)。
  2. Alpha 模式 (BitmapAlphaMode)。
  3. 翻轉、旋轉、縮放和/或裁剪操作 (BitmapTransform)。
  4. 是否涉及內嵌的 EXIF 方向旗標 (ExifOrientationMode)。
  5. 是否執行 sRGB 色彩空間的色彩管理 (ColorManagementMode)。

如果您需要妥善控制解碼行為,或是如果您的應用程式預期像素資料是特定格式,這就很有用。例如,如果您正在與 HTML Canvas Context2D API 交互操作,您必須以 Rgba8 和直向 Alpha 格式提供像素資料。

您必須知道的事

技術

先決條件

指示

步驟 1: 取得解碼器物件

撰寫開始函式,接收 BitmapDecoder 物件。

function GetPixelData(decoder) {

解碼器可以讓您存取像素資料。 如果您還沒有解碼器物件,請參閱如何解碼影像

步驟 2: 取得像素資料提供者物件

呼叫 getPixelDataAsync 方法並指定參數,以控制傳回的像素資料格式。 像素資料提供者包含指定格式的像素資料。 當 getPixelDataAsync 傳回後,就會配置像素資料且可供使用。

decoder.getPixelDataAsync(
        Windows.Graphics.Imaging.BitmapPixelFormat.rgba8,
        Windows.Graphics.Imaging.BitmapAlphaMode.straight,
        new Windows.Graphics.Imaging.BitmapTransform(),
        Windows.Graphics.Imaging.ExifOrientationMode.respectExifOrientation,
        Windows.Graphics.Imaging.ColorManagementMode.colorManageToSRgb
    ).then(function (pixelDataProvider) {

在這個案例中,我們將像素格式設為 RGBA8,而 Alpha 模式設為直向。 傳回像素資料時,處理程式碼會根據這個假設來運作。除了涉及 EXIF 方向之外,我們不套用任何轉換,並啟用色彩管理。

注意  如果您呼叫不含引數的 getPixelDataAsync,方法就會以原始格式傳回像素資料。 請參閱如何取得預設格式的像素資料以了解詳細資訊。

 

步驟 3: 從資料提供者取得像素

呼叫 detachPixelData 方法來取得像素資料的位元組陣列。

      var pixels = pixelDataProvider.detachPixelData()

detachPixelData 函式會同步傳回像素資料的位元組陣列。 這個範例是以 Rgba8 像素格式要求像素資料,因此,陣列中的每個元素都會對應單一色彩通道值。

注意  您只能呼叫一次 detachPixelData。所有後續呼叫都會失敗。如果要再次取得像素,必須呼叫 getPixelDataAsync 以取得新的像素資料提供者。

 

步驟 4: 循環顯示像素

因為有像素資料,就可以處理這些資料。這裡的程式碼清除了綠色和藍色色板,只留下紅色和 Alpha 色板。

        var height = decoder.orientedPixelHeight;
        var width = decoder.orientedPixelWidth;

        for (var i = 0; i < height; i++) {
            for (var j = 0; j < width; j++) {
                pixels[(i * height + j) * 4 + 1] = 0; // Green channel (RGBA)
                pixels[(i * height + j) * 4 + 2] = 0; // Blue channel (RGBA)
            }
        }
    });
}

注意  在步驟 2 中,對 getPixelDataAsync 的呼叫指定了解碼器傳回已套用 EXIF 方向的像素資料。因此,當您想取得影像維度時,使用 orientedPixelWidthorientedPixelHeight 屬性 (而非 pixelWidthpixelHeight) 是很重要的。orientedPixelWidthorientedPixelHeight 屬性會反映因為 EXIF 方向而產生的任何維度變更。

 

相關主題

Windows.Graphics.Imaging

BitmapDecoder

GetPixelDataAsync

如何解碼影像

如何取得特定格式的像素資料