#-------------------------------------------------------------- # # PyGUI - NumPy interface - Windows # #-------------------------------------------------------------- from numpy import ndarray, uint8 from GUI import GDIPlus as gdi from GUI import Image def image_from_ndarray(array, format, size = None): """ Creates an Image from a numpy ndarray object. The format may be 'RGB' or 'RGBA'. If a size is specified, the array will be implicitly reshaped to that size, otherwise the size is inferred from the first two dimensions of the array. """ if array.itemsize <> 1: raise ValueError("Color component size must be 1 byte") if size is None: shape = array.shape if len(shape) <> 3: raise ValueError("Array has wrong number of dimensions") height, width, pixel_size = shape if pixel_size <> len(format): raise ValueError("Last dimension of array does not match format") else: width, height = size pixel_size = len(format) data_size = array.size if data_size <> width * height * pixel_size: raise ValueError("Array has wrong shape for specified size and format") shape = (height, width, pixel_size) array = array.reshape(shape) swapped = ndarray(shape, uint8) swapped[..., 0] = array[..., 2] swapped[..., 1] = array[..., 1] swapped[..., 2] = array[..., 0] if pixel_size == 4: fmt = gdi.PixelFormat32bppARGB swapped[..., 3] = array[..., 3] else: fmt = gdi.PixelFormat24bppRGB data = swapped.tostring() bitmap = gdi.Bitmap.from_data(width, height, fmt, data) image = Image.__new__(Image) image._win_image = bitmap image._data = data return image