haXe中對BitmapData進行批量畫素級運算

2021-06-11 17:33:44 字數 1966 閱讀 5229

nme中大部分的點陣圖濾鏡(flash.filters.*)都未實現,所以有些特效不得不自己編寫**來進行批量畫素處理。

用getpixel32()和setpixel32()當然是最簡單的,但效率很低。因此這裡使用getpixels()把批量畫素複製到位元組陣列,進行完運算,再用setpixels()覆蓋回到位圖。

下面的**目的是根據一張掩碼點陣圖mask對原始點陣圖bmp逐畫素進行浮雕化處理,也就是根據每個mask畫素對原始點陣圖的畫素進行加亮或暗化處理。

處理完的畫素輸出到乙個新的位元組陣列obuf中,最後再設定回原始點陣圖中覆蓋原畫素。

分別測試了兩種方法,一種以輸入輸出流的方式使用bytearray,第二種則以陣列方式使用,從效能角度看,第二種應該更優。

在此段**中有若干個api的表現在flash和cpp目標不一致,總結如下:

1. flash中用getpixels獲得的bytearray預設讀寫指標位置在最末,讀取之前需要重置,cpp則不必;如果採用陣列方式,則可完全忽略指標位置問題

2. flash中bytearray.readbyte()返回的是有符號整數即-128~127,需要用&運算轉成無符號整數;而在cpp目標中返回的是0~255

3. 因為cpp目標中bytearray繼承於bytes,因此比flash中的對應類要更靈活一些

4. 在flash和cpp中bytearray都可以用陣列訪問運算子來隨機訪問元素,但在flash中,bytearray.length可讀寫,cpp中,bytearray.length唯讀,因此第二段**中用了條件編譯

具體的解說見下面**中的注釋。

*************** 第一種方法,使用流式操作 ***************=

// bitmapdata.getpixels()返回的位元組陣列中每個畫素用4個位元組表示,以argb排列

// 掩碼圖和原位圖大小相等,為width*height

var mbuf: bytearray = mask.getpixels(new rectangle(0, 0, width, height));

var bbuf: bytearray = bmp.getpixels(new rectangle(0, 0, width, height));

var obuf = new bytearray(); //用於輸出的新畫素陣列

// flash中用getpixels獲得的bytearray預設讀寫指標位置在最末,讀取之前需要重置

mbuf.position = bbuf.position = 0; 

// 每個畫素由四個位元組組成,因此下面迴圈是對每個畫素的每個顏色分量依次處理的

for (i in 0...mbuf.length)  else if (mb > 100 && mb < 130)  else 

}obuf.position = 0; // 用輸出位元組陣列建立新位圖前別忘了要重置讀寫指標位置

bmp.setpixels(new rectangle(0, 0, width, height), obuf);

*************** 第二種方法,使用操作符 ***************=

var mbuf = mask.getpixels(new rectangle(0, 0, width, height));

var bbuf = bmp.getpixels(new rectangle(0, 0, width, height));

#if flash

var obuf = new bytearray();

obuf.length = mbuf.length;

#else

var obuf = new bytearray(mbuf.length);

#end

for (i in 0...mbuf.length)  else if (mb > 100 && mb < 130)  else 

}bmp.setpixels(new rectangle(0, 0, width, height), obuf);

陣列中逆序對

題目 在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。例如 給定陣列 則有 5,3 5,1 8,3 8,1 3,1 這5個逆序對。問題分析 我採用兩種方法來解決這個問題 1 考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小...

談談對 NIX中對system 函式的理解

如在 programming perl 中對system 函式的說明,本函式執行任何系統中的程式並返回該程式的退出狀態 而不是它的輸出。要捕獲命令列上的輸出,應該用反引號或者qx 因為system和反引號阻塞sigint及sigquit,所以向那些正在這樣執行的程式傳送這些訊號之一 比如通過cont...

webpack 對 css 壓縮中對字首的處理

在 vue cli 建立的專案中,用預設的 webpack 配置對專案打包後,發現 css 檔案中樣式的字首有所缺失,例如 flex 這個應該有字首的屬性卻沒有 display webkit flex webkit flex 1 導致樣式在 iphone 6s plus 上出現了相容問題。postc...