Чтение альфы с каждого пикселя в 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,
Другие вопросы по тегам