可寫點陣圖(WriteableBitmap)

singhwong發表於2020-12-14

WriteableBitmap派生自BitmapSource類,因此它屬於記憶體點陣圖,不過WriteableBitmap類公開了表示影像畫素資料的PixelBuffer屬性,可以通過該屬性在執行時寫入或修改畫素資料,以達到編輯影像的效果。

下面示例演示通過向WriteableBitmap物件寫入畫素資料的形式來動態建立記憶體影像。

通過程式碼生成的記憶體影像將顯示在Image控制元件中,Button控制元件的Tapped事件處理程式碼如下:
 

        private async void Button_Tapped(object sender, TappedRoutedEventArgs e)
        {
            #region 可寫點陣圖(WriteableBitmap)
            byte[] data = new byte[8 * 6 * 4];
            for (int i = 0; i < data.Length; i+=4)
            {
                if ((i/4)%2 == 0)
                {
                    data[i] = 0;        //B
                    data[i + 1] = 0;    //G
                    data[i + 2] = 255;  //R
                    data[i + 3] = 255;  //A
                }
                else
                {
                    data[i] = 0;        //B
                    data[i + 1] = 255;    //G
                    data[i + 2] = 0;  //R
                    data[i + 3] = 255;  //A
                }
            }
            WriteableBitmap wb = new WriteableBitmap(8, 6);
            data.CopyTo(wb.PixelBuffer);
            img.Source = wb;
            #endregion
        }

寫入WriteableBitmap物件中的畫素資料格式為BGRA8,即顏色通道的寫入順序為B-G-R-A,每個通道值8位,剛好一個位元組,因此,影像中的每個畫素點均佔用4個位元組的空間(32位)。上面程式碼生成寬度為8畫素,高度為6畫素的影像,由於每個畫素點佔用4個位元組,因此位元組陣列data的大小的最後要乘以4。

雖然通過PixelBuffer屬性可以訪問影像的畫素資料,但是該屬性不能直接操作,因此,可以呼叫byte[](位元組陣列)的CopyTo擴充套件方法把位元組內容複製到PixelBuffer屬性的緩衝區中。CopyTo擴充套件方法是在System.Runtime.InteropServices.WindowsRuntime名稱空間下的WindowsRuntimeBufferExtensions類中定義的。

本例中,根據寫入畫素點的次序是否為偶數(是否可被2整除),分配不同的BGRA值。

示例效果如下:

 

相關文章