C# пиксельный формат изображения только альфа

Что именно System.Drawing.Imaging.PixelFormat.Alpha представляет кого-либо? Похоже, это похоже на OpenGL.GL_APHA, который устарел.

Я пытаюсь преобразовать строку кода Java, которая выглядит следующим образом:

  TextureData textureData = new TextureData(GL.GL_ALPHA, size, size, 0, GL.GL_ALPHA,
            GL.GL_UNSIGNED_BYTE, false, false, false, textureBytes.rewind(), null);

к его представлению C#.

Я определил класс для инкапсуляции формата Pixel, чтобы я мог переключаться между DirectX и OpenGL следующим образом:

  public class PixelFormat
    {
        public static readonly PixelFormat R8 = new PixelFormat(8, 0, DataType.UnsignedByte);
        public static readonly PixelFormat R5G5B5A1 = new PixelFormat(5, 1, DataType.UnsignedShort);

        public bool IsColorPremultipliedByAlpha { get; private set; }
        public bool IsCompressed { get; private set; }
        public int Format { get; set; }
        public double Gamma { get; private set; }
        public int BitsPerPixel { get { return NumberOfRedBits + NumberOfGreenBits + NumberOfBlueBits; }}

        public ushort NumberOfRedBits { get; private set; }
        public ushort NumberOfGreenBits { get; private set; }      
        public ushort NumberOfBlueBits { get; private set; }
        public ushort NumberOfAlphaBits { get; private set; }
        public int IndexIntoColorPallete { get; set; }
        public bool IsIndexed { get; set; }
        public DataType DataType { get; set; }
        public IndexedColorFormat IndexedColorFormat { get; set; }

        public OpenglPixelAttributes GetOpenglConstant()
        {
            return null;
        }      
    }    

Я хотел бы представить System.Drawing.Imaging.PixelFormat.Alpha или его двоюродного брата OpenGL, используя экземпляр моего класса PixelFormat.

Есть идеи?

1 ответ

Решение

GL_ALPHA на самом деле просто сводится к однокомпонентной текстуре, где под единственным компонентом понимается альфа-канал. Если вы храните данные изображения в не устарелом внутреннем формате (например, GL_R8), вы можете написать свой собственный Get метод, который делает преобразование в RGBA (при условии, что вам это действительно нужно).

Дело в том, что я нигде не вижу в вашем предложенном PixelFormat класс прямо сейчас, который фактически предоставляет внутреннее представление ваших данных. О самом близком, что этот код когда-либо имеет отсутствие GL_ALPHA разница - это возможность запрашивать хранилище для каждого компонента.


Чтобы ответить на ваш оригинальный вопрос, GL_ALPHA представляет это:

vec4 (0.0, 0.0, 0.0, alpha)

Если вы хотите использовать GL_R8 формат изображения для замены GL_ALPHAВы можете сделать это в шейдере:

vec4 (0.0, 0.0, 0.0, red)

Вы также можете легко сделать то же самое на стороне процессора, если вам когда-нибудь понадобится вернуть изображение RGBA из вашего альфа-пиксельного формата. В противном случае просто верните массив пикселей, где RedBits = 0, GreenBits = 0, BlueBits = 0 а также AlphaBits = ..., Это будет массивом альфа-значений, и хотя GL будет рассматривать каждый из этих пикселей как компонент красного цвета, здесь это вряд ли имеет значение.

TL; DR: будет лишь несколько мест, где факт, что современный GL интерпретирует однокомпонентные форматы изображения как красный, имеет значение. Поскольку в настоящее время программируется достаточно конвейера, нет смысла специально обрабатывать GL-форматы альфа-изображений. То же самое относится и к яркости, все это может быть достигнуто с помощью шейдеров в шейдере.

Другие вопросы по тегам