Frage

EDIT: Bei meiner ursprünglichen Frage Re-Lektüre wurde mir klar, sehr schnell, dass es war sehr schlecht formuliert, mehrdeutig, und zu verwirrend, immer eine anständige Antwort zu bekommen. Das ist, was ich für hineilend eine Frage am Ende meiner Mittagspause zu bekommen. Hoffentlich wird dies klarer sein:

Ich versuche, eine einfache C-Struktur zu Python (3.x) als PyBuffer zu, so kann ich ein MemoryView daraus abrufen. Die Struktur I aussetzen möchte, ist ähnlich wie folgt aus:

struct ImageBuffer {
    void* bytes;
    int row_count;
    int bytes_per_row;
};

und es ist mein Wunsch, der Drehbuchschreiber zu ermöglichen, auf die Daten zuzugreifen, wie so:

img_buffer = img.get_buffer()
img_buffer[1::4] = 255 # Set every Red component to full intensity

Leider ist die vorhandene Dokumentation über die C-API für diese Strukturen ziemlich spärlich ist, selbst widersprüchlich an Orten, und völlig falsch, in anderen als solche habe ich nicht (dokumentierte Funktion Signaturen nicht mit denen in den Headern usw. entsprechen) eine sehr gute Vorstellung darüber, wie dies am besten aussetzen. einschließlich Außerdem würde Ich mag Libs Dritten vermeiden Funktionalität zu erreichen, die einen Teil der Kern Libs sein sollten, aber es fühlt sich für mich wie die PyBuffer Funktionalität noch ziemlich unreif ist, und vielleicht so etwas wie NumPy wäre eine bessere Wahl sein.

Hat jemand einen Rat dazu?

War es hilfreich?

Lösung

Der Satz von Methoden zu implementieren, so dass Ihr Erweiterungstyp des Puffer Protokoll unterstützt hier beschrieben wird: http://docs.python.org/3.1/c-api/typeobj.html#buffer-object-structures

Ich erkennen, dass die Dokumentation ziemlich rau ist, so dass der beste Rat, den ich geben kann, ist aus einer bestehenden Implementierung des Puffer API von C-Typ zu starten, zum Beispiel bytesobject.c oder bytearrayobject.c in dem offiziellen Python-Quellcode .

Beachten Sie jedoch, dass das Puffer-Protokoll nicht den Zugriff auf High-Level-Notationen nicht geben, wie die, die Sie zitiert:. img_buffer[1::4] = 255 wird auf einem memoryview Objekt nicht funktionieren

Edit: um genauer zu sein, memoryviews einige Arten von Schichtzuordnung unterstützen, aber nicht alle von ihnen. Auch sind sie nicht „smart“ genug, um zu verstehen, dass 255 zu einer Scheibe Zuordnung tatsächlich bedeutet, dass Sie den Byte-Wert wiederholt werden sollen. Beispiel:

>>> b = bytearray(b"abcd")
>>> m = memoryview(b)
>>> m[0:2] = b"xy"
>>> b
bytearray(b'xycd')
>>> m[0:2] = 255
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' does not support the buffer interface
>>> m[0:2] = b"x"
Traceback (most recent call last):
  File "", line 1, in 
ValueError: cannot modify size of memoryview object
>>> m[0::2] = b"xy"
Traceback (most recent call last):
  File "", line 1, in 
NotImplementedError
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top