Чтение альфы из каждого пикселя в Blender

Кажется, у меня проблема с чтением значений RGBA пикселей (особенно альфа-значения) из изображения PNG в Blender (с python).

Я делаю следующее:

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? Может быть, я использую совершенно неправильный подход?


person Vegeta_DTX    schedule 01.10.2014    source источник


Ответы (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.
person Random Citizen    schedule 02.10.2014
comment
Random Citizen, большое спасибо за ваш ответ, моя проблема была в случае 2, который вы перечислили :) Я думаю, я был убежден, что мой png был прозрачным, но он не содержал никаких данных о прозрачности, он был просто черно-белым . Я также узнал от вас кое-что еще более важное, а именно то, что Blender считает пиксели от левого нижнего угла к правому верхнему, если бы я этого не прочитал, это, вероятно, стало бы моей следующей проблемой, и я бы разбил себе голову. снова об этом :) Теперь мне понятно, почему мои результаты были такими непредсказуемыми... - person Vegeta_DTX; 06.10.2014