最近在寫星期五型態影像學的作業,其中有用到老師教的HSI色彩空間(Color space),而因為每一張圖的像素(pixel)有為寬X高,所以很自然的會使用到二維陣列,這樣才能儲存每一個點(pixel) 的hsi資訊,而現在的問題來了,如果我已經把一份RGB色彩空間,轉換成HSI,但是我需要兩份HSI的內容怎麼辦?

 

  一般的情況會用Clone()方法來複製一份,而我在使用hsi[y,x].clone()的時候發現他會修改原來陣列的內容值...

 

byte[,] RGB = new RGB[height,width];

HSI[,] hsi = new HSI[height,width];

HSI[,] newHSI = hsi.clone(); // 從hsi複製一份到newHSI

 

  如果更改了newHSI中的欗位的值,他也會同時修改hsi欄位的值,這並不是我們想要的,在數度的google之後,發現他是所謂的淺層複製(表層複本、shadow copy),必須使用深層複製(深層複本、deep copy)才能達到我們想要的,後來找到了一個方法是用序列化的方式來達到deep copy,不過在我的程式裡使用序列化與解序列化發現他所耗費的時間比再從RGB轉hSI還要久....,後來只好用最基本的方法用雙層迴圈一個一個複製過去...

 

  像是HSI[,] 這樣的自訂型別,屬於參考型別(reference type),而像是byte[,]則是屬於實值型別(value type),根據以下的實驗,Clone()方法用在實值型別,他會真正的複製一份資料到新的陣列中,而用在參考型別上則會參考到原本的型別資料,所以實值型別可以安心使用Clone(),而參考型別可能沒辦法使用Clone來進行複製了(我被clone耗費好多時間在debug)。

 

※ 如果觀念上有錯還請留言告知^^

 

測試用的程式碼下載:實值型別與參考型別Clone差異

arrow
arrow
    全站熱搜

    小賢 發表在 痞客邦 留言(0) 人氣()