Хотя ваш метод упаковки данных с планарным перемежением в данные с пиксельным перемежением будет работать, вы почти наверняка обнаружите, что метод Numpy во много десятков раз быстрее.
Во-первых, я синтезирую Ваши входные данные:
import numpy as np
# Height, width and bytes per image channel
h,w = 100,256
bpc = h * w
# Now make the first (red) plane = 255, the second (green) plane = 127 and the final (blue) plane = 0
img = bytes(b"\xff"*bpc) + bytes(b"\x7f"*bpc) + bytes(b"\x00"*bpc)
Итак, img
теперь должно быть репрезентативным изображением оранжевого цвета 100x256, которое вы можете получить. Затем я чередую данные и создаю PIL-изображение, например, с Numpy:
from PIL import Image
# Make a Numpy array for each channel's pixels
R = np.frombuffer(img, dtype=np.uint8, count=bpc).reshape((h,w))
G = np.frombuffer(img, dtype=np.uint8, count=bpc, offset=bpc).reshape((h,w))
B = np.frombuffer(img, dtype=np.uint8, count=bpc, offset=2*bpc).reshape((h,w))
# Interleave the pixels from RRRRRRGGGGGGBBBBBB to RGBRGBRGBRGBRGB
RGB = np.dstack((R,G,B))
# Make PIL Image from Numpy array
pImage = Image.fromarray(RGB)
, что занимает 30 микросекунд на моей машине, по сравнению с 7 миллисекундами с петлями for
, так что в 230 раз быстрее.
Ключевые слова : Python, Numpy, PIL, обработка изображений, чередование, чередование, обратное чередование, плоскостное по пикселям, по плоскости, упаковать, распаковать.