2010-03-22 116 views
5

我正在處理圖像緩衝區,我希望能夠訪問數據到我的圖像幾行用c庫進行分析。我使用create_string_buffer在Python中創建了我的8位像素緩衝區。有沒有辦法在不重新創建新緩衝區的情況下獲取指向該緩衝區中某個位置的指針?我的目標是以塊爲單位分析和更改該緩衝區中的數據,而無需進行大量的緩衝區創建和數據複製。ctypes和指針操作

在這種情況下,最終,C庫正在完成對緩衝區的所有操作,所以實際上我不必使用Python更改緩衝區中的值。我只需要讓我的C函數訪問緩衝區中的數據。

回答

8

create_string_buffer給你一個ctypes對象(字符數組),然後byref,我引用,

返回一個重量輕的指針到obj, 它必須是一個ctypes 類型的實例。偏移量默認爲零,並且 必須是一個整數,它將被添加到內部指針值 。

offset參數已在2.6中添加,因此如果您遇到較舊的版本,您將不幸需要更多工作。

+0

有一點是有點混亂,though--假如我做了以下內容: 「BUFF = create_string_buffer(10)」。會傳遞「byref(buff,3)」pass「&(buff [3])」或「(&buff)+ 3)」? – Chris 2010-03-22 18:30:38

+0

@Chris,這兩個表達式是等價的 - 在C中,&X [Y] == X + Y'是任何指針X(數組「衰減到C中的指針」)和整數Y的重言式。(這裏,數組的項目每個都是1個字節,所以在指針算術中對「縮放」沒有任何疑問;-)。 – 2010-03-22 20:56:26

+0

我意識到它們在C中是等價的,但我不確定ctypes會如何迴應......換句話說,它會傳遞指針加3,還是指向python實例增加3,或者是奇怪的東西那。然而,像往常一樣,python非常聰明,並且將C指針加3。謝謝您的幫助! – Chris 2010-03-30 14:31:00

0

您還可以使用ctypes.cast(buf, ctypes.c_void_p)

+0

使用'.byref()',「返回的對象只能用作外部函數調用參數」的FYI看起來好像它不讓我在緩衝區中設置偏移量。我錯過了什麼? – Chris 2010-03-22 18:26:54