Exporting a c++ buffer type.
Hi, I'm porting a lib to Python-3. This code works with Python-2 ------------------------------------------------------ const std::string Image::getExifThumbnailData() { Exiv2::DataBuf buffer = _getExifThumbnail()->copy(); // Copy the data buffer in a string. // First allocate the memory for the whole string... std::string data = std::string(buffer.size_, ' '); // ... then fill it with the raw data. for(unsigned int i = 0; i < buffer.size_; ++i) { data[i] = buffer.pData_[i]; } return data; ----------------------------------------------------- The object Exiv2::DataBuf contain the pixel's values of an image [R,G,B,R,G,B,...] It is described here (1) With Python-3 I get this error: buf_ = self._metadata._image._getExifThumbnailData() TypeError: No to_python (by-value) converter found for C++ type: std::vector<char, std::allocator<char> > Then, I've made some tests with memoryView, like this: ----------------------------------------------------- boost::python::object Image::getExifThumbnailData() { Exiv2::DataBuf buffer = _getExifThumbnail()->copy(); Py_ssize_t size = buffer.size_; Py_buffer py_buffer; PyObject exporter; int res = PyBuffer_FillInfo(&py_buffer, &exporter, &buffer.pData_, size, true, PyBUF_CONTIG_RO); if (res == -1) { PyErr_Print(); exit(EXIT_FAILURE); } boost::python::object memoryView(boost::python::handle<> (PyMemoryView_FromMemory (&exporter, size, PyBUF_READ))); return memoryView; } ---------------------------------------------------- But that doesn't compile. src/exiv2wrapper.cpp: In member function ‘boost::python::api::object exiv2wrapper::Image::getExifThumbnailData()’: src/exiv2wrapper.cpp:504:65: error: cannot convert ‘PyObject* {aka _object*}’ to ‘char*’ for argument ‘1’ to ‘PyObject* PyMemoryView_FromMemory(char*, Py_ssize_t, int)’ (&exporter, size, PyBUF_READ))); (1) DataBuf: http://www.exiv2.org/doc/classExiv2_1_1DataBuf.html Regards, Vincent
participants (1)
-
Vincent Vande Vyvre