你如何从 sip.voidptr (QImage.constBits()) 到 ctypes void 或 char 指针?

Posted

技术标签:

【中文标题】你如何从 sip.voidptr (QImage.constBits()) 到 ctypes void 或 char 指针?【英文标题】:How do you go from a sip.voidptr (QImage.constBits()) to a ctypes void or char pointer? 【发布时间】:2017-12-07 07:28:52 【问题描述】:

我使用的是 python,当然你不能快速遍历大图像的每个像素,所以我使用 C DLL。

我想做这样的事情:

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

但是这一行 imgPtr = c_void_p(img) 产量

builtins.TypeError: 无法转换为指针

我不需要修改这些位。请教我你在这方面的绝地之道。

【问题讨论】:

【参考方案1】:

如here、sip.voidptr.__int__() 方法所述

以整数形式返回地址

c_void_p documentation 说

构造函数接受一个可选的整数初始化器。

所以你应该能够构建一个c_void_p,将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");
    

【讨论】:

谢谢,你是救世主!

以上是关于你如何从 sip.voidptr (QImage.constBits()) 到 ctypes void 或 char 指针?的主要内容,如果未能解决你的问题,请参考以下文章

从 QBytearray 创建 QImage

如何在Python 3中将QImage(QPixmap)转换为PIL图像?

从 QImage 创建 QTextureImage

qt中qimage中load函数老是可能是啥原因

使用 QT-=gui 时替代 QImage

如何检测 QImage 是不是为动画?