2017-12-07 7 views
1

Ich benutze Python und natürlich können Sie nicht sehr schnell jedes Pixel eines großen Bildes durchlaufen, also setze ich auf eine C DLL.Wie gehst du von einem sip.voidptr (QImage.constBits()) zu einem ctypes void oder Char Zeiger?

möchte ich so etwas wie dies zu tun:

img = QImage("myimage.png").constBits() 
imgPtr = c_void_p(img) 
found = ctypesDLL.myImageSearchMethod(imgPtr, width, height) 

Aber diese Linie imgPtr = c_void_p (img) yelds

builtins.TypeError: cannot be converted to pointer

Ich brauche nicht die Bits zu ändern. Bitte bring mir deine Jedi-Wege in diesem Bereich bei.

Antwort

2

Wie bereits erwähnt here, sip.voidptr.__int__() Methode

returns the address as an integer

während c_void_pdocumentation sagt

The constructor accepts an optional integer initializer.

So sollten Sie in der Lage sein, einen c_void_p Bestehen der Rückgabewert von sip.voidptr.__int__() Methode an den Konstruktor zu bauen:

imgPtr = c_void_p(img.__int__()) 

Getestet habe ich diese Lösung auf diese Weise:

from PyQt5 import QtGui 
from ctypes import * 

lib = CDLL("/usr/lib/libtestlib.so") 

image = QtGui.QImage("so.png") 
bits = image.constBits() 
bytes = image.bytesPerLine() 
lib.f(c_void_p(bits.__int__()), c_int(image.width()), c_int(image.height()), c_int(bytes)) 

, die mit einer Funktion funktioniert wie:

#include <cstdio> 
#include <QImage> 
extern "C" { 

    void f(unsigned char * c, int width, int height, int bpl) 
    { 
     printf("W:%d H:%d BPL:%d\n", width, height, bpl); 
     QImage image(c, width, height, bpl, QImage::Format_RGB32); 
     image.save("test.bmp"); 
    } 
} 
+0

Dank, Sie sind ein Retter! –

Verwandte Themen