Note that there are some explanatory texts on larger screens.

plurals
  1. POPixel manipulation with PIL.Image and ctypes
    text
    copied!<p>I have a C function that does some pixel manipulation on a raw 2D array of 8 bit RGB values. I get the response in a <code>c_ubyte</code> array. My code looks roughly like this:</p> <pre><code>from ctypes import cdll, CDLL, Structure, byref, c_utype, c_uint # get a reference to the C shared library cdll.loadLibrary(path_to_my_c_lib) myclib = CDLL(path_to_my_c_lib) # define the ctypes version of the C image that would look something like: # struct img { # unsigned char data[MAX_IMAGE_SIZE]; # unsigned int width; # unsigned int height; # } class Img(Structure): _fiels_ = [ ('data', c_ubyte * MAX_IMAGE_SIZE), ('width', c_uint), ('height', c_uint), ] # create a blank image, all pixels are black img = Image() img.width = WIDTH img.height = HEIGHT # call the C function which would look like this: # void my_pixel_manipulation_function(struct img *) # and would now work its magic on the data myclib.my_pixel_manipulation_function(byref(img)) </code></pre> <p>At this point I'd like to use PIL to write the image to file. I currently use the following code to convert the byte data to image data:</p> <pre><code>from PIL import Image s = ''.join([chr(c) for c in img.data[:(img.width*img.height*3)]]) im = Image.fromstring('RGB', (img.width, img.height), s) # now I can... im.save(filename) </code></pre> <p>This works but seems awfully inefficient to me. It takes 125ms for a 592x336 image on a 2.2GHz Core i7. It seems rather silly to iterate over the entire array and do this ridiculous string join when Image could probably grab directly from the array.</p> <p>I tried looking for ways to cast the <code>c_ubyte</code> array to a string or maybe use <code>Image.frombuffer</code> instead of <code>Image.fromstring</code> but couldn't make this work.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload