gpt4 book ai didi

c++ - C/C++嵌入python模块PIL,python函数想要返回所有像素数据,但我为什么不能?

转载 作者:行者123 更新时间:2023-11-28 07:57:44 25 4
gpt4 key购买 nike

添加嵌入python的c/c++代码。所有问题都在 C 代码中,我不知道如何获取像素值。

python 代码:

import Image

format = ""
mode = ""
size = ""
data = list()

def getImage(file):
im = Image.open(file)
global format
global mode
global size
global data
format = im.format
mode = im.mode
size = im.size

width, height = im.size

for x in range(0, height):
for y in range(0, width):
data.append(im.getpixel((x,y)))
return None

在 C/C++ 代码中我得到的数据长度是0,这两个for循环有什么问题吗?

void loadImage(char *file) {
Image* img = NULL;
Py_Initialize();
if ( !Py_IsInitialized() ) {
std::cerr<<"Python initalize failed.\n";
return NULL;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

PyObject *pName, *pModule, *pFunc, *pArgs;
pName = PyString_FromString("loadImage");
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if ( !pModule ) {
PyErr_Print();
std::cerr<<"import loadImage module faild, please confirm where the file 'loadImage.py' is.\n";
return NULL;
}
pFunc = PyObject_GetAttrString(pModule, "getImage");
if ( !pFunc ) {
PyErr_Print();
std::cerr<<"Can't find method getImage in loadImage module.\n";
return NULL;
}

pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", file));
PyObject_CallObject(pFunc, pArgs);

PyObject *pFormat, *pMode, *pSize, *pData, *pSeq, *pPixel;

pFormat = PyObject_GetAttrString(pModule, "format");

pMode = PyObject_GetAttrString(pModule, "mode");

pSize = PyObject_GetAttrString(pModule, "size");

if ( !PyTuple_Check(pSize) ) {
std::cerr<<"pSize is not tupple object.\n";
return NULL;
}

pData = PyObject_GetAttrString(pModule, "data");
if ( !pData ) {
std::cerr<<"pData is null.\n";
return NULL;
}
if ( !PyList_Check(pData) ) {
std::cerr<<"pData is not list object.\n";
return NULL;
}

int n = PyList_GET_SIZE(pData);
std::cerr<<n<<"\n";

Py_DECREF(pData);
Py_DECREF(pFunc);
Py_DECREF(pModule);
Py_DECREF(pArgs);

std::cerr<<"Py_DECREF over.\n";
}

我得到 pData(is n) 的长度是 0。

最佳答案

好吧,您的代码实际上可以用一行代码替换:

data = list(Image.open(file).getdata())

Image 对象的getdata 方法逐行返回打包到列表中的像素。如果您需要按列优先顺序(正如您正在做的那样)使用它们,请首先应用 .transpose 和适当的参数。结果仍然比遍历所有像素更快更简单。

关于c++ - C/C++嵌入python模块PIL,python函数想要返回所有像素数据,但我为什么不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12327171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com