मुझे मिल गया है कि एक जनहित याचिका छवि लेता है और एक ctypes सरणी में बदल देता है ctypes करने के लिए एक सी समारोह के लिए बाहर पारित करने के लिए स्ट्रिंग (या टपल) में परिवर्तित:कुशलतापूर्वक सरणी
w_px, h_px = img.size
pixels = struct.unpack('%dI'%(w_px*h_px), img.convert('RGBA').tostring())
pixels_array = (ctypes.c_int * len(pixels))(*pixels)
लेकिन मैं काम कर रहा हूँ बड़ी छवियों के साथ, और अनपॅकिंग कि फ़ंक्शन तर्कों में कई आइटम उल्लेखनीय रूप से धीमे लगते हैं। उचित गति प्राप्त करने के लिए मैं क्या कर सकता हूं सबसे सरल बात क्या है?
मैं केवल एक मध्यवर्ती चरण के रूप में एक टुपल में परिवर्तित हो रहा हूं, इसलिए यदि यह अनावश्यक है, तो बेहतर है। ,
# dylib in MacOSX, cdll.wincrt in Win, libc.so.? in Unix, ...
clib = ctypes.CDLL('libc.dylib')
_ = clib.memcpy(pixarray, im.tostring(), w_px * h_px * 4)
memcpy की वापसी मान एक पते आप के बारे में परवाह नहीं है:
नहीं है कार्य करें: के रूप में @Mu मन एक टिप्पणी में बताते हैं, बाद टुकड़ा उपयोगी मंच पर निर्भर जाना आवश्यकता के बिना ctypes.memmove उपयोग करने के लिए
clib
पता लगाना सरल किया जा सकता भी '(ctypes.c_int * n) .from_buffer', जिसे आप स्ट्रिंग के साथ उपयोग कर सकते हैं। मैं अभी भी पीआईएल 'छवि' को एक स्ट्रिंग में बदलने के तत्काल चरण के बिना इसका उपयोग करने का प्रयास कर रहा हूं। – Kos