2010-03-22 31 views
5

Mam do czynienia z buforami obrazu, i chcę mieć możliwość uzyskania dostępu do danych kilka linii w moim obrazie do analizy z biblioteką c. Stworzyłem 8-bitowy bufor pikseli w Pythonie za pomocą create_string_buffer. Czy istnieje sposób, aby uzyskać wskaźnik do lokalizacji w tym buforze bez ponownego tworzenia nowego bufora? Moim celem jest analizowanie i zmienianie danych w tym buforze w porcjach, bez konieczności tworzenia wielu buforów i kopiowania danych.ctypes i manipulacja wskaźnikami

W tym przypadku biblioteka C wykonuje całą operację buforowania, więc nie muszę zmieniać wartości w buforze przy użyciu Pythona. Po prostu muszę dać mojej funkcji C dostęp do danych w buforze.

Odpowiedz

8

create_string_buffer daje przedmiot ctypes (tablicę znaków), a następnie byref, cytuję

Zwraca wskaźnik lekki do obj, który musi być instancją ctypes typu . offset domyślnie przyjmuje wartość zero, a musi być liczbą całkowitą, która zostanie dodana do wewnętrznej wartości wskaźnika.

Argument offset został dodany w wersji 2.6, więc jeśli utkniesz w wersji starszej, będziesz potrzebować niestety więcej pracy.

+0

Jedno jest trochę mylące, though-- Załóżmy, robię, co następuje: "buff = create_string_buffer (10)". Czy przejście "byref (buff, 3)" przebiega "& (buff [3])" lub "(& buff) + 3)"? – Chris

+0

@Chris, oba wyrażenia są równoważne - w C, 'i X [Y] == X + Y' jest tautologią dla dowolnego wskaźnika X (tablice" rozpadają się na "wskaźniki w C) i całkowitą Y. (Tutaj, elementy tablicy są po 1 bajcie, więc nie ma nawet najmniejszych wątpliwości co do "skalowania" w arytmecie wskaźnika ;-). –

+0

Zdaję sobie sprawę, że są one równoważne w C, ale nie byłem pewien, jak zareagują ctypes ... innymi słowy, czy przekazałby wskaźnik zwiększony o 3, czy wskaźnik do instancji Pythona zwiększonej o trzy lub coś dziwnego że. Jak zwykle jednak python jest inteligentny i przekazuje wskaźnik C zwiększony o trzy. Dzięki za pomoc! – Chris

0

Można również użyć ctypes.cast(buf, ctypes.c_void_p)

+0

To nie wygląda na to, że pozwala ustawić offset w buforze. Przegapiłem coś? – Chris