Ich habe eine Bibliothek, die eine sehr einfache C-Bildstruktur hat:
%Vor% Ich habe diese Bibliothek und diese Struktur nicht erstellt, daher kann ich sie nicht ändern. Ich bin verantwortlich für das Wrapping dieser Bibliothek für Python mit SWIG. Der Python-Wrapper muss in der Lage sein, ein PIL-Bild aufzunehmen und in diese Struktur zu konvertieren. Hier ist, wie ich es gerade mache (mit einem SWIG %inline%
):
Und dann auf der Python-Wrapper-Seite, hier sieht es so aus:
%Vor%Erstaunlicherweise funktioniert das aber, wie Sie vielleicht vermutet haben, es ist unglaublich langsam, wenn Sie selbst mit mäßig großen Bildern arbeiten. Ich weiß mit SWIG die richtige Art, Dinge zu tun, ist eine Typkarte zu verwenden, aber das würde bedeuten, dass ich mich in die C API von PIL einarbeiten würde, und ich hatte gerade keine Zeit, dies zu tun .
Was sind meine Optionen in Bezug auf die Geschwindigkeit? Gibt es schnellere Möglichkeiten, die Pixeldaten von einem PIL-Bild zu dieser einfachen Bildstruktur zu übertragen? Hat jemand das schon gemacht und meine Google-Fähigkeiten sind so schlecht? Bin ich nur knochig und werde bald die Interna von PIL lernen müssen?
Danke.
PILs Image.tostring()
gibt eine Zeichenfolge mit den genauen Daten zurück, die Sie für imgdata
benötigen. Die Typemap, die ich verwendet habe, ist ziemlich einfach, aber nicht perfekt, was ich unten notiere. Hier ist der Beispielcode, den ich unter Windows erstellt habe und der für mich funktioniert hat:
Mit diesem schnellen Beispiel habe ich nicht bestimmt, wie die typemap die Referenzzahl des string-Objekts korrekt erhöhen sollte. Beachten Sie, dass der obige Code abstürzen könnte, wenn der folgende Code verwendet würde:
%Vor% Das PyString_AsStringAndSize
der aktuellen typemap gibt einen direkten Zeiger auf den Puffer des PyString-Objekts zurück, erhöht jedoch nicht die Referenzzahl für das Objekt. Es kann Müll gesammelt werden, bevor some_func
ausgeführt wird (und war für mich, Python abstürzen). Die Zuweisung zu s
behält einen Verweis auf die Zeichenfolge und verhindert Probleme. Die Typenkarte sollte den Puffer kopieren, aber Sie haben nach Geschwindigkeit gesucht, damit dieser Hack das sein könnte, was Sie wollen.
Wie wäre es mit Ctypes ? Es ermöglicht Ihnen, direkten Zugriff auf c-Strukturen zu haben, also müssen Sie kein Python-Äquivalent der Struktur erstellen, und Sie sollten auch in der Lage sein, einen memcpy-Vorgang auszuführen (was schneller wäre als pixelweise zu kopieren).
Tags und Links python image python-imaging-library swig