Чтение альфы с каждого пикселя в Blender
Кажется, у меня проблема с чтением значений пикселей RGBA (в частности, альфа-значения) из изображения PNG в Blender (с питоном).
Я делаю следующее:
for i in range(0, len(bpy.data.images["name_of_my_png"].pixels), 4):
print(bpy.data.images["name_of_my_png"].pixels[i:i+4]);
но я никогда не получал ожидаемых результатов для каждого пикселя, который он выводит на экран одинаково - 1.0, 1.0, 1.0, 0.0
(Я предполагаю, что это значения R,G,B и A соответственно).
Я почти уверен, что png загружен в кеш блендера, и что это просто обычное png-изображение RGBA с видимыми и невидимыми частями, поэтому логически мой печатный вывод должен содержать не только некоторые изменения 1.0, 1.0, 1.0 and 0.0
постоянно для каждого пикселя...?
Может ли кто-нибудь указать мне на то, что именно я делаю не так? Как вообще прочитать данные пикселей изображения через Blender-python? Может быть, я использую совершенно неправильный подход?
1 ответ
Ваш код работает отлично (протестировано с блендером 2.71).
Есть несколько возможных объяснений, почему результат не выглядит ожидаемым:
- Перевернутый вертикально: Blender использует OpenGL для внутреннего использования. В OpenGL источник изображения находится в нижнем левом углу изображения (с осью Y, направленной вверх), а не в верхнем левом углу (с осью Y, направленной вниз), как вы, возможно, уже привыкли.
Таким образом, область печати вашего кода - это не верхний левый угол, а более левый нижний угол 4x4 вашего изображения. Проверьте, совпадает ли вывод с нижним левым углом вашего изображения. - Прозрачные пиксели не сохраняются: при сохранении файла изображения многие графические программы не сохраняют цвета в прозрачных областях. Возможно, вы захотите создать изображение размером 4x4 пикселя с помощью gimp, сохраните его в формате png и убедитесь, что
Save color values from transparent pixels
флажок. - Предварительно умноженная альфа (не причина для вашего наблюдения): некоторые алгоритмы приобретают элегантность и производительность при использовании предварительно умноженного цветового формата. Вместо отдельного
r,g,b,a
каналы, изображение сохраняется путем умножения каждого цветового канала на альфа-каналr*a, g*a, b*a, a
,