2017-12-07 6 views
1

私はPythonを使用しています。もちろん、大きなイメージのすべてのピクセルを非常に素早くループすることはできません。したがって、私はC DLLを延期します。どのようにsip.voidptr(QImage.constBits())からctypes voidまたはcharポインタに移動しますか?

は、私はこのような何かをしたい:私はビットを変更する必要はありません

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

しかし、このライン imgPtr = c_void_p(IMG) yelds

builtins.TypeError: cannot be converted to pointer

。この分野でジェダイの方法を教えてください。 here述べたように

答えて

2

c_void_pdocumentation

The constructor accepts an optional integer initializer.

だからあなたはそのコンストラクタにsip.voidptr.__int__()メソッドの戻り値を渡すc_void_pを構築することができるはずと言い

returns the address as an integer

ながらsip.voidptr.__int__()方法:

imgPtr = c_void_p(img.__int__()) 

私はこの方法で、このソリューションをテストした:などの機能を正常に動作

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)) 

#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

おかげで、あなたは救世主です! –

関連する問題