Image.frombuffer (режим, размер, данные) => изображение
(Новое в PIL 1.1.4).Создает память изображений из данных пикселей в строковом или буферном объекте, используя стандартный «сырой» декодер.В некоторых режимах память изображений разделяет память с исходным буфером (это означает, что изменения в исходном объекте буфера отражаются на изображении).Не все режимы могут совместно использовать память;поддерживаемые режимы включают «L», «RGBX», «RGBA» и «CMYK».Для других режимов эта функция ведет себя как соответствующий вызов функции fromstring.
Я не уверен, что означает "L", но "RGBA" означает Red-Green-Blue-AlphaИтак, я предполагаю, что RGBX эквивалентен RGB (правка: после тестирования это не так)?CMYK - это Cyan-Magenta-Yellow-Kelvin, который является другим типом цветового пространства.Конечно, я предполагаю, что если вы знаете о PIL, вы также знаете о цветовых пространствах.Если нет, то у Википедии есть отличная статья.
Что это действительно означает (если этого недостаточно): значения пикселей будут кодироваться по-разному для каждого цветового пространства.В обычном RGB у вас есть 3 байта на пиксель - 0-254, 0-254, 0-254.Для Альфы вы добавляете еще один байт к каждому пикселю.Если вы декодируете изображение RGB как RGBA, вы в конечном итоге будете считать пиксель R справа от первого пикселя в качестве альфы, что означает, что вы получите пиксель G в качестве значения R.Это будет увеличиваться в зависимости от того, насколько велико ваше изображение, но это действительно заставит ваши цвета стать шаткими.Точно так же, попытка прочитать изображение в кодировке CMYK как RGB (или RGBA) заставит ваше изображение выглядеть совсем не так, как должно.Например, попробуйте это с изображением:
i = Image.open('image.png')
imgSize = i.size
rawData = i.tostring()
img = Image.fromstring('L', imgSize, rawData)
img.save('lmode.png')
img = Image.fromstring('RGB', imgSize, rawData)
img.save('rgbmode.png')
img = Image.fromstring('RGBX', imgSize, rawData)
img.save('rgbxmode.jfif')
img = Image.fromstring('RGBA', imgSize, rawData)
img.save('rgbamode.png')
img = Image.fromstring('CMYK', imgSize, rawData)
img.save('rgbamode.tiff')
И вы увидите, что делают разные режимы - попробуйте его с различными входными изображениями: png с альфа, png без альфа, bmp, gifи JPEGВообще-то, это забавный эксперимент.