2010-05-29 16 views
5
कोड

मुझे मिल गया है कि एक जनहित याचिका छवि लेता है और एक 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 की वापसी मान एक पते आप के बारे में परवाह नहीं है:

+0

नहीं है कार्य करें: के रूप में @Mu मन एक टिप्पणी में बताते हैं, बाद टुकड़ा उपयोगी मंच पर निर्भर जाना आवश्यकता के बिना ctypes.memmove उपयोग करने के लिए clib पता लगाना सरल किया जा सकता भी '(ctypes.c_int * n) .from_buffer', जिसे आप स्ट्रिंग के साथ उपयोग कर सकते हैं। मैं अभी भी पीआईएल 'छवि' को एक स्ट्रिंग में बदलने के तत्काल चरण के बिना इसका उपयोग करने का प्रयास कर रहा हूं। – Kos

उत्तर

7

आप पहली बार एक गैर-आरंभिकृत सरणी का निर्माण कर सकते हैं:

pixarray = (ctypes.c_int * (w_px * h_px))() 

और फिर इसे में छवि के सामग्री की प्रतिलिपि इसलिए मैंने इसे "सिंगल अंडरस्कोर" नाम देने के लिए "निगल लिया" (जिसे सम्मेलन से "मुझे इस पर कोई परवाह नहीं है" ;-)।

संपादित: सिर्फ

_ = ctypes.memmove(pixarray, im.tostring(), w_px * h_px * 4) 
+3

ऐसा लगता है कि ctypes.memmove एक प्लेटफॉर्म-स्वतंत्र तरीके से वही काम करता है: ctypes.memmove (pixarray, im.tostring(), w_px * h_px * 4) –

+0

@Mu, उत्कृष्ट, +1 और धन्यवाद! मुझे तदनुसार जवाब संपादित करने दें। –

+0

ओह, ऐसा लगता है कि आउटपुट में एंडियननेस समस्याएं हैं। कोई सुझाव? –

संबंधित मुद्दे