2014-01-29 42 views
0

我正在處理大型圖像陣列,所以我已經打包了它。要訪問數組中的像素,我已經實現了兩種方法。Woking with Packed Arrays,access data

def get_p(a) 
    data=a.unpack('S9s') 
end 
def put_p(array,index_a,value) 
    index=index_a[0] 
    k=array.unpack('S9s') 
    k[index]=value 
    k.pack('S9s') 
end 

它的工作原理,但我想知道是否有更優雅的方式來做到這一點。使我的代碼看起來不同於我的標準數組函數。

If get_p(image_data[i][j+1])[BLOB]==0 

VS

if image_data[i][j+1][BLOB]==0 

而且,不知道是否有人關心,但解包似乎並沒有被記錄任何地方,我很幸運,在這裏找到一個參考,但它花了一些時間。

回答

2

你可以一個瞭解創建類,如:

class PackedArray 

    def initialize(array) 
    @packed_array = array.pack('S9s') 
    end 

    def [](key) 
    data = @packed_array.unpack('S9s') 
    data[key] 
    end 

    def []=(key, val) 
    k = @packed_array.unpack('S9s') 
    k[key]=val 
    @packed_array = k.pack('S9s') 
    end 
end 

然後,這個類的一個實例,填補你的image_data[i][j]。例如。

for i in [0..image_data.size] 
    for j in [0..image_data[i].size] 
    image_data[i][j] = new PackedArray(image_data[i][j]) 
    end 
end 

最後,你可以簡單地使用:

if image_data[i][j+1][BLOB] == 0 

無需包裝/手動拆包。

+0

不錯,很乾淨,明天我會試試 – bobbdelsol

+0

好的,我終於回到了這裏。我花了一段時間找到所有我打包/解包的地方並修復它們。但這項工作非常出色。我結束了這樣的初始化 @ image_data = Array.new(rows){Array.new(columns,PackedArray.new)} 然後我像這樣初始化。 DEF初始化 陣列= Array.new(CHANNELS,0) @ packed_array = array.pack( 'S9S') 端 但所有在所有的碼是更嚴格和cleanner – bobbdelsol

+0

想我提到,當我由於對數組元素的賦值不屬於對象,所以我得到了混疊缺陷的變化。所以我的第一個clean pass創建了一個mxn數組,指向同一個對象:)。我將元素分配給PackedArray對象,而不使用dup來確保它是副本。 – bobbdelsol